- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DDS技术与Verilog程序设计
DDS:
直接数字频率合成器(Direct Digital Frequency Synthesis,简称DDS 或DDFS)
基本原理:
利用采样定理,根据相位间隔对正弦信号进行取样、量化、编码,然后储存在EPROM中构成一个正弦查询表,通过查表法产生波形。它是由参考时钟、相位累加器、正弦查询表和D/A转换器、低通滤波器等组成。
直接数字频率合成是采用数字化技术,通过控制相位的变化速度,直接产生各种不同频率信号的一种频率合成方法。它主要由相位累加器、正弦ROM表、D/A转换器和低通滤波器构成。 参考时钟fr由一个稳定的晶体振荡器产生。相位累加器由N位加法器与N位相位寄存器级联构成,类似于一个简单的加法器。每来一个时钟脉冲,加法器将频率控制数据与相位寄存器输出的累积相位数据相加,把相加后的结果送至相位寄存器的数据输入端。相位寄存器将加法器在上一个时钟作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟的作用下继续与频率控制数据相加。这样,相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累积满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。在参考时钟fr的控制下,频率控制字由累加器累加以得到相应的相位数据,把此数据作为取样地址,来寻址正弦ROM表进行相位-幅度变换,即可在给定的时间上确定输出的波形幅值。DAC将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号,低通滤波器用于滤除不需要的取样分量,这样即可得到由频率控制字决定的连续变化的输出正弦波。 由于DDS的输出最大频率受奈奎斯特抽样定理限制,所以DDS 的最高输出频率为fr/2,但在实际设计的DDS系统中,由于输出滤波器的非理想性,一般输出信号的最大频率只能达到参考时钟频率fr的40%左右。
十字路口红绿灯设计
1. 设计要求
其东西、南北各有红、黄、绿三个灯指示,利用数码管以倒计时方式显示每一路允许通行的时间,绿灯,黄灯,红灯的持续时间分别是40、5和45秒。
2.整体设计思路
根据十字路口交通管理控制器的设计要求,本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用2个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
3.详细设计
源程序:
module jtd(clk,rst,out,seg7,scan);
input clk,rst; //计数时钟、复位信号
output[5:0]out;
output[6:0]seg7;
output[1:0]scan;
reg [15:0]cnt1;
reg[9:0]cnt3;
reg[6:0]seg7;
reg cnt2;
reg flag; //flag为状态转换标志
reg[7:0]timed;
reg[1:0]scan;
reg[3:0]data;
reg clk1hz,clk1khz;
parameter s0=0,s1=1,s2=2,s3=3; //定义四种状态
reg[5:0]c_state,next_state,out;
always@(posedge clk)
begin
if(cnt1==19999)
begin
cnt1=0;clk1khz=~clk1khz;
end
else
cnt1=cnt1+1b1;
end //40Mhz→1khz
always@(posedge clk1khz)
begin
if(cnt3==499)
begin
cnt3=0;
clk1hz=~clk1hz;
end
else
cnt3=cnt3+1b1;
end //分频代码,1khz→1hz
always@(posedge clk1hz, posedge rst)
begin
if(rst==1)
begin
c_state=s0;
timed[7:4]=4h4;
timed[3:0]=4h0;
flag=1;
end
else
begin
if(timed[7:4]==0timed[3:0]==0)
begin
timed[7:4]=4h4;
timed[3:0]=4h0;
c_state=next_state;
if(flag==1)
begin
timed[7:4]=4h0;
timed[3:0]=4h5;
flag=1b0;
end
e
文档评论(0)