实验六-数字频率计的Verilog-HDL语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五邑大学实验报告
实验课程名称
)
数字频率计的Verilog HDL语言实现
院系名称:信息工程学院
专业名称:通信工程(物联网工程)
实验项目名称:EDA实验
班级: 110711
学号:
。
报告人:冯剑波
实验六 数字频率计的Verilog HDL 语言实现
一、实验目的:
1、掌握较复杂数字电路或系统的纯Verilog HDL 实现方法;
2、体会纯Verilog HDL 语言输入设计与原理图输入设计的差别。
二、实验原理:
【
数字频率计是用来测量输入信号的频率并显示测量结果的系统。一般基准时钟的高电平的持续时间为s T 10 ,若在这0T 内被测信号的周期数为N 则被测信号的频率就是N ,选择不同的0T ,可以得到不同的测量精度。一般0T 越大,测量精度越高,但一次的测量时间及频率计所需的硬件资源也增加。
三、设计任务与要求:
1、设计一个6位频率计,测量范围从1Hz 到99 99 99Hz ,测量结果用6个数码管显示,基准时钟频率为1Hz ;
2、只显示测量结果,中间计数过程不显示;结果更新时间2秒一次;
3、频率计只设一个复位键,按下该键(reset=0)系统复位,释放该键(reset=1)系统工作,测量并显示结果。
4、显示用静态方式;
5、用Verilog HDL 实现上述要求的频率计。
四、设计源程序及注释与仿真结果
设计源程序:
module pinlvji(oHEX0,oHEX1,oHEX2,oHEX3,oHEX4,oHEX5,clk_50M,clk_1Hz,reset,signal_out); @
input clk_50M,reset; //50MHz 时钟输入、复位
output[6:0] oHEX0,oHEX1,oHEX2,oHEX3,oHEX4,oHEX5; //数码管0-5,分别显示个、十、百、千、万、十万位的数字
output reg clk_1Hz;
output reg signal_out; reg signal_in; reg[29:0] cnt;
reg[29:0] cnt1; reg count_en; //计数允许,count_en=1时计数,下降沿到来时锁存
reg load; reg[3:0] ge,shi,bai,qian,wan,shiwan; reg cout1,cout2,cout3,cout4,cout5;
reg[3:0] q0,q1,q2,q3,q4,q5;
wire clr; always @(posedge clk_50M) //改变Hz 的范围,自己设定的频率1Hz-999999Hz
begin
cnt1=cnt1+1;
if(cnt1<=25_000_0) begin signal_out=0;signal_in=0;end
else if(cnt1==50_000_0) cnt1=0;
【
else begin signal_out=1;signal_in=0;end
end
always @(posedge clk_50M) //50M分频产生1Hz时钟
begin
cnt=cnt+1;
if(cnt<=25_000_000) clk_1Hz=0;
else if(cnt==50_000_000) cnt=0;
else clk_1Hz=1;
end
/*被测信号signal_in作为个位的输入,,signal_in上升沿到来时ge位+1;进位输出是cout1,作为十位的输入*/
always @(posedge signal_out or posedge reset or posedge clr)
~
begin if(reset) ge=0;
else if(clr) ge=0;
else begin if(count_en) begin if(ge==9) begin ge=0;cout1=1;end
else begin ge=ge+1;cout1=0;end
end
end
end
/*cout1作为十位的输入,cout1上升沿到来时shi位+1;进位输出是cout2,作为百位的输入*/
always @(posedge cout1 or posedge reset or posedge clr)
begin if(reset) shi=0;
else if(clr) shi=0;
¥
else begin if(count_en) begin if(shi==9) begin shi=0;cout2=1;end
else begin shi=shi+1;cout2=0;end
end
end
end
/*cout2作为百位的输入,cout2上升沿到来时bai位+1;进位输出是cout3,作为千位的输入*/
always @(posedge cout2 or posedge reset or posedge clr)
begin if(reset) bai=0;
else if(clr) bai=0;
else begin if(count_en) begin if(bai==9) begin bai=0;cout3=1;end
else begin bai=bai+1;cout3=0;end
…
end
end
end
/*cout3作为千位的输入,cout3上升沿到来时qian位+1;进位输出是cout4,作为万位的输入*/ always @(posedge cout3 or posedge reset or posedge clr)
begin if(reset) qian=0;
else if(clr) qian=0;
else begin if(count_en) begin if(qian==9) begin qian=0;cout4=1;end
else begin qian=qian+1;cout4=0;end
end
end
;
end
always @(posedge cout4 or posedge reset or posedge clr)
begin if(reset) wan=0;
else if(clr) wan=0;
else begin if(count_en) begin if(wan==9) begin wan=0;cout5=1;end
else begin wan=wan+1;cout5=0;end
end
end
end
always @(posedge cout5 or posedge reset or posedge clr)
begin if(reset) shiwan=0;
<
else if(clr) shiwan=0;
else begin if(count_en) begin if(bai==9) begin shiwan=9;end
else begin shiwan=shiwan+1;end
end
end
end
/*****count_en=1时计数,count_en=0不允许计数********/
always @(posedge clk_1Hz or posedge reset)
begin if(reset) begin count_en=0;end
else begin count_en=~count_en;load=~count_en;end
end