📄 agc.tdf
字号:
INCLUDE "LPM_ABS.INC";
INCLUDE "LPM_ADD_SUB.INC";
INCLUDE "PARALLEL_ADD.INC";
INCLUDE "LPM_MULT.INC";
INCLUDE "LPM_COMPARE.INC";
SUBDESIGN AGC
(
SYMCLK: INPUT;
PNSYNC: INPUT;
IDIN[15..0]: INPUT;
QDIN[15..0]: INPUT;
IOUT[15..0]: OUTPUT;
QOUT[15..0]: OUTPUT;
HI_LO: OUTPUT;
IABS[15..0]: OUTPUT;
QABS[15..0]: OUTPUT;
AMPLITUDE[16..0]: OUTPUT;
ERR[7..0]: OUTPUT;
ISCALED[16..0]: OUTPUT;
QSCALED[16..0]: OUTPUT;
GAIN[16..0]: OUTPUT;
UPPER: OUTPUT;
LOWER: OUTPUT;
INTEGER[16..0]: OUTPUT;
)
VARIABLE
HI_LO: NODE;
IABS[15..0]: NODE;
QABS[15..0]: NODE;
AMPLITUDE[16..0]: NODE;
IPART[2..0][16..0]: NODE;
QPART[2..0][16..0]: NODE;
ERR[7..0]: DFF;
ISCALED[16..0]: NODE;
QSCALED[16..0]: NODE;
GAIN_M[3..0]: NODE;
GAIN_X: NODE;
GAIN_G[7..0]: NODE;
GAIN_E[3..0]: NODE;
I_MENTISSA[20..0]: NODE;
Q_MENTISSA[20..0]: NODE;
GAIN[16..0]: DFF;
LIMITED[8..0]: NODE;
INTEGER[16..0]: NODE;
UPPER: NODE;
LOWER: NODE;
THRESHOLD[16..0]: NODE;
LOOPGAIN[7..0]: NODE;
UPPERLIMIT[8..0]: NODE;
LOWERLIMIT[8..0]: NODE;
BEGIN
THRESHOLD[] = 35000;
LOOPGAIN[] = 63 ;
UPPERLIMIT[] = 240 ;
LOWERLIMIT[] = 16 ;
GAIN_E[] = GAIN[16..13].Q;
GAIN_M[] = GAIN[12..9].Q;
GAIN_X = GAIN[8].Q;
GAIN_G[] = GAIN[7..0].Q;
IF PNSYNC == 0 THEN
INTEGER[] = 0;
GAIN[].D = 0;
I_MENTISSA[] = 0;
Q_MENTISSA[] = 0;
ELSE
I_MENTISSA[] = LPM_MULT(.DATAA[] = IDIN[], .DATAB[] = (0,GAIN_M[]))
WITH(LPM_WIDTHA = 16, LPM_WIDTHB = 5, LPM_WIDTHP = 21, LPM_WIDTHS = 16, LPM_REPRESENTATION = "SIGNED")
RETURNS(.RESULT[]);
Q_MENTISSA[] = LPM_MULT(.DATAA[] = QDIN[], .DATAB[] = (0,GAIN_M[]))
WITH(LPM_WIDTHA = 16, LPM_WIDTHB = 5, LPM_WIDTHP = 21, LPM_WIDTHS = 16, LPM_REPRESENTATION = "SIGNED")
RETURNS(.RESULT[]);
ISCALED[] = LPM_ADD_SUB(.DATAA[] = (IDIN[15],IDIN[]), .DATAB[] = I_MENTISSA[20..4])
WITH(LPM_WIDTH = 17, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
QSCALED[] = LPM_ADD_SUB(.DATAA[] = (QDIN[15],QDIN[]), .DATAB[] = Q_MENTISSA[20..4])
WITH(LPM_WIDTH = 17, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
CASE GAIN_E[] IS
WHEN 0 => IABS[] = LPM_ABS(.DATA[] = ISCALED[16..1])
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = QSCALED[16..1])
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = ISCALED[16..1];
QOUT[] = QSCALED[16..1];
WHEN 1 => IABS[] = LPM_ABS(.DATA[] = ISCALED[15..0])
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = ISCALED[15..0])
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[15..0]);
QOUT[] = (QSCALED[15..0]);
WHEN 2 => IABS[] = LPM_ABS(.DATA[] = (ISCALED[14..0],0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[14..0],0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[14..0],0);
QOUT[] = (QSCALED[14..0],0);
WHEN 3 => IABS[] = LPM_ABS(.DATA[] = (ISCALED[13..0],0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[13..0],0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[13..0],0,0);
QOUT[] = (QSCALED[13..0],0,0);
WHEN 4 => IABS[] = LPM_ABS(.DATA[] = (ISCALED[12..0],0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[12..0],0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[12..0],0,0,0);
QOUT[] = (QSCALED[12..0],0,0,0);
WHEN 5 => IABS[] = LPM_ABS(.DATA[] = (ISCALED[11..0],0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[11..0],0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[11..0],0,0,0,0);
QOUT[] = (QSCALED[11..0],0,0,0,0);
WHEN 6 => IABS[] = LPM_ABS(.DATA[] = (ISCALED[10..0],0,0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[10..0],0,0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[10..0],0,0,0,0,0);
QOUT[] = (QSCALED[10..0],0,0,0,0,0);
WHEN OTHERS=>IABS[] = LPM_ABS(.DATA[] = (ISCALED[9..0],0,0,0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
QABS[] = LPM_ABS(.DATA[] = (QSCALED[9..0],0,0,0,0,0,0))
WITH(LPM_WIDTH = 16)
RETURNS(.RESULT[]);
IOUT[] = (ISCALED[9..0],0,0,0,0,0,0);
QOUT[] = (QSCALED[9..0],0,0,0,0,0,0);
END CASE;
IPART[0][] = (0,0,0,0,QABS[15..3]);
IPART[1][] = (0,0,0,QABS[15..2]);
IPART[2][] = (0,IABS[]);
QPART[0][] = (0,0,0,0,IABS[15..3]);
QPART[1][] = (0,0,0,IABS[15..2]);
QPART[2][] = (0,QABS[]);
IF IABS[] > QABS[] THEN
AMPLITUDE[] = PARALLEL_ADD(.DATA[][] = IPART[][])
WITH(WIDTH = 17, SIZE = 3, WIDTHR = 17, SHIFT = 0, REPRESENTATION = "UNSIGNED", PIPELINE = 0)
RETURNS(.RESULT[]);
ELSE
AMPLITUDE[] = PARALLEL_ADD(.DATA[][] = QPART[][])
WITH(WIDTH = 17, SIZE = 3, WIDTHR = 17, SHIFT = 0, REPRESENTATION = "UNSIGNED", PIPELINE = 0)
RETURNS(.RESULT[]);
END IF;
HI_LO = LPM_COMPARE(.DATAA[] = AMPLITUDE[], .DATAB[] = THRESHOLD[])
WITH(LPM_WIDTH = 17, ONE_INPUT_IS_CONSTANT = "YES")
RETURNS(.AGEB);
ERR[].CLK = SYMCLK;
IF HI_LO == 0 THEN
ERR[].D = LOOPGAIN[];
ELSE
ERR[].D = -LOOPGAIN[];
END IF;
GAIN[].CLK = SYMCLK;
GAIN[16..8].D = LIMITED[];
GAIN[7..0].D = INTEGER[7..0];
INTEGER[] = LPM_ADD_SUB(.DATAA[] = GAIN[].Q, .DATAB[] = (ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7].Q, ERR[7..0].Q))
WITH(LPM_WIDTH = 17, LPM_REPRESENTATION = "SIGNED", LPM_DIRECTION = "ADD", LPM_PIPELINE = 0)
RETURNS(.RESULT[]);
UPPER = LPM_COMPARE(.DATAA[] = INTEGER[16..8], .DATAB[] = UPPERLIMIT[])
WITH(LPM_WIDTH = 9, LPM_REPRESENTATION = "SIGNED", ONE_INPUT_IS_CONSTANT = "YES")
RETURNS(.AGEB);
LOWER = LPM_COMPARE(.DATAA[] = INTEGER[16..8], .DATAB[] = LOWERLIMIT[])
WITH(LPM_WIDTH = 9, LPM_REPRESENTATION = "SIGNED", ONE_INPUT_IS_CONSTANT = "YES")
RETURNS(.ALEB);
IF UPPER == 1 THEN
LIMITED[] = UPPERLIMIT[];
ELSIF LOWER == 1 THEN
LIMITED[] = LOWERLIMIT[];
ELSE
LIMITED[] = INTEGER[16..8];
END IF;
END IF;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -