DDS信号发生器设计方案剖析.docx
一、设计要求设计一个 DDS 信号发生器,能够产生正弦波或三角波,并且能够在VGA 显示器上显示波形和参数。要求用 DE2-70 开发板完成。要求:(1) 用红色显示 2 个周期波形;(2) 在屏幕下方显示字符库;二.设计原理一DDS 原理以正弦信号为例对于正弦信号发生器,它的输出可以用下式来描述:S= A sin(2 p ft )= A sin( q )outout其中,S是指该信号发生器的输出信号波形,f 指输出信号对应的频率。上式的表OUTOUT述对于时间 t 是连续的,为了用数字规律实现该表达式,必需进展离散化处理,用基准时钟 clk 进展抽样,令正弦信号的相位 为outq = 2pft在一个 clk 周期 Tclk,相位q 的变化量为Dq = 2pf T = 2pf / foutclkoutclk为了对Dq 进展数字量化,把 2 切割为 2N 由此,每份 clk 周期的相位增量Dq 用量化值D qB D q»2 p× 2 N且BDq 为整数。fB»out× 2NDqfCLK明显,信号发生器的输出可描述为:Soutk= A sin( Bq+B)k -1Dq其中 K-1 指前一个 clk 周期的相位值,同样得出Bk - 1= k - 12· 2N由上面的推导可以看出,只要对相位的量化值进展简洁的累加运算,就可以得到正弦信号的当前相位值,为用于累加的相位增量量化值 B Dq 打算了信号的输出频率 f并呈现简洁的线性关系。OUT,直接数字合成器 DDS 就是依据上述原理而设计的数控频率合成器,主要由相位累加器、相位调制器、正弦 ROM 查找表、和 DAC 构成。如图 1 中相位累加器、相位调制器、正弦 ROM 查找表是 DDS 构造中的数字局部,由于具有数控频率合成的功能,可称为 NOC(Numerically Controlled Oscillators)。BKI0A幅值 输入BK2BK0BK1BKI1BK3BKI2BKI3Q0QMULT二VGA 显示原理图 1 DDS 信号发生器构造常见的计算机显示器有 CRT Cathode Ray Tube ,阴极射线管显示器和液晶显示器, 本次设计针对 CRT 显示。CRT 中的阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生 RGB 三基色,合成一个彩色像素。用逐行扫描的方式显示图像。扫描从屏幕左上方开头, 从左到右,从上到下,进展扫描。每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进展消隐,每行完毕时,用行同步信号进展行同步;扫描完全部行,用场同步信号进展场同步,并使扫描回到屏幕的左上方,同时进展场消隐,预备下一 场的扫描。场逆程扫描轨迹正程轨迹图图 2 扫描轨迹其中蓝色 行正程,红色 行逆程;正程显示实线,逆程消隐虚线1. VGA 显示标准VGA 标准共有 5 个信号:R红色、G绿色、B蓝色、HS行同步、VS场同步 支持 640*480 区分率图 3 VGA 显示标准行表 1 行扫描时序行扫描时序单位:像素,即输出一个像素的时间TaTbTcTdTeTfTg时间9640864088800图 4 VGA 显示标准场场扫描时序单位:行,即输出一行的时间表 2 场扫描时序TaTbTcTdTeTfTg时间225848082525VGA 显示标准时钟频率:25.175MHz输出像素的频率 行频:31469Hz场频:59.94Hz 每秒图像刷频率, 约 60Hz2. 时序处理分别将场同步信号和行同步信号做时间近似处理行扫描时序单位:us表 3 对行同步做近似处理TaTbTcTdTeTfTg时间3.85.7us1.60.325.426us0.30.3前项之和场扫描时序单位:行表 4 对场同步做近似处理TaTbTcTdTeTfTg时间225848082525作近似处理2无视480无视482这样,便可通过计数分频得到行同步信号和场同步信号。下面以开发板的 50Mhz 时钟信号为例,得到 32Khz 的行同步信号和 64hz 的长同步信号50Mhz2 分频25Mhz26 分频31Khz482 分频64hzclkvga_clkHSVS系统时钟像素时钟行同步信号场同步信号三波形显示原理图 5 时序处理图要显示波形,需要将波形数据存入存储器简称 wave_RAM。wave_RAM 中可以写入读出波形数据。下面将以幅值为 256 的正弦波为例,说明波形显示原理。图 6 波形显示构造图每个时钟沿到来,从存储器中读出一个数,通过推断x_cnt 与 addr 的关系以及 y_cnt与 data 的关系是否满足条件,把握屏幕上以 x_cnt 和 y_cnt 为坐标的像素点的颜色值。其中,x_cnt 与 addr 的关系以及 y_cnt 与 data 的关系如以以下图 7 所示。图 7 波形显示像素位置与存储器地址之间关系x_cnt 与存储器地址对应;假设高度等于数据值,则该处颜色为红色。关键算法如下:假设在(m,n)处开头显示波形当 x_cnt=m 时,addr=0假设 y_cnt=n-data,则 rgb=010;当 x_cnt=m+1 时,addr=1假设 y_cnt=n-data,则 rgb=010; 当 x_cnt=m+i 时,addr=i假设 y_cnt=n-data,则 rgb=010;四字符显示原理要显示字母、数字、符号、汉字等,需要自建字库以后简称 Char_ROM。Char_ROM中存放字模数据。字模尺寸自行设定,例如英文字母、数字等可设置为 16 行*8 列像素, 汉字可设置为 16 行*16 列像素。1. 字模库设计图 8 字符库端口图以 16 行*8 列的字模 1 的设计及存储为例。图 9 字模库设计举例字库容量:地址线与全部字符所占列数打算于字符数量有关,数据线与一个字符所占行数有关。该例中数据线位数为 16bit,地址为 2bit。2. 字符显示思路:1) 确定屏幕显示起始位置,屏幕显示起始位置由行列计数值打算。2) 求 Char_ROM 地址Char_ROM 起始地址由所要显示的字符打算可将地址用宏定义的方法与字符关联。3) 读取该地址对应的数据4) 确定数据位和像素位置的关系数据位和像素位置的关系由行计数值、起始行数、字符所占行数打算。5) 显示颜色,RGB 赋值假设数据为 1,则对应位置上的 RGB 赋值为字符色,否则 RGB 值赋值为背风光。至此,DDS 及 VGA 显示的原理介绍完毕,下面开头进展系统设计及程序编写仿真。三、系统设计实现DDS发生器,波形输出频率字 +NDQNMaddrSin_ROM>>字符输出vga_clkaddrchar条件推断Char_ROM条件推断赋值RGB>计数分频HS计数分频VSclkxcc由于试验时间有限,在实际设计时并未对所生成波形做移相与转变幅值的处理,整体设计思路如以以下图 10 所示。一 参数设计图 10 系统设计思路本次试验中所生成的正弦波共采样 256 个点,存储器承受 8 位地址线,数据为 16bit。设 N 为 18 位,M 为地址线位数为 8 位,频率字B Dq =0000000100000000002,则当输入时钟为 vga_clk=25Mhz 时,由 DDS 原理局部公式可推知当输出 DDS 输出频率 f =100Khz。OUT由于显示屏幕大小为 640*480,需要显示两个周期的波形共 256*2=512 个点,设置屏幕显示横向范围为 50 到 561,纵向范围为100 到 300;字符显示范围为横向50 到 305,纵向 310 到 325。二 各模块实现程序及仿真结果1. DDS 模块程序如下:module DDS1(CLK ,CTR,Q);input CLK; input CTR;/input 17:0 BK0; /频率设置字/input 3:0 A;/幅值设置字/input 2:0 BKI0; /初相位设置字output 7:0 Q;/DDS 数字量输出wire 17:0 BK0;wire 17:0 BK1;wire 17:0 BK2;wire 17:0 BK3;wire 7:0 addr;wire 7:0 Q0;wire 7:0 Q1;reg 7:0 Q2;assign BK0=17”b000000010000000000;assign BKI2 =BK217:10;/取 N 位的高M 位DFF32 DDF1 (CLK,BK0,BK1); ADD ADD1(CLK,BK1,BK2,BK3);DFF32 DDF2 (CLK,BK3,BK2); /相位累加器ROM10 ROM1 (BKI2,CLK,Q0);/正弦 ROM 查找表ROM10tri ROM2 (BKI2,CLK,Q1);always (posedge CLK) if (CTR) Q2 <= Q0;else Q2 <= Q1; assign Q = Q2;endmodule仿真结果如以以下图 11 所示图 11 DDS 模块仿真结果2. vga 显示模块module ddsvga (vga_clk,clk,hs,vs,blank_n,red, green, blue, sync_n); input clk;output hs,vs;output blank_n; output9:0 red; output9:0 green; output9:0 blue; output sync_n; outputvga_clk;wire r,g,b; wire 3:1 grb;wire vs,hs,sync_n_r; wire fclk,cclk;wire clk_div; wire 7:0 addr;wire 7:0 data;wire 4:0 addrchar;wire 15:0 datachar; integer i;reg 7:0 addr1;reg 4:0 addr1char;reg hs1,vs1;wire 8:0 y_cnt;reg 9:0 xcc;reg 5:0 fs;reg 4:0 cc;/hang tong bu reg 8:0 ll;/chang tong bu reg 3:1 grbp;div_2 div_2(clk,clk_div);ROMsin ROM(addr,clk,data);/testchar testchar(addrchar,clk,datachar); assign vga_clk=clk_div;assign grb2=(grbp2)&hs1&vs1; assign grb3=(grbp3)&hs1&vs1; assign grb1=(grbp1)&hs1&vs1;always (posedge clk) begin if (fs=53) fs<=0; else fs<=(fs+1”b1); endassign fclk=fs5;always (posedge fclk) begin if (cc=29) cc<=5”b00000; else cc<=cc+1”b1;endassign cclk=cc4;always (posedge cclk) begin if (ll=481) ll<=9”b0; else ll<=ll+1”b1;endassign y_cnt=ll;/生成行同步,场同步信号always (cc or ll) beginif (cc>23) hs1<=1”b0; else hs1<=1”b1;if (ll>479) vs1<=1”b0; else vs1<=1”b1;endalways ( posedge vga_clk) if(blank_n)beginif(xcc=639) xcc<=0; else xcc<=xcc+1”b1; endelse xcc<=0;always(xcc,y_cnt,data) beginif (xcc>=10”d200 && xcc<=10”d455) beginaddr1<=xcc-8”d200;if (y_cnt=9”d300-data) grbp<=3”b001; else grbp<=3”b000;end elsebegin addr1<=3”b000; grbp <=3”b000; endend/*/always (posedge clk_div) beginif(y_cnt >= 9”d100 && y_cnt <= 9”d115) beginif (xcc = 10”d500)addr1char <= 0; / 求地址else if (xcc >= 10”d501 && xcc <= 10”d516 ) addr1char<=addr1char+1”b1;endendwire 3:0 dis_bit=10”d115-y_cnt;always (posedge clk_div) /数据位begingrbp<=3”b000;if (y_cnt>=9”d100 && y_cnt<=9”d115 && xcc>=10”d501 && xcc<=10”d516 ) beginif(datachardis_bit)grbp <= 3”b010; /RGB赋值else grbp <= 3”b000;endend/*/assign addr=addr1;assign addrchar=addr1char;assign hs=hs1; assign vs=vs1; assign r=grb2; assign g=grb3; assign b=grb1;assign blank_n=hs&vs; assign sync_n_r=1”b0;assign sync_n=sync_n_r;assignred=10r&blank_n; assigngreen=10g&blank_n; assignblue=10b&blank_n;endmodule最终显示结果如图12所示图 12 最终结果显示