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

📄 crblock.tdf

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