实验六-数字频率计的Verilog-HDL语言实现
五邑大学实验报告实验课程名称)数字频率计的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-999999Hzbegincnt1=cnt1+1;if(cnt1<=25_000_0) begin signal_out=0;signal_in=0;endelse if(cnt1==50_000_0) cnt1=0;【else begin signal_out=1;signal_in=0;endendalways @(posedge clk_50M) //50M分频产生1Hz时钟begincnt=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;endelse begin ge=ge+1;cout1=0;endendendend/*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;endelse begin shi=shi+1;cout2=0;endendendend/*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;endelse begin bai=bai+1;cout3=0;end…endendend/*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;endelse begin qian=qian+1;cout4=0;endendend;endalways @(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;endelse begin wan=wan+1;cout5=0;endendendendalways @(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;endelse begin shiwan=shiwan+1;endendendend/*****count_en=1时计数,count_en=0不允许计数********/always @(posedge clk_1Hz or posedge reset)begin if(reset) begin count_en=0;endelse begin count_en=~count_en;load=~count_en;endend//*****count_en下降沿到来时锁存数据****/ always @(negedge count_en)begin q0=ge; q1=shi;q2=bai; q3=qian;q4=wan; q5=shiwan;endassign 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);endmodulemodule 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 endendmodule仿真波型:·五、心得体会虽然我以前上了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; //计数器加1endalways@(count[18:17]) //定义显示数据触发事件 begincase(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; //显示个位数(endcasecase(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;; //选择十万位数码管 endcaseendalways@(disp_dat) //显示译码输出—begincase(disp_dat) //选择输出数据6'h0:seg_reg=8'hc0; //显示06'h1:seg_reg=8'hf9; //显示16'h2:seg_reg=8'ha4; //显示26'h3:seg_reg=8'hb0; //显示36'h4:seg_reg=8'h99; //显示46'h5:seg_reg=8'h92; //显示56'h6:seg_reg=8'h82; //显示66'h7:seg_reg=8'hf8; //显示76'h8:seg_reg=8'h80; //显示86'h9:seg_reg=8'h90; //显示96'ha:seg_reg=8'h88; //显示a6'hb:seg_reg=8'h83; //显示b6'hc:seg_reg=8'hc6; //显示c6'hd:seg_reg=8'ha1; //显示d6'he:seg_reg=8'h86; //显示e6'hf:seg_reg=8'h8e; //显示fendcaseendassign seg=seg_reg; //输出数码管译码结果assign sl=sl_reg; //输出数码管选择endmodule2、本设计与教材《数字系统设计与Verilog HDL语言》实验三的设计有何不同答:书上设计输入采用层次化设计,学习混合输入设计方法,即部分底层模块用Verilog HDL实现。
根据Verilog的数字频率计的设计
根据Verilog的数字频率计的设计以下是一个使用Verilog设计并仿真的数字频率计的示例:```verilogmodule frequency_counterinput reset,input clk,output reg [31:0] frequencyreg [31:0] count;reg [31:0] prev_count;reg counting;if (reset) begincounting <= 0;count <= 0;prev_count <= 0;end else beginprev_count <= count;count <= count + 1;if (prev_count == 0) begincounting <= 1;counting <= 0;frequency <= count;count <= 0;endendendendmodule```为了仿真该模块,可以使用任何支持Verilog仿真的工具,如ModelSim。
以下是一个对该模块进行仿真的示例测试台代码:```verilogmodule frequency_counter_tb;reg reset;reg clk;wire [31:0] frequency;frequency_counter dut.reset(reset),.clk(clk),.frequency(frequency)initial beginreset = 1;;reset = 0;endalways begin;clk = ~clk;endendmodule```在上述测试台代码中,引脚`reset`和`clk`通过不断的切换来产生复位和时钟信号。
然后,通过监视`frequency`引脚,可以检查计算的频率是否正确。
完成设计和测试台代码后,可以使用仿真工具对其进行仿真,以验证设计的正确性和性能。
EDA实验06—Verilog HDL中使用函数和任务
电子信息工程学系实验报告课程名称:EDA技术与实验在实验项目名称:Verilog HDL中使用函数和任务实验时间:班级:通信091 姓名:Jxairy 学号:实验目的:1.了解函数的定义和在模块设计中的使用。
2.了解函数的可综合性问题。
3.了解许多综合器不能综合复杂的算术运算。
4.掌握任务在Verilog模块设计中的应用。
5.学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。
实验环境:Windows 7、MAX+PlusⅡ10、QuartusⅡ等。
实验内容:1.用函数定义8—3编码器的文本设计及仿真。
2.用任务模块进行alutask的文本设计及仿真。
实验过程:一、用函数定义8—3编码器的文本设计及仿真:(试验环境:MAX+PlusⅡ10)(1)新建文本:选择菜单File下的New,出现如图5.1所示的对话框,在框中选中“Text Editor file”,按“OK”按钮,即选中了文本编辑方式。
图6.1 新建文本(2)另存为Verilog编辑文件,命名为“code_83.v”如图5.2所示。
(3)在编辑窗口中输入程序,如图6.3所示。
图6.2 另存为.V编辑文件图6.3 8—3编码器的源程序(4)设置当前文本:在MAX+PLUS II中,在编译一个项目前,必须确定一个设计文件作为当前项目。
按下列步骤确定项目名:在File菜单中选择Project 中的Name选项,将出现Project Name 对话框:在Files 框内,选择当前的设计文件。
选择“OK”。
如图6.4所示。
(5)打开编译器窗口:在MAX—plusⅡ菜单内选择Compiler 项,即出现如图6.5的编译器窗口。
图6.4 设置当前仿真的文本设计图6.5 编译器窗口选择Start即可开始编译,MAX+PLUS II编译器将检查项目是否有错,并对项目进行逻辑综合,然后配置到一个Altera 器件中,同时将产生报告文件、编程文件和用于时间仿真用的输出文件。
verilog简易数字频率计报告
一、实验原理根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。
其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。
二、方案论证一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL 语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。
计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。
通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。
把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。
说明:Cnt9999:0000~9999计数器;Buffer:锁存器;Scan:扫描显示共8个模块三、实验步骤一、计数器模块计数器模块的仿真波形二、锁存模块利用32位的D触发器进行储存计数器送给它的数据。
在时钟为上升沿的时候触发保存数据。
锁存模块的源代码:module buffer_32(clr,clear,in,out);input clear,clr;input[31:0] in;output[31:0] out;reg[31:0] out;always@(posedge clear or negedge clr)if(!clr)out<=0;//else if(clear)out=in;else out<=in;endmodule三、转化清零模块波形仿真波形module cnt9999(clr,clk,q,c);input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;always @(posedge clk or negedge clr)beginif(!clr)begin q[15:0]<=0;c<=1'b0;endelse if(q[15:0]==16'H9999) begin q[15:0]<=0;c<=1'b1;endelse if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;endelse if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;endelse if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;endelse begin q[15:0]<=q[15:0]+1'b1; c<=1'b0;endendendmodule四、扫描显示模块把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。
VHDL语言设计数字频率计
数字频率计的设计一、频率计实现的功能要设计的频率计的测量范围为1MHz。
为了提高测量的精度,量程分为三档,分别是:10kHz、100kHz、1MHz。
并要求在测量频率大于或小于选择的量程时,频率计自动换档。
1、当读数大于999时,频率计处于超量程状态,下一次测量时,量程自动增加一档。
2、当读数小于009时,频率计处于欠量程状态,下一次测量时,量程自动减小一档。
3、当超出测量范围时,显示错误。
4、在计数时不显示数据,计数完成后只显示测量结果。
5、小数点位置要自动移位。
二、频率计各部分的分析在这个设计中,需要用计数器来进行计数,而且计数器在各个档位要被重复使用,在测量的过程中,计数允许时钟信号还要进行调整,故将计数器设计成一个单独的模块,提供计数值的输出。
显示结果包括数值显示,档位显示及溢出标志显示。
其中数值显示要用到三个数码管,实验箱上连在一起的三个数码管中,只有两个数码管内部接有译码器,因此我们自己还要在程序中为那个没有译码器的数码管再加一段七段译码器程序来显示结果。
档位标志由三个LED灯来显示,代替数码管上的小数点的功能。
溢出标志由两个LED灯来显示,其中一个显示结果溢出,另一个显示输入信号在测量范围之内。
该频率计的顶层逻辑电路原理图如图(1)所示:图(1)三、频率计各部分的设计和实现从上面的分析可以知道,频率计可以由三个模块来组成。
下面对各个模块的设计方法和实现方法进行详细说明。
1、时基进程的设计和实现在实际使用时,输入的信号是随意的,没有办法预知输入的频率。
因此选取频率计的时基是非常重要的。
在设计要求中,将量程分为三档,在某一档进行测量时,需要提供该档的时基。
在10kHz档,该档最大读数为9.99kHz,最小读数为0.01 kHz,所以要提供的时基是频率为0.01 kHz的脉冲。
同理,在100 kHz档上,要提供的时基应该是频率为0.1 kHz的脉冲。
在1 MHz档上,要提供的时基是频率为1 kHz的脉冲。
数字频率计实验报告
考虑到测量方便,将数字频率计划分为四档:10~99Hz 、100~999Hz 、1000~9999Hz 、10000~99999Hz 。
这样可以保证每一档三位有效数字,而且第三位有效数字误差在±2以内时即可达到精度要求。
三个输入信号:待测信号、标准时钟脉冲信号和复位脉冲信号。
设计细化要求:频率计能根据数字频率计设计计双0102 雷昊 2001011830786一、课程设计内容及要求本次课程设计要求设计并用FPGA 实现一个数字频率计,具体设计要求如下:测量频率范围: 10Hz ~100KHz 精度: ΔF / F ≤ ±2 %系统外部时钟: 1024Hz 测量波形: 方波 Vp-p = 3~5 V 硬件设备:Altera Flex10K10 五位数码管 LED 发光二极管编程语言:Verilog HDL / VHDL二、系统总体设计输入待测信号频率自动选择量程,并在超过最大量程时显示过量程,当复位脉冲到来时,系统复位,重新开始计数显示频率。
基于上述要求,可以将系统基本划分为四个模块,分别为分频、计数、锁存和控制,并可以确定基本的连接和反馈,如上图所示。
三、系统及模块设计与说明如左图所示为数字频率计测量频率的原理图。
已知给定标准时钟脉冲高电平时间,将此0T 高电平信号作为计数器闸门电平,通过计数器得到时间内待测脉冲的个数N ,则有。
由图示可以看出,一个闸门电平时间内0T 0T Nf计数的最大误差为N ±1,为保证误差要求取N ≥100。
经计算,四档的闸门电平时间分0T 别为10s 、1s 、0.1s 和0.01s 。
仅对计数器计数值N 进行简单的移位即可得到结果。
产生闸门电平的工作由分频器完成。
分频器采用计数分频的方法,产生计数闸门电平和一系列控制脉冲,并接受计数器和控制器的反馈。
控制器主要用来判断计数器计数是否有效,从而控制档位转换,锁存器打开、关闭和设定值。
计数器在分频器和控制器的作用下对输入待测信号计数,并把计数值输出,在计数溢出时向控制器和分频器发送溢出脉冲。
verilog hdl实验报告
verilog hdl实验报告《Verilog HDL实验报告》Verilog HDL(硬件描述语言)是一种用于描述电子系统的硬件的语言,它被广泛应用于数字电路设计和硬件描述。
本实验报告将介绍Verilog HDL的基本概念和使用方法,并通过实验展示其在数字电路设计中的应用。
实验目的:1. 了解Verilog HDL的基本语法和结构2. 掌握Verilog HDL的模块化设计方法3. 熟悉Verilog HDL的仿真和综合工具的使用实验内容:1. Verilog HDL的基本语法和结构Verilog HDL是一种硬件描述语言,其语法和结构类似于C语言。
它包括模块定义、端口声明、信号赋值等基本元素。
在本实验中,我们将学习如何定义Verilog模块,并使用端口声明和信号赋值描述数字电路的行为。
2. Verilog HDL的模块化设计方法Verilog HDL支持模块化设计,可以将复杂的电路分解为多个模块,每个模块描述一个子电路的行为。
在本实验中,我们将学习如何设计和实现Verilog模块,并将多个模块组合成一个完整的数字电路。
3. Verilog HDL的仿真和综合工具的使用Verilog HDL可以通过仿真工具进行功能验证,也可以通过综合工具生成实际的硬件电路。
在本实验中,我们将使用Verilog仿真工具对设计的数字电路进行功能验证,并使用综合工具生成对应的硬件电路。
实验步骤:1. 学习Verilog HDL的基本语法和结构2. 设计一个简单的数字电路,并实现Verilog模块描述其行为3. 使用仿真工具对设计的数字电路进行功能验证4. 使用综合工具生成对应的硬件电路实验结果:通过本实验,我们学习了Verilog HDL的基本概念和使用方法,并成功设计和实现了一个简单的数字电路。
我们使用仿真工具对设计的数字电路进行了功能验证,并使用综合工具生成了对应的硬件电路。
实验结果表明,Verilog HDL在数字电路设计中具有重要的应用价值。
基于verilog语言的数字频率计设计
基于verilog语言的数字频率计设计以下是一种基于Verilog语言的数字频率计设计:```verilogmodule frequency_counterinput clk, //输入时钟input reset, //复位信号input enable, //启用信号input signal_in, //输入信号output [31:0] frequency //输出频率reg [31:0] count; //计数器if (reset) begincount <= 0;end else if (enable) beginif (signal_in) begincount <= count + 1;endendendassign frequency = count; //将计数器值赋给输出端口endmodule```在此设计中,我们使用一个32位的计数器(count)来计算输入信号(signal_in)的高电平脉冲数。
输入时钟(clk)用于同步计数器的操作。
复位信号(reset)用于将计数器复位为0。
启用信号(enable)用于控制计数器的启用与禁用。
当reset为高电平时,计数器会被复位为0。
当enable为高电平时,计数器会逐渐增加,直到输入信号(signal_in)为低电平。
此时,计数器的值会保持不变。
最终,计数器的值会通过输出端口frequency输出。
在这个设计中,frequency是一个32位的输出端口,表示输入信号的高电平脉冲数。
这个设计可以通过Verilog仿真工具进行仿真,并且可以综合到FPGA芯片中进行硬件实现。
Verilog-数字频率计
摘要本文介绍了基于FPGA的数字频率计的设计方法,设计采用硬件描述语言Verilog,在软件开发平台ISE上完成,可以在较高速时钟频率(48MHz)下正常工作。
该数字频率计采用测频的方法,能准确的测量频率在10Hz到100MHz之间的信号。
使用ModelSim仿真软件对Verilog程序做了仿真,并完成了综合布局布线,最终下载到芯片Spartan3A上取得良好测试效果。
关键词:FPGA,Verilog,ISE,测频方法IAbstractThis paper introduces the design method of digital frequency meter based on FPGA,which use hardware description language-Verilog in software development platform ISE and can word in relatively high-speed clock of48MHz.The frequency meter uses the method of frequency measurement,which could accurately measure the frequency of signals between10Hz to100MHz.This system uses the simulation tool-ModelSim to run and debug the Verilog program,and design the circuit placement.A good result can be achieved when the program was burnt on the chip Spartan3A.KeywordsKeywords::FPGA,Verilog,ISE,Frequency MeasurementIIII目录第一章测量原理与方法................................................................................................................................................................................................441.1测频方法.............................................................................................................41.2测周方法.............................................................................................................51.3等精度测量法....................................................................................................51.4放大整形电路....................................................................................................61.5时基信号产生. (7)第二章任务要求..........................................................................................................................................................................................................................88第三章各模块功能及介绍....................................................................................................................................................................................883.1分频器..................................................................................................................84.2闸门选择器........................................................................................................104.3频率计数器........................................................................................................124.4锁存器................................................................................................................144.5扫描显示控制译码系统.. (15)第四章顶层电路及总体仿真............................................................................................................................................................................16164.1顶层电路.. (16)4.2总体仿真结果 (16)4.3测试结果 (19)第一章测量原理与方法所谓“频率”,就是周期性信号在单位时间(秒)内变化的次数。
在FPGA上用VHDL实现数字频率计 实验报告
数字系统设计实验报告一、设计要求:1、(1)频率测量范围10Hz~1MHz(2)量程自动转换,量程分为10KHz (1s) 、100KHz (0.1s) 、1MHz (10ms)三档。
转换规则如下:当读数大于9999时,频率计处于超量程状态,下一次测量时,量程自动增大一档;当读数小于0999时,频率计处于欠量程状态,下一次测量时,量程自动减小一档(3)数据采用记忆显示方式,即计数过程中不显示数据,待计数过程结束以后,显示计数结果,并将此显示结果保持到下一次计数结束。
(4)用发光二极管显示量程二、方案选则1测量原理:当预置门控信号为高电平时,启动计数器,被测信号(频率为fx) 计数当预置门控信号为低电平时,关闭计数器设在一次预置门控时间Tg内对被测信号计数值为Nx,则fx= Nx / Tg2具体方案:本设计中将2MHz的时钟分三次频,分别作为防抖电路的周期信号、显示模块片选信号、计数及锁存模块闸门信号。
防抖电路滤去窄波,显示模块用模4计数器来分别输出四位测量结果。
计数器通过在0.1s内对输入信号的高电平(发生期)进行计数来得出结果,并且为了达到换挡目的,测量时计六位数,通过结果选择档位进行输出。
二、原理图三、总体电路图四、流程图五、设计清单1、防抖电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY debounce ISPORT(key,cp: IN STD_LOGIC; --复位键imp:OUT STD_LOGIC); --去掉窄波后输出END debounce;ARCHITECTURE base OF debounce ISSIGNAL ql,q2:STD_LOGIC;BEGINPROCESS(cp)BEGINIF cp'event AND cp='1'THENq2<=ql; ql<=key;END IF;END PROCESS;imp<=ql AND NOT q2;END base;时序仿真波形:2、分频电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY dividefre4 ISPORT(cp_2m:IN STD_LOGIC; --2MHzcpl:OUT STD_LOGIC; --200Hzcp2:OUT STD_LOGIC; --25Hzcp3:OUT STD_LOGIC); --5HzEND dividefre4;ARCHITECTURE behavior OF dividefre4 IS SIGNAL tout:INTEGER RANGE 0 TO 4999; --5000分频SIGNAL toutl:INTEGER RANGE 0 TO 7; --8分频SIGNAL tout2:INTEGER RANGE 0 TO 39; --40分频SIGNAL cp_1:STD_LOGIC;SIGNAL cp_2:STD_LOGIC;SIGNAL cp_3:STD_LOGIC;SIGNAL cp:STD_LOGIC;BEGINPROCESS(cp_2m) –分出400Hz时钟BEGINIF(cp_2m'event AND cp_2m='1')THENIF tout=4999 THENtout<=0;ELSE tout<=tout+1;END IF;IF tout=2499 THENcp<='0';ELSE cp<='1';END IF;END IF;END PROCESS;PROCESS(cp) --200Hz时钟BEGINIF(cp'event AND cp='1')THENcp_1<=NOT cp_1;END IF;END PROCESS;PROCESS(cp_1) --25Hz时钟和5HzBEGINIF(cp_1'event AND cp_1='1')THENIF toutl=7 THEN toutl<=0;ELSE toutl<=toutl+1;END IF;IF toutl=3 THENcp_2<='1';ELSIF toutl=7 THEN cp_2<='0'; --8分频得25Hz END IF;IF tout2=39 THEN tout2<=0; --40分频得5HzELSE tout2<=tout2+1;END IF;IF tout2=39 THENcp_3<='1';ELSIF tout2=19 THEN cp_3<='0';END IF;END IF;END PROCESS;cpl<=cp_1;cp2<=cp_2;cp3<=cp_3;END behavior;仿真波形:(因原程序所分频倍数太大,所以这里将5000倍分频降至50倍)3、计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY fretest ISPORT(enable:IN STD_LOGIC; --使能cp3:IN STD_LOGIC; --闸门INput:IN STD_LOGIC; --被测信号reset:IN STD_LOGIC; --复位信号overflow:OUT STD_LOGIC; --大于1000kHzPlay0,playl,play2,play3:OUT INTEGER RANGE 0 TO 9;decimal:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--小数点,即档位END fretest;ARCHITECTURE behavior OF fretest ISSIGNAL r0_1,r1_1,r2_1,r3_1,r4_1,r5_1:INTEGER RANGE 0 TO 9;BEGINPROCESS(INput,enable,reset,cp3)BEGINIF enable='0'THEN NULL; --不测量ELSIF(input'event AND input='1')THEN --检测被测信号IF reset='1'THEN --同步复位,高电平有效overflow<='0';r0_1<=0;r1_1<=0;r2_1<=0;r3_1<=0;r4_1<=0;r5_1<=0;ELSIF cp3='0'THEN --闸门为0时清零Overflow<='0';r0_1<=0;r1_1<=0;r2_1<=0;r3_1<=0;r4_1<=0;r5_1<=0;ELSE --闸门为高电平计数r0_1<=r0_1+1;IF r0_1=9 THEN r1_1<=r1_1+1;r0_1<=0;IF(r1_1=9)THEN r2_1<=r2_1+1;r1_1<=0;IF(r2_1=9)THEN r3_1<=r3_1+1;r2_1<=0;IF(r3_1=9)THEN r4_1<=r4_1+1;r3_1<=0;IF(r4_1=9)THEN r5_1<=r5_1+1;r4_1<=0;IF(r5_1=9)THEN r5_1<=0;overflow<='1'; --大于1000kHz END IF;END IF;END IF;END IF;END IF;END IF;END IF;END IF;END PROCESS;PROCESS(r5_1,r4_1)BEGINIF r5_1=0 AND r4_1=0 THEN --为小于9999Hz时play0<=r0_1;playl<=r1_1;play2<=r2_1;play3<=r3_1;decimal<="100";ELSIF r5_1=0 THEN --为几十kHz时play0<=r1_1;playl<=r2_1;play2<=r3_1;play3<=r4_1;decimal<="010";ELSE --为几百kHz时play0<=r2_1;playl<=r3_1;play2<=r4_1;play3<=r5_1;decimal<="001";END IF;END PROCESS;END behavior;仿真波形4、锁存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY frelatch ISPORT(reset:IN STD_LOGIC; --复位cp3:IN STD_LOGIC; --时钟Overflow: IN STD_LOGIC; --大于1000kHz表示play0,playl,play2,play3:IN INTEGER RANGE 0 TO 9;decimal:IN STD_LOGIC_VECTOR(2 DOWNTO 0);--小数点overlatch:OUT STD_LOGIC; --大于1000kHzp0latch,pllatch,p21atch,p31atch:OUT INTEGER RANGE 0 TO 9; delatch:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--小数点END frelatch;ARCHITECTURE behavior OF frelatch ISBEGINPROCESS(cp3,reset)BEGINIF reset='1'THENoverlatch<='0';p0latch<=0;pllatch<=0;p21atch<=0;p31atch<=0;delatch<=decimal;ELSIF cp3'event AND cp3='0'THENoverlatch<=overflow;p0latch<=play0;pllatch<=playl;p21atch<=play2;p31atch<=play3;delatch<=decimal;END IF;END PROCESS;END behavior;仿真波形5、显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY display ISPORT( cpl:IN STD_LOGIC; --时钟overflow:IN STD_LOGIC; --高于1000kHz标志p0,p1,p2,p3:IN INTEGER RANGE 0 TO 9;--BCD码输入 show:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--7段码输出 sel:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));--位扫描码END dISplay;ARCHITECTURE behavior OF display ISSIGNAL count: INTEGER RANGE 0 TO 3;SIGNAL sel_1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(cpl)BEGINIF(cpl'event AND cpl='1') THENIF count=3 THEN count<=0;ELSEcount<=count+1;END IF;END IF;END PROCESS;PROCESS(count)BEGINCASE count ISWHEN 0=>sel_1<="1110"; --第0位WHEN 1=>sel_1<="1101"; --第1位WHEN 2=>sel_1<="1011"; --第2位WHEN 3=>sel_1<="0111"; --第3位END CASE;END PROCESS;PROCESS(overflow,sel_1)BEGINIF(overflow='1')THENshow<="0110111"; --高于1000kHz,显示HELSIF(sel_1(0)='0')THEN --第0位数码管译码CASE p0 ISWHEN 0=>show<="1111110";--显示0,a-gWHEN 1=>show<="0110000";--1WHEN 2=>show<="1101101";--2WHEN 3=>show<="1111001";WHEN 4=>show<="0110011";WHEN 5=>show<="1011011";WHEN 6=>show<="0011111";WHEN 7=>show<="1110000";WHEN 8=>show<="1111111";WHEN 9=>show<="1110011";END CASE;ELSIF(sel_1(1)='0')THEN --第1位译码 CASE p1 ISWHEN 0=>show<="1111110";WHEN 1=>show<="0110000";WHEN 2=>show<="1101101";WHEN 3=>show<="1111001";WHEN 4=>show<="0110011";WHEN 5=>show<="1011011";WHEN 6=>show<="0011111";WHEN 7=>show<="1110000";WHEN 8=>show<="1111111"; WHEN 9=>show<="1110011";END CASE;ELSIF(sel_1(2)= '0')THEN --第2位译码 CASE p2 ISWHEN 0=>show<="1111110";WHEN 1=>show<="0110000";WHEN 2=>show<="1101101";WHEN 3=>show<="1111001";WHEN 4=>show<="0110011";WHEN 5=>show<="1011011";WHEN 6=>show<="0011111";WHEN 7=>show<="1110000";WHEN 8=>show<="1111111";WHEN 9=>show<="1110011";END CASE;ELSIF(sel_1(3)='0')THEN --第3位译码 CASE p3 ISWHEN 0=>show<="1111110";WHEN 1=>show<="0110000";WHEN 2=>show<="1101101";WHEN 3=>show<="1111001";WHEN 4=>show<="0110011";WHEN 5=>show<="1011011";WHEN 6=>show<="0011111";WHEN 7=>show<="1110000";WHEN 8=>show<="1111111";WHEN 9=>show<="1110011";END CASE;END IF;END PROCESS; sel<=sel_1; END behavior; 仿真波形。
基于Verilog HDL的数字频率计设计及仿真实现
基于Verilog HDL的数字频率计设计及仿真实现基于veriloghdl的数字频率计设计及仿真实现摘要:在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都存有十分紧密的关系,因此频率的测量就变得更为重要。
测量频率的方法存有多种,其中电子计数器测量频率具备精度高、使用方便、测量快速,以及易于同时实现测量过程自动化等优点,就是频率测量的关键手段之一。
电子计数器测频存有两种方式:一就是轻易测频法,即为在一定闸门时间内测量被测信号的脉冲个数;二就是间接测频法,例如周期测频法。
轻易测频法适用于于高频信号的频率测量,间接测频法适用于于低频信号的频率测量。
本文阐释了为veriloghdl语言设计了一个直观的数字频率计的过程关键词:周期;eda;veriloghdl;数字频率计;波形仿真郭祥斌基于veriloghdl数字频率计设计与同时实现第-2-页共37页1引言在电子测量领域中,频率测量的精确度就是最低的,仅约10―10e-13数量级。
因此,在生产过程中许多物理量,比如温度、压力、流量、液位、ph值、振动、加速度、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计去测量,以提升精确度。
国际上数字频率计的分类很多。
按功能分类,测量某种单一功能的计数器。
如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns数量级;特种计数器,它具有特种功能,如可逆计数器、予置计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。
数字频率计按频段分类(1)低速计数器:最高计数频率<10mhz;(2)中速计数器:最高计数频率10―100mhz;(3)高速计数器:最高计数频率>100mhz;(4)微波频率计数器:测频范围1―80ghz或更高。
单片机自问世以来,性能不断提升和健全,其资源又能够满足用户很多应用领域场合的须要,加之单片机具备集成度低、功能弱、速度快、体积小、功耗高、使用方便、价格低廉等特点,因此,在工业掌控、智能仪器仪表、数据采集和处置、通信系统、高级计算器、家用电器等领域的应用领域日益广为,并且正在逐步替代现有的多片微机应用领域系统。
