实验六 - 数字频率计的Verilog - HDL语言实现

2020-05-04 16:01

五邑大学实验报告

实验课程名称

数字频率计的Verilog HDL语言实现

院系名称: 信息工程学院 专业名称: 通信工程(物联网工程) 实验项目名称: EDA实验 班级 : 学号: 报告人:

110711

11071107

冯剑波

实验六 数字频率计的Verilog HDL语言实现

一、实验目的:

1、掌握较复杂数字电路或系统的纯Verilog HDL实现方法; 2、体会纯Verilog HDL语言输入设计与原理图输入设计的差别。

二、实验原理:

数字频率计是用来测量输入信号的频率并显示测量结果的系统。一般基准时钟的高电平的持续时间为T0?1s,若在这T0内被测信号的周期数为N则被测信号的频率就是N,选择不同的T0,可以得到不同的测量精度。一般T0越大,测量精度越高,但一次的测量时间及频率计所需的硬件资源也增加。

三、设计任务与要求:

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;

wire clr;

reg cout1,cout2,cout3,cout4,cout5;

reg[3:0] q0,q1,q2,q3,q4,q5;

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;

end

always @(posedge clk_50M) //50M分频产生1Hz时钟 begin 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,作为万位的输入*/

cnt=cnt+1;

if(cnt<=25_000_000) clk_1Hz=0; else if(cnt==50_000_000) cnt=0; else clk_1Hz=1;

else begin signal_out=1;signal_in=0;end

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

/*****count_en下降沿到来时锁存数据****/ always @(negedge count_en) begin q0=ge; q1=shi; q2=bai; q3=qian; q4=wan; q5=shiwan; end

assign clr=~clk_1Hz&load; /****调用数码管显示*****/ led7s u0(q0,oHEX0);

led7s u1(q1,oHEX1); led7s u2(q2,oHEX2); led7s u3(q3,oHEX3); led7s u4(q4,oHEX4); led7s u5(q5,oHEX5); endmodule

module led7s(datain,ledout);

input[3:0] datain; output reg[6:0] ledout; always begin case(datain) 0: ledout<=7'b1000000; 1: ledout<=7'b1111001; 2: ledout<=7'b0100100; 3: ledout<=7'b0110000; 4: ledout<=7'b0011001; 5: ledout<=7'b0010010; 6: ledout<=7'b0000010; 7: ledout<=7'b1111000; 8: ledout<=7'b0000000; 9: ledout<=7'b0010000; default:ledout<=7'b1000000; endcase end endmodule

仿真波型:


实验六 - 数字频率计的Verilog - HDL语言实现.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:在全区收入分配制度改革工作会议上的讲话

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: