⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agc.tdf

📁 《FPGA嵌入式应用系统开发典型实例》-书的光盘资料
💻 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 + -