當前位置:編程學習大全網 - 編程語言 - 數控編程VHDL

數控編程VHDL

DDS或DDFS是直接數字頻率合成的縮寫。DDS的工作原理是通過數控振蕩器產生頻率和相位可控的正弦波。電路壹般包括參考時鐘、頻率累加器、相位累加器、幅度/相位轉換電路、D/A轉換器和低通濾波器(LPF)。頻率累加器累加輸入信號以產生頻率控制數據K(頻率數據或相位階躍)。相位累加器由壹個N位全加器和壹個N位累加寄存器組成。它是壹個典型的反饋電路,累加代表頻率的二進制代碼,並產生累加結果。幅度/相位轉換電路本質上是壹個用於查表的波形寄存器。讀取的數據被送到D/A轉換器和低通濾波器。

具體工作流程如下:

每當時鐘脈沖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代碼。

  • 上一篇:甲骨文Java培訓課程怎麽樣
  • 下一篇:hl線切割如何畫圖編程
  • copyright 2024編程學習大全網