📄 crblock.tdf
字号:
INCLUDE "LPM_MULT.INC";
INCLUDE "LPM_ADD_SUB.INC";
INCLUDE "LPM_ROM.INC";
SUBDESIGN CRBLOCK
(
SYMCLK: INPUT;
IDIN[9..0]: INPUT;
QDIN[9..0]: INPUT;
PNSYNC: INPUT;
RESET: INPUT;
PLLSIN[7..0]: OUTPUT;
PLLCOS[7..0]: OUTPUT;
IDEMO[17..0]: OUTPUT;
QDEMO[17..0]: OUTPUT;
OFFSET[15..0]: OUTPUT;
TP[7..0]: OUTPUT;
TPWR: OUTPUT;
TPCLK: OUTPUT;
)
VARIABLE
ICOS[17..0]: NODE;
QSIN[17..0]: NODE;
ISIN[17..0]: NODE;
QCOS[17..0]: NODE;
COSINE[7..0]: NODE;
SINE[7..0]: NODE;
IDEMO[17..0]: NODE;
QDEMO[17..0]: NODE;
MSB[1..0]: NODE;
PD[17..0]: NODE;
OFFSET[15..0]: NODE;
CARRIER[9..0]: NODE;
DCO[19..0]: DFFE;
DCO_INPUT[19..0]: DFFE;
INTEG[25..0]: DFFE;
BUF_INTEG[25..0]: SOFT;
BEGIN
DCO[].CLK = SYMCLK;
DCO_INPUT[].CLK = SYMCLK;
INTEG[].CLK = SYMCLK;
ICOS[] = LPM_MULT(.DATAA[] = IDIN[], .DATAB[] = COSINE[])
WITH(LPM_WIDTHA = 10, LPM_WIDTHB = 8, LPM_WIDTHP = 18, LPM_WIDTHS = 10, LPM_REPRESENTATION = "SIGNED", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
QSIN[] = LPM_MULT(.DATAA[] = QDIN[], .DATAB[] = SINE[])
WITH(LPM_WIDTHA = 10, LPM_WIDTHB = 8, LPM_WIDTHP = 18, LPM_WIDTHS = 10, LPM_REPRESENTATION = "SIGNED", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
ISIN[] = LPM_MULT(.DATAA[] = IDIN[], .DATAB[] = SINE[])
WITH(LPM_WIDTHA = 10, LPM_WIDTHB = 8, LPM_WIDTHP = 18, LPM_WIDTHS = 10, LPM_REPRESENTATION = "SIGNED", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
QCOS[] = LPM_MULT(.DATAA[] = QDIN[], .DATAB[] = COSINE[])
WITH(LPM_WIDTHA = 10, LPM_WIDTHB = 8, LPM_WIDTHP = 18, LPM_WIDTHS = 10, LPM_REPRESENTATION = "SIGNED", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
IDEMO[] = LPM_ADD_SUB(.DATAA[] = ICOS[], .DATAB[] = QSIN[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
QDEMO[] = LPM_ADD_SUB(.DATAA[] = QCOS[], .DATAB[] = ISIN[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "SUB", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
MSB[] = (IDEMO[17],QDEMO[17]);
CASE MSB[] IS
WHEN 0 => PD[] = LPM_ADD_SUB(.DATAA[] = QDEMO[], .DATAB[] = -IDEMO[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
WHEN 1 => PD[] = LPM_ADD_SUB(.DATAA[] = QDEMO[], .DATAB[] = IDEMO[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
WHEN 2 => PD[] = LPM_ADD_SUB(.DATAA[] = -QDEMO[], .DATAB[] = -IDEMO[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
WHEN OTHERS => PD[] = LPM_ADD_SUB(.DATAA[] = -QDEMO[], .DATAB[] = IDEMO[])
WITH(LPM_WIDTH = 18, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
END CASE;
IF RESET == 0 THEN
BUF_INTEG[] = 0;
DCO_INPUT[].D = 0;
INTEG[].D = 0;
CARRIER[] = 128;
DCO[].D = 0;
OFFSET[] = 0;
ELSE
IF PNSYNC == 0 THEN
BUF_INTEG[25..0] = INTEG[25..0].Q+(PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD[15..3]);
DCO_INPUT[19..0].D = BUF_INTEG[25..6]+ (PD15,PD15,PD15,PD15,PD15,PD[15..1]);
ELSE
BUF_INTEG[25..0] = INTEG[25..0].Q+(PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD[15..5]);
DCO_INPUT[19..0].D = BUF_INTEG[25..6]+ (PD15,PD15,PD15,PD15,PD15,PD15,PD15,PD[15..3]);
END IF;
INTEG[25..0].D=BUF_INTEG[];
CARRIER[9..0]=DCO[19..10].Q;
DCO[19..0].D=DCO[19..0].Q+DCO_INPUT[19..0].Q;
OFFSET[]=DCO_INPUT[19..4].Q;
END IF;
COSINE[] = LPM_ROM(.ADDRESS[] = CARRIER[], .INCLOCK = NOT SYMCLK, .OUTCLOCK = NOT SYMCLK)
WITH(LPM_WIDTHAD = 10, LPM_WIDTH = 8, LPM_FILE = "PLLCOSINE.MIF")
RETURNS(.Q[]);
SINE[] = LPM_ROM(.ADDRESS[] = CARRIER[], .INCLOCK = NOT SYMCLK, .OUTCLOCK = NOT SYMCLK)
WITH(LPM_WIDTHAD = 10, LPM_WIDTH = 8, LPM_FILE = "PLLSINE.MIF")
RETURNS(.Q[]);
PLLSIN[] = (NOT SINE[7], SINE[6..0]);
PLLCOS[] = (NOT COSINE[7], COSINE[6..0]);
TP[] = (NOT SINE[7], SINE[6..0]); --用于观测恢复的NCO波形
TPCLK = SYMCLK;
TPWR = SYMCLK;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -