Verilog HDL分频器设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011-2012第二学期专业选修课HDL语言应用与设计课程设计报告
Veriog HDL
分
频
器
设
计
报
告
设计时间:2012.4
班级:信科09-2
姓名:程雷
学号:08093534
指导老师:王冠军
一、设计目的和要求:
目的:
1、学会使用Quantus软件(编译、仿真等),并利用它进行设计一些简单的数字电路;
2、利用实验室提供的FPGA/CPLD实验箱,结合Quantus II软件实现分频器
的功能。
要求:分频器可以简单实用的设置分频系数。
二、实验器件和环境
实验室提供的FPGA/CPLD实验箱,PC机和Quantus II软件。
三、设计方案和源程序代码
首先分析分频器要实现的功能,然后确定他的基本结构,因为分频器的基本功能要使其分频的的功能可以控制,所以要有控制使能端口;分频器的分频系数可以自由选择,所以应有分频系数设置使能端;分频之后可以输出分频之后的频率,所以应该有输出端口。本本设计只是任意整数分频器。
1、偶数倍分频:偶数倍分频,通过计数器计数是完全可以实现的。如进行N 倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。
原理:比如4分频,需要一个模4的计数器,占空比50%,计数为0~3循环,当计数到一半时,即计数输出cnt<2时翻转。
例题代码如下:
//四分频
module div4(clk,rst_n,o_clk);
input clk,rst_n;
output o_clk;
reg o_clk;
reg [1:0]cnt;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=0;
else if(cnt==3)
cnt<=0;
else
cnt<=cnt+1;
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
o_clk<=0;
else if(cnt<2)
o_clk<=1;
else
o_clk<=0;
end
endmodule
仿真结果:
2、奇数倍分频:奇数倍分频有两种实现方法:首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。即是在计数值在邻近的1和2进行了两次翻转。这样实现的三分频占空比为1/3或者2/3。如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。另外一种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到。得到占空比为50%的奇数倍分频。
原理:比如3分频,需要一个模3的计数器,占空比50%,即计数到一半(非整数)时翻转。方法是用2个模3的计数器,一个在时钟的上升沿计数,一个在下降沿计数。对这2个计数分别分频,然后相或。利用上升沿河下降沿刚好相差半个时钟周期来实现翻转,注意的是,1|0=1,所以设为1的部分占得部分较少,确切的说为cnt<1,即0。
例题代码如下:
//三分频
module div3(clk,rst_n,o_clk);
input clk,rst_n; //输入时钟和复位
output o_clk; //输出时钟
reg [1:0]cnt_p; //上升沿计数
reg [1:0]cnt_n; //下降沿计数
reg clk_p; //上升沿分频的时钟
reg clk_n; //下降沿分频的时钟
assign o_clk=clk_p|clk_n; //分频得到的两时钟相或得到输出时钟 //上升沿计数
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_p<=0;
else if(cnt_p==2) //模3的计数器
cnt_p<=0;
else
cnt_p<=cnt_p+1;
end
//上升沿分频
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_p<=0;
else if(cnt_p<1) //cnt=0
clk_p<=1;
else //cnt=1,2
clk_p<=0;
end
//下降沿计数
always @(negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_n<=0;
else if(cnt_n==2)
cnt_n<=0;
else
cnt_n<=cnt_n+1;
end
//下降沿分频
always @(negedge clk or negedge rst_n)
begin
if(!rst_n)
clk_n<=0;
else if(cnt_n<1) //cnt_n=0
clk_n<=1;
else
clk_n<=0; //cnt_n=1,2