最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

实验六_数字频率计的Verilog_HDL语言实现

来源:动视网 责编:小OO 时间:2025-09-28 01:02:40
文档

实验六_数字频率计的Verilog_HDL语言实现

五邑大学实验报告实验课程名称数字频率计的VerilogHDL语言实现院系名称:信息工程学院专业名称:通信工程(物联网工程)实验项目名称:EDA实验班级:110711学号:11071107报告人:冯剑波实验六数字频率计的VerilogHDL语言实现一、实验目的:1、掌握较复杂数字电路或系统的纯VerilogHDL实现方法;2、体会纯VerilogHDL语言输入设计与原理图输入设计的差别。二、实验原理:数字频率计是用来测量输入信号的频率并显示测量结果的系统。一般基准时钟的高电平的持续时间为,若在这
推荐度:
导读五邑大学实验报告实验课程名称数字频率计的VerilogHDL语言实现院系名称:信息工程学院专业名称:通信工程(物联网工程)实验项目名称:EDA实验班级:110711学号:11071107报告人:冯剑波实验六数字频率计的VerilogHDL语言实现一、实验目的:1、掌握较复杂数字电路或系统的纯VerilogHDL实现方法;2、体会纯VerilogHDL语言输入设计与原理图输入设计的差别。二、实验原理:数字频率计是用来测量输入信号的频率并显示测量结果的系统。一般基准时钟的高电平的持续时间为,若在这
五邑大学实验报告

实验课程名称

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

院系名称:    信息工程学院       

专业名称:  通信工程(物联网工程)  

实验项目名称:   EDA实验        

班级 :              110711                        

学号:                  11071107                

报告人:                冯剑波                

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

一、实验目的:

1、掌握较复杂数字电路或系统的纯Verilog HDL实现方法;

2、体会纯Verilog HDL语言输入设计与原理图输入设计的差别。

二、实验原理:

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

三、设计任务与要求:

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

/*****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

仿真波型:

5、心得体会

虽然我以前上了Verilog HDL语言,但是这都实习中还是碰到了一些问题,通过向老师,向同学寻求帮助和在网上,在图书馆查找相关的资料来一点点解决遇到的问题,从中感觉自己对VHDL语言的理解又进了一步!对硬件描述语言和纯元件语言,如c语言之间的差别又有了更深一层次的理解,不过自我感觉想要对VHDL语言要很熟练的掌握的话,还需要多多的联系才行的。

六、思考题

1、本设计的测量结果在6个数码管上显示,若采用静态显示的方式,每位    显    示需4根输出线,共需24根据输出线;若用动态扫描方式,只需6+7=13    根线。什么叫动态扫描显示方式?你能写出动态扫描输出显示的程序    吗?

答: 动态数码扫描显示方式是利用了人眼的视觉暂留效应,把6个数码管按一    定顺序(从左至右或从右至左)进行点亮,当点亮的频率(即扫描频率)    不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,    我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方    式得到的视觉效果完全一样。

动态扫描输出显示的程序如下:

module led_dong(seg,sl,clk); //静态模块显示

output [7:0] seg;  //定义数码管段输出引脚

output[3:0] sl;   //定义数码管位(选择)输出引脚

input clk;   //定义输入时钟引脚

reg [7:0] seg_reg;  //定义数码管段输出寄存器

reg [5:0] sl_reg;  //定义数码管位输出寄存器

reg [5:0] disp_dat;  //定义显示数据寄存器

reg [29:0] count;  //定义计数器寄存器

always@(posedge clk)  //定义clk信号下降延触发

 begin

  count=count+1; //计数器加1

 end

always@(count[18:17])  //定义显示数据触发事件

 begin

case(count[18:17]) //定义扫描显示数据

3'b000:disp_dat=6'b100000; //显示十万位数

3'b001:disp_dat=6'b010000; //显示万位数

   3'b010:disp_dat=6'b001000; //显示千位数

   3'b011:disp_dat=6'b000100; //显示百位数

   3'b100:disp_dat=6'b000010; //显示十位数

   3'b101:disp_dat=6'b000001; //显示个位数

  endcase

  case(count[19:17])  //选择数码管显示位

   3'b000:sl_reg=6'b100000;; //选择个位数码管

   3'b001:sl_reg=6'b010000;; //选择十位数码管

   3'b010:sl_reg=6'b001000;; //选择百位数码管

   3'b011:sl_reg=6'b000100;; //选择千位数码管

3'b100:sl_reg=6'b000010;; //选择万位数码管

3'b101:sl_reg=6'b000001;; //选择十万位数码管

  endcase

 end

always@(disp_dat)   //显示译码输出

   begin

    case(disp_dat)  //选择输出数据

     6'h0:seg_reg=8'hc0; //显示0

     6'h1:seg_reg=8'hf9; //显示1

     6'h2:seg_reg=8'ha4; //显示2

     6'h3:seg_reg=8'hb0; //显示3

     6'h4:seg_reg=8'h99; //显示4

     6'h5:seg_reg=8'h92; //显示5

     6'h6:seg_reg=8'h82; //显示6

     6'h7:seg_reg=8'hf8; //显示7

     6'h8:seg_reg=8'h80; //显示8

     6'h9:seg_reg=8'h90; //显示9

     6'ha:seg_reg=8'h88; //显示a

     6'hb:seg_reg=8'h83; //显示b

     6'hc:seg_reg=8'hc6; //显示c

     6'hd:seg_reg=8'ha1; //显示d

     6'he:seg_reg=8'h86; //显示e

     6'hf:seg_reg=8'h8e; //显示f

    endcase

end  

assign seg=seg_reg;   //输出数码管译码结果

assign sl=sl_reg;   //输出数码管选择

endmodule 

2、本设计与教材《数字系统设计与Verilog HDL语言》实验三的设计有何不同?

答:书上设计输入采用层次化设计,学习混合输入设计方法,即部分底层模块用Verilog HDL实现。而本设计全部采用Verilog HDL实现上述要求的频率计。

文档

实验六_数字频率计的Verilog_HDL语言实现

五邑大学实验报告实验课程名称数字频率计的VerilogHDL语言实现院系名称:信息工程学院专业名称:通信工程(物联网工程)实验项目名称:EDA实验班级:110711学号:11071107报告人:冯剑波实验六数字频率计的VerilogHDL语言实现一、实验目的:1、掌握较复杂数字电路或系统的纯VerilogHDL实现方法;2、体会纯VerilogHDL语言输入设计与原理图输入设计的差别。二、实验原理:数字频率计是用来测量输入信号的频率并显示测量结果的系统。一般基准时钟的高电平的持续时间为,若在这
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top