具體工作流程如下:
每當時鐘脈沖fc到來時,N位加法器將頻率控制字k與累加寄存器輸出的累加相位數據相加,並將相加結果發送到累加寄存器的數據輸入端。相位累加器由N位加法器和N位累加寄存器組成,累加寄存器將加法器在最後壹個時鐘脈沖後產生的新相位數據反饋到加法器的輸入端,使加法器在下壹個時鐘脈沖下能繼續與頻率控制字K相加。這樣,相位累加器在時鐘的作用下,不斷對頻率控制字K進行線性相位累加。可以看出,相位累加器每輸入壹個時鐘脈沖就累加壹次頻率控制字k,相位累加器輸出的數據就是合成信號的相位,相位累加器的溢出頻率就是DDS輸出的信號頻率。利用相位累加器輸出的數據作為波形存儲器ROM的相位采樣地址,通過查找表可以找到波形存儲器中存儲的波形采樣值(二進制碼),完成相位到幅度的轉換。波形存儲器的輸出送到D/A轉換器,D/A轉換器將數字形式的波形幅度轉換成所需合成頻率的模擬信號,經低通濾波器濾除雜波和諧波後輸出頻率為fo的正弦波。輸出頻率fo與時鐘頻率fc之間的關系滿足以下公式:fo = k× fc/2 n。
其中,fo是輸出頻率,fc是時鐘脈沖,k是頻率控制字。n是累加器的位數(字長)。
VHDL語言在MAX+PLUSⅱ軟件中模擬描述DDS輸出的正弦波程序。...
在這種設計中,相位累加器的數據寬度n是32位。
圖書館IEEE- DDS頂層設計
使用IEEE。STD_LOGIC_1164。所有;
使用IEEE。STD_LOGIC_UNSIGNED所有;
實體DDS_VHDL是
端口(CLK:在STD_LOGIC中;
FWORD:IN STD _ LOGIC _ VECTOR(7 down to 0);-頻率控制字
PWORD:IN STD _ LOGIC _ VECTOR(7 down to 0);-相位控制字
FOUT:OUT STD _ LOGIC _ VECTOR(9 down to 0));
END DDS _ VHDL
DDS_VHDL的架構之壹是
組件註冊表32B
端口(LOAD:IN STD _ LOGIC;
DIN:IN STD _ LOGIC _ VECTOR(31 down to 0);
DOUT:OUT STD _ LOGIC _ VECTOR(31 down to 0));
末端組件;
組件REG10B
端口(LOAD:IN STD _ LOGIC;
DIN:IN STD _ LOGIC _ VECTOR(9 down to 0);
DOUT:OUT STD _ LOGIC _ VECTOR(9 down to 0));
末端組件;
組件添加器32B
PORT(A:IN STD _ LOGIC _ VECTOR(31 down to 0);
b:在STD_LOGIC_VECTOR(31下降到0);
s:OUT STD _ LOGIC _ VECTOR(31 down to 0);
末端組件;
組件地址10B
PORT(A:IN STD _ LOGIC _ VECTOR(9 down to 0);
b:在STD_LOGIC_VECTOR中(9 down to 0);
s:OUT STD _ LOGIC _ VECTOR(9 down to 0));
末端組件;
組件SIN_ROM
端口(地址:在STD_LOGIC_VECTOR(9 DOWNTO 0)中);
inclock:在STD_LOGIC中;
q:OUT STD _ LOGIC _ VECTOR(9 down to 0));
末端組件;
信號F32B,D32B,din 32b:STD _ LOGIC _ VECTOR(31降0);
信號P10B,LIN10B,sin 10B:STD _ LOGIC _ VECTOR(9 down to 0);
開始
F32B(27下降到20)& lt;= FWORDF32B (31向下到28)& lt;="0000";
P10B(1下降到0)& lt;="00";
F32B(19下降到0)& lt;="00000000000000000000";P10B(9向下到2)& lt;= PWORD
u1: ADDER32B端口映射(A = & gtF32B,B = & gtD32B,S = & gtdin 32b);
u2: REG32B端口映射(DOUT = & gtD32B,DIN = & gtDIN32B,LOAD= >CLK);
u3: SIN_ROM端口映射(address = & gtSIN10B,q= >FOUT,inclock = & gtCLK);
u4: ADDER10B端口映射(A = & gtP10B,B= >D32B(31向下到22),S = & gtLin 10B);
u5: REG10B端口映射(DOUT = & gtSIN10B,DIN= >LIN10B,LOAD = & gtCLK);
結束壹;
累加器的VHDL描述
累加器由壹個N位加法器和壹個N位累加寄存器組成,其中N為32位。
圖書館IEEE-32位加法器模塊
使用IEEE。STD_LOGIC_1164。所有;
使用IEEE。STD_LOGIC_UNSIGNED所有;
實體ADDER32B是
PORT (A,B:IN STD _ LOGIC _ VECTOR(31 down to 0);
s:OUT STD _ LOGIC _ VECTOR(31 down to 0);
END ADDER32B
ADDER32B的架構行為是
開始
S & lt= A+B;
結束行為;
圖書館IEEE-32位寄存器模塊
使用IEEE。STD_LOGIC_1164。所有;
實體REG32B是
端口(Load:IN STD _ LOGIC;
DIN:IN STD _ LOGIC _ VECTOR(31 down to 0);
DOUT:OUT STD _ LOGIC _ VECTOR(31 down to 0));
結束REG32B
REG32B的架構行為是
開始
過程(負載,DIN)
開始
IF (Load'EVENT AND Load='1 ')則
DOUT & lt= DIN
結束IF;
結束進程;
結束行為;
移相加法器的數據寬度為10位,即輸出D/A的精度為10位。
圖書館IEEE-10位加法器模塊
使用IEEE。STD_LOGIC_1164。所有;
使用IEEE。STD_LOGIC_UNSIGNED所有;
實體地址10B為
PORT (A,B:IN STD _ LOGIC _ VECTOR(9 down to 0);
s:OUT STD _ LOGIC _ VECTOR(9 down to 0));
END adder 10B;
地址10B的架構行為是
開始
S & lt= A+B;
結束行為;
圖書館IEEE-10位寄存器模塊
使用IEEE。STD_LOGIC_1164。所有;
實體REG10B是
端口(Load:IN STD _ LOGIC;
DIN:IN STD _ LOGIC _ VECTOR(9 down to 0);
DOUT:OUT STD _ LOGIC _ VECTOR(9 down to 0));
END reg 10B;
REG10B的架構行為是
開始
過程(負載,DIN)
開始
IF (Load'EVENT AND Load='1 ')則
DOUT & lt= DIN
結束IF;
結束進程;
結束行為;
自定義LPM_ROM初始化數據文件
Rom_data.mif 10位正弦波數據文件可以用MATLAB/DSP Builder生成。
寬度= 10;
深度= 1024;
ADDRESS _ RADIX = DEC
DATA _ RADIX = DEC
內容開始
0:512;1:515;2:518;3:521;4:524;5:527;6:530;7:533;
8:537;9:540;10:543;11:546;12:549;13:552;14:555;.....(省略部分數據)
1018:493;1019:496;1020:499;1021:502;1022:505;1023:508;
結束;
用於實例化的波形數據ROM
用於實例化的波形數據ROM文件
圖書館IEEE-數據只讀存儲器
使用IEEE。STD_LOGIC_1164。所有;
實體sin_rom是
端口(地址:在STD_LOGIC_VECTOR(9 DOWNTO 0)中);
inclock:在STD_LOGIC中;
q:OUT STD _ LOGIC _ VECTOR(9 down to 0));
END sin _ rom
sin_rom的架構SYN是
SIGNAL sub _ wire 0:STD _ LOGIC _ VECTOR(9 down to 0);
組件LPM _ ROM-調用LPM ROM模塊。
GENERIC(LPM _ width:NATURAL;
lpm_widthad:自然;
LPM _ address _ control:STRING;
LPM _ out data:STRING;
LPM _ file:STRING);
端口(地址:在STD_LOGIC_VECTOR(9 DOWNTO 0)中);
inclock:在STD_LOGIC中;
q:OUT STD _ LOGIC _ VECTOR(9 down to 0));
末端組件;
開始
q & lt=sub_wire0(9向下到0);
lpm_rom_component: lpm_rom通用映射(
LPM寬度= & gt10,
LPM寬度= & gt10,
LPM地址控制= & gt“已註冊”,
LPM _ OUTDATA = & gt;“未註冊”,
LPM文件= & gt“ROM _ data。MIF")-ROM數據文件及其路徑。
端口映射(地址= & gt地址,inclock = & gtinclock,q = & gtsub _ wire 0);
結束SYN
這太過分了。關於DDS基本原理的書很多,網上也有。壹般EDA技術書籍裏都有DDS的VHDL代碼。