用verilog HDL设计地4位频率计
用verilog HDL设计的4位频率计

简单4位数字频率计设计一、 设计要求(1)、利用Verilog HDL 语言行为描述方法,设计一个简单的4位数字频率计; (2)、要求输入标准时钟信号频率为1MHz ,系统可计数频率范围为1Hz~9999Hz ; (3)、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示(动态扫描显示)。
二、 系统结构框图4位数字频率计系统结构框图根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s 占空比50%的信号,用来对输入信号采样,得到采样信号GA TED_CLK ;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD 和COUNTER_CLR ,LOAD 信号控制计数完成后的数据及时输出给显示,COUNTER_CLR 信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP ;显示控制模块要完成将计数模块输入的信号进行译码显示。
三、 信号描述测试信号采样原理:Signal for testTo displaySignal for testGA TED_CLK 、LOAD 、COUNTER_CLR 信号的关系:COUNTER_CLRGATED_CLKLOAD四、 Verilog 程序各子模块verilog 程序:(1)信号处理模块_verilog : moduleFREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNA L_TEST,RESET); output GATED_CLK; output LOAD; output COUNTER_CLR; input CLK_IN; input SIGNAL_TEST; input RESET; reg LOAD; reg COUNTER_CLR; reg DIVIDE_CLK; reg[19:0] cn; reg A1,A2;//信号分频:由CLK_IN 得到分频后的信号DIVIDE_CLK(0.5Hz) always @(posedge CLK_IN) begin if(RESET) begin DIVIDE_CLK<=0; cn<=0;endelse if(cn==1000000)begincn<=0;DIVIDE_CLK<=~DIVIDE_CLK;endelsecn<=cn+1;end//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always @(posedge SIGNAL_TEST)beginA1<=~DIVIDE_CLK;endalways @(posedge SIGNAL_TEST)beginA2=A1;endalways @(A1 or A2)beginLOAD=A1&&(!A2);endalways @(posedge SIGNAL_TEST)COUNTER_CLR=LOAD;//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号assign GATED_CLK=SIGNAL_TEST&DIVIDE_CLK;endmodule(2)、计数器模块:moduleFREQUENCY_COUNTER_BLOCK(COUT,FLOW_UP,CLOCK_IN,RESET,LOAD,COUNTER _CLR);output[15:0] COUT;output FLOW_UP;input CLOCK_IN;input LOAD;input COUNTER_CLR;input RESET;reg[15:0] TEMP;reg FLOW_UP;parameter B_SIZE=16; //二进制位宽,为便于移植,所有定义了成参数reg[B_SIZE+3:0] bcd; //转换后的BCD码的位数要比二进制多4位reg[B_SIZE-1:0] binary;reg[B_SIZE-1:0] bin;reg[B_SIZE+3:0] result;//计数器完成计数得到二进制表示的频率数值always @(CLOCK_IN or RESET or LOAD or COUNTER_CLR)beginif(RESET|COUNTER_CLR)beginTEMP<=0;FLOW_UP<=0;endelse if(LOAD)binary<=TEMP;else if(TEMP>9999)beginFLOW_UP<=1;binary<=9999;endelseif(CLOCK_IN)TEMP<=TEMP+1;end//将二进制表示(或十六进制表示)的数转换为BCD码的形式,便于数码管译码显示always @(binary or RESET)beginbin=binary;result=0;if(RESET)bcd<=0;elsebeginrepeat(B_SIZE-1)beginresult[0]=bin[B_SIZE-1];if(result[3:0]>4)result[3:0]=result[3:0]+4'd3;if(result[7:4]>4)result[7:4]=result[7:4]+4'd3;if(result[11:8]>4)result[11:8]=result[11:8]+4'd3;if(result[15:12]>4)result[15:12]=result[15:12]+4'd3;if(result[19:16]>4)result[19:16]=result[19:16]+4'd3;result=result<<1;bin=bin<<1;endresult[0]=bin[B_SIZE-1];bcd<=result;endendassign COUT=bcd[15:0];endmodule(3)信号显示处理:module FREQUENCY_DISPL Y_BLOCK(DOUT,DCLK_IN,RESET,CDIN);output[10:0] DOUT;input[15:0] CDIN;input DCLK_IN;input RESET;reg[10:0] DOUT;reg[3:0] Temp1;reg[1:0] cn;always @(posedge DCLK_IN) //设置成动态扫描beginif(RESET)cn<=0;elsebegincn<=cn+1;case(cn)2'b00: begin DOUT[10:7]<=4'b0001; Temp1<=CDIN[3:0];end2'b01: begin DOUT[10:7]<=4'b0010; Temp1<=CDIN[7:4];end2'b10: begin DOUT[10:7]<=4'b0100; Temp1<=CDIN[11:8];end2'b11: begin DOUT[10:7]<=4'b1000; Temp1<=CDIN[15:12];endendcaseendendalways @(Temp1) //译码显示begincase(Temp1)4'b0000: DOUT[6:0]<=7'b0111111; //3fh=04'b0001: DOUT[6:0]<=7'b0000110; //06h=14'b0010: DOUT[6:0]<=7'b1010110; //56h=24'b0011: DOUT[6:0]<=7'b1001111; //4fh=34'b0100: DOUT[6:0]<=7'b1100110; //66h=44'b0101: DOUT[6:0]<=7'b1101101; //6dh=54'b0110: DOUT[6:0]<=7'b1111101; //7dh=64'b0111: DOUT[6:0]<=7'b0000111; //07h=74'b1000: DOUT[6:0]<=7'b1111111; //7fh=84'b1001: DOUT[6:0]<=7'b1101111; //6fh=9default: DOUT[6:0]<=7'b0111111; //3fhendcaseendendmodule顶层verilog程序:moduleFREQUENCY_COUNTER_DISPL Y_BLOCK(DOUT,FLOW_UP,CLK,TEST_CLK_IN,RESET) ;output[10:0] DOUT;output FLOW_UP;input CLK;input TEST_CLK_IN;input RESET;wire gated_clk,load,counter_clr;wire[15:0] cout_cdin;FREQUENCY_COUNTROL_BLOCKu1(.GATED_CLK(gated_clk),.LOAD(load),.COUNTER_CLR(counter_clr),.CLK_IN(CLK),.SIG NAL_TEST(TEST_CLK_IN),.RESET(RESET));FREQUENCY_COUNTER_BLOCKu2(.COUT(cout_cdin),.FLOW_UP(FLOW_UP),.CLOCK_IN(gated_clk),.RESET(RESET),.LOA D(load),.COUNTER_CLR(counter_clr));FREQUENCY_DISPL Y_BLOCKu3(.DOUT(DOUT),.DCLK_IN(CLK),.RESET(RESET),.CDIN(cout_cdin));endmodule五、仿真结果分析仿真结果如图所示,输入标准时钟频率为1MHz,经过分频后变成频率为0.5Hz的信号,将其与测试信号相与得到采样信号GATED_CLK,同时利用测试信号和0.5Hz的分频信号可以产生LOAD信号和COUNTER_CLR信号,它们和采样信号的关系在图上可以清楚的看出。
四位数字频率计实验报告

数字逻辑电路大型实验报告姓名指导教师专业班级学院信息工程学院提交日期一、实验目的学习用FPGA实现数字系统的方法二、实验内容1.FPGA, Quartus II 和VHDL使用练习2.四位数字频率计的设计三、四位数字频率计的设计1.工作原理当系统正常工作时,8Hz信号测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
工作原理图如下:2.设计方案1) 整形电路:整形电路是将待测信号整形变成计数器所要求的脉冲信号2)控制信号产生器(分频电路):用8Hz时钟信号产生1Hz时钟信号、锁存器信号和cs信号3)计时器:采用级联的方式表示4位数4)锁存器:计数结束后的结果在锁存信号控制下锁存5)译码器:将锁存的计数结果转换为七段显示码3.顶层原理图(总图)注:①CLK1:8Hz时钟信号输入; CLKIN:待测信号输入;②显像时自左而右分别是个位、十位、百位、千位;③顶层原理图中:(1)consignal模块:为频率计的控制器,产生满足时序要求的三个控制信号;(2)cnt10模块:有四个,组成四位十进制(0000-1001)计数器,使计数器可以从0计数到9999;(3)lock模块:有四个,锁存计数结果;(4)decoder模块:有四个,将8421BCD码的锁存结果转换为七段显示码。
4.底层4个模块(控制信号产生模块,十进制计数器模块,锁存器模块,译码模块)的仿真结果。
cnt10模块(十进制计数器模块):输入:CLK:待测量的频率信号(时钟信号模拟);CLR:清零信号,当clr=1时计数器清零,输出始终为0000,只有当clr=0时,计数器才正常计数CS:闸门信号,当cs=1时接收clk计数,当cs=0时,不接收clk,输出为0;输出:co:进位信号,图中,在1001(9)的上方产生一个进位信号0,其余为1。
四位数字频率计实验报告

数字逻辑电路大型实验报告姓名指导教师专业班级学院信息工程学院提交日期1一、实验目的学习用FPGA实现数字系统的方法二、实验内容1.FPGA, Quartus II 和VHDL使用练习2.四位数字频率计的设计三、四位数字频率计的设计1.工作原理当系统正常工作时,8Hz信号测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
工作原理图如下:2.设计方案21) 整形电路:整形电路是将待测信号整形变成计数器所要求的脉冲信号2)控制信号产生器(分频电路):用8Hz时钟信号产生1Hz时钟信号、锁存器信号和cs信号3)计时器:采用级联的方式表示4位数4)锁存器:计数结束后的结果在锁存信号控制下锁存5)译码器:将锁存的计数结果转换为七段显示码3.顶层原理图(总图)3注:①CLK1:8Hz时钟信号输入; CLKIN:待测信号输入;②显像时自左而右分别是个位、十位、百位、千位;③顶层原理图中:(1)consignal模块:为频率计的控制器,产生满足时序要求的三个控制信号;(2)cnt10模块:有四个,组成四位十进制(0000-1001)计数器,使计数器可以从0计数到9999;(3)lock模块:有四个,锁存计数结果;(4)decoder模块:有四个,将8421BCD码的锁存结果转换为七段显示码。
4.底层4个模块(控制信号产生模块,十进制计数器模块,锁存器模块,译码模块)的仿真结果。
cnt10模块(十进制计数器模块):输入:CLK:待测量的频率信号(时钟信号模拟);CLR:清零信号,当clr=1时计数器清零,输出始终为0000,只有当clr=0时,计数器才正常计数CS:闸门信号,当cs=1时接收clk计数,当cs=0时,不接收clk,输出为0;输出:4co:进位信号,图中,在1001(9)的上方产生一个进位信号0,其余为1。
verilog之四位计数器(编译仿真查看波形)

verilog之四位计数器(编译仿真查看波形)先上⼀段计数器的verilog代码:/*4位计数器这例⼦⾮常好的表达了⼀个概念就是同步复位的概念。
这个概念⾮常重要,在XILINX的器件所有硬核都使⽤同步复位。
如果使⽤异步复位需要多耗费资源。
接着说计数器,计数器必须有时钟,如果要能进⼊到初始值,必须有复位输⼊。
和⼀个计数器的输出。
该4位计数器,三个选项全部具备。
在时钟上升沿,如果复位信号有效,则复位为0,如果复位信号⽆效,则计数器需要加⼀。
另外让⼤家思考下,如果是计数器的最⼤值是 13怎么办?低电平复位时钟上升沿计数*/module count4(out,reset,clk);output[3:0] out;input reset,clk;reg[3:0] out;always @(posedge clk)beginif (reset)out<=0; //同步复位elseout<=out+1'b1; //计数endendmodule再附⼀⾸testbeach:/*File Name : ctr_tb.vDescription : The testbench of the ctr_4.vWritten By : LiMingData : 2011/04/19 16:13modefied : Period = 4ns*/`timescale 1ns/1nsmodule test;/*Make a reset that pulses once.*/reg reset = 0;initialbegin#2 reset = 1; //reset#3 reset = 0; //start count#24 reset = 1; //reset#2 reset = 0; //start count#48 reset = 1; //reset#1 reset = 0; //start count#60 reset = 1; //reset#3 reset = 0; //start count#100 $stop;end/*Make a regular pulsing closk*/parameter clk_period = 4;reg clk;initialclk = 0;always #(clk_period/2)clk = ~clk;wire[3:0] out;count4 ctr(out,reset,clk);initial$monitor("At time %t, value = %h (%0d)",$time, out, out);initialbegin$dumpfile("test.lxt");$dumpvars(0,test);endendmodule再再附批处理⽂件:ECHO OFFECHO *********************************ECHO * Batch fileECHO *********************************ECHO *ECHO ONiverilog -o test ctr_4.v ctr_tb.vvvp -n test -lxt2gtkwave test.lxt运⾏结果:G:\Verilog HDL\examples\Verilog135\02_4bitctr>go.batG:\Verilog HDL\examples\Verilog135\02_4bitctr>ECHO OFF********************************** Batch file**********************************G:\Verilog HDL\examples\Verilog135\02_4bitctr>iverilog -o test ctr_4.v ctr_tb.v G:\Verilog HDL\examples\Verilog135\02_4bitctr>vvp -n test -lxt2LXT2 info: dumpfile test.lxt opened for output.At time 0, value = x (x)At time 2, value = 0 (0)At time 6, value = 1 (1)At time 10, value = 2 (2)At time 14, value = 3 (3)At time 18, value = 4 (4)At time 22, value = 5 (5)At time 26, value = 6 (6)At time 30, value = 0 (0)At time 34, value = 1 (1)At time 38, value = 2 (2)At time 42, value = 3 (3)At time 46, value = 4 (4)At time 50, value = 5 (5)At time 54, value = 6 (6)At time 58, value = 7 (7)At time 62, value = 8 (8)At time 66, value = 9 (9)At time 70, value = a (10)At time 74, value = b (11)At time 78, value = c (12)At time 82, value = d (13)At time 86, value = e (14)At time 90, value = f (15)At time 94, value = 0 (0)At time 98, value = 1 (1)At time 102, value = 2 (2)At time 106, value = 3 (3)At time 110, value = 4 (4)At time 114, value = 5 (5)At time 118, value = 6 (6)At time 122, value = 7 (7)At time 126, value = 8 (8)At time 130, value = 9 (9)At time 134, value = a (10)At time 138, value = b (11)At time 142, value = 0 (0)At time 146, value = 1 (1)At time 150, value = 2 (2)At time 154, value = 3 (3)At time 158, value = 4 (4)At time 162, value = 5 (5)At time 166, value = 6 (6)At time 170, value = 7 (7)At time 174, value = 8 (8)At time 178, value = 9 (9)At time 182, value = a (10)At time 186, value = b (11)At time 190, value = c (12)At time 194, value = d (13)At time 198, value = e (14)At time 202, value = f (15)At time 206, value = 0 (0)At time 210, value = 1 (1)At time 214, value = 2 (2)At time 218, value = 3 (3)At time 222, value = 4 (4)At time 226, value = 5 (5)At time 230, value = 6 (6)At time 234, value = 7 (7)At time 238, value = 8 (8)At time 242, value = 9 (9)G:\Verilog HDL\examples\Verilog135\02_4bitctr>gtkwave test.lxt GTKWave的波形图:全局复位0处的波形:复位1处的波形:复位2处的波形:复位3处的波形:。
4位数字频率计

摘要在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。
直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量,本设计中使用的就是直接测频法,即用计数器在计算1S内输入信号周期的个数。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
随着现场可编程单片机的广泛应用,运用单片机控制,将使整个系统大大简化,提高了系统的整体性能和可靠性。
关键词:频率测量;单片机;数据处理目录摘要 (1)目录 (2)一系统概述 (3)1.系统组成 (3)2.信号处理方法 (4)二器件简介 (6)1.主控制器A T89S52 (6)(1)MSC-51芯片资源简介.......................................................... 错误!未定义书签。
(2)单片机的引脚.............................................................................. 错误!未定义书签。
(3)89S51单机的电源线................................................................... 错误!未定义书签。
(4)89S51单片机的外接晶体引脚................................................... 错误!未定义书签。
实验五 4位十进制频率计设计

实验五4位十进制频率计设计一、实验目的:设计4位十进制频率计,学习较复杂的数字系统设计方法。
二、原理说明:根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。
这清0个信号可以由一个测频控制信号发生器产生,即图5-1中的TESTCTL,它的设计要求是,TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的EN使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。
【例5-1】10进制计数器,用于计算分频结果,并连接数码管显示。
module cnt10d(clk,rst,en,cq,cout);input clk;input rst;input en;output[3:0] cq;output cout;reg[3:0] cq;reg cout;always@(posedge clk or posedge rst)begin if(rst) cq<=4'b0000;else if(en) begin if(cq<9) begin cq<=cq+1'b1;cout<=1'b0; endelse begin cq<=4'b0000; cout<=1'b1; endendendendmodule【例5-2】--测频控制器,使得频率计能自动测频module testctl(clkk,cnt_en,rst_cnt,load);input clkk; // 1HZoutput cnt_en;output rst_cnt;output load;reg div2clk;wire cnt_en;reg rst_cnt;wire load;always@(posedge clkk)div2clk<=~div2clk;always @(clkk or div2clk) beginif(!clkk & !div2clk) rst_cnt<=1'b1;else rst_cnt<=1'b0;endassign load = ~div2clk;assign cnt_en = div2clk;endmodule【例5-3】锁存器,将频率计的每位数锁存后输出module reg4(clk,cq,led );input clk;input[3:0] cq;output[3:0] led;reg[3:0] led;always@(posedge clk)led<=cq;endmodule[例5-4] 用原理图方式将各模块连接起来也可以用.v文件实现系统组合。
基于FPGA四位十进制数字频率计设计

南通大学毕业设计(论文)摘要数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
随着现场可编程门阵列FPGA的广泛应用,以EDA工具作为开发手段,运用VHDL等硬件描述语言,将使整个系统大大简化,提高了系统的整体性能和可靠性。
采用FPGA现场可编程门阵列为控制核心,通过硬件描述语言VHDL编程,在QuartusII仿真平台上编译、仿真、调试,并下载到FPGA芯片上,通过严格的测试后,能够较准确地测量方波、正弦波、三角波、矩齿波等各种常用的信号的频率,而且还能对其他多种物理量进行测量。
关键词:硬件描述语言.现场可编程门阵列, 频率计, 频率测量ABSTRACTDigital frequency meter is a digital circuit in a typical application, the actual hardware design of devices used in more complicated connection, but will have relatively large delay, caused by measurement error, poor reliability. With the FPGA field programmable gate array a wide range of applications to the development of EDA tools as a means of using the VHDL hardware description language such as language, will greatly simplify the whole system to improve overall system performance and reliability.The use of field programmable gate array FPGA for the control of the core, through the VHDL hardware description language programming, in QuartusII compiled simulation platform, simulation, debugging, and downloaded to the FPGA chip, through rigorous testing, to more accurately measure square wave, sine wave, triangle wave, moment-tooth wave signals such as the frequency of commonly used, but also a variety of other physical measurements..Key words:VHDL, FPGA, the cymometer ,the frequency measurement目录摘要 (I)ABSTRACT .................................................................................................................. I I摘要 (I)ABSTRACT ............................................ I I前言 (1)第一章 FPGA及VHDL (2)1.1 FPGA简介 (2)1.2 EP1K 30相关说明 (2)(5)具有实现快速加法器和计数器的专用进位链和实现高速、多输入逻辑函数的专用级连链。
基于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芯片中进行硬件实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单4位数字频率计设计一、设计要求(1)、利用Verilog HDL语言行为描述方法,设计一个简单的4位数字频率计;(2)、要求输入标准时钟信号频率为1MHz,系统可计数频率围为1Hz~9999Hz;(3)、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示(动态扫描显示)。
二、系统结构框图4位数字频率计系统结构框图根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s占空比50%的信号,用来对输入信号采样,得到采样信号GATED_CLK;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD和COUNTER_CLR,LOAD信号控制计数完成后的数据及时输出给显示,COUNTER_CLR信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP;显示控制模块要完成将计数模块输入的信号进行译码显示。
三、信号描述测试信号采样原理:Gated signalSignal for testTo displaySignal for testGATED_CLK 、LOAD、COUNTER_CLR 信号的关系:COUNTER_CLRGATED_CLKLOAD程序中用到的信号变量:四、Verilog程序各子模块verilog程序:(1)信号处理模块_verilog:moduleFREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNAL _TEST,RESET);output GATED_CLK;output LOAD;output COUNTER_CLR;input CLK_IN;input SIGNAL_TEST;input RESET;reg LOAD;reg COUNTER_CLR;reg DIVIDE_CLK;reg[19:0];reg A1,A2;//信号分频:由CLK_IN得到分频后的信号DIVIDE_CLK(0.5Hz)always (posedge CLK_IN)beginif(RESET)beginDIVIDE_CLK<=0;cn<=0;endelse if(cn==1000000)begincn<=0;DIVIDE_CLK<=~DIVIDE_CLK;endelsecn<=cn+1;end//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always (posedge SIGNAL_TEST)beginA1<=~DIVIDE_CLK;endalways (posedge SIGNAL_TEST)beginA2=A1;endalways (A1 or A2)beginLOAD=A1&&(!A2);endalways (posedge SIGNAL_TEST)COUNTER_CLR=LOAD;//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号assign GATED_CLK=SIGNAL_TEST&DIVIDE_CLK;endmodule(2)、计数器模块:moduleFREQUENCY_COUNTER_BLOCK(COUT,FLOW_UP,CLOCK_IN,RESET,LOAD,COUNTER_ CLR);output[15:0] COUT;output FLOW_UP;input CLOCK_IN;input LOAD;input COUNTER_CLR;input RESET;reg[15:0] TEMP;reg FLOW_UP;parameter B_SIZE=16; //二进制位宽,为便于移植,所有定义了成参数reg[B_SIZE+3:0] bcd; //转换后的BCD码的位数要比二进制多4位reg[B_SIZE-1:0] binary;reg[B_SIZE-1:0] bin;reg[B_SIZE+3:0] result;//计数器完成计数得到二进制表示的频率数值always (CLOCK_IN or RESET or LOAD or COUNTER_CLR) beginif(RESET|COUNTER_CLR)beginTEMP<=0;FLOW_UP<=0;endelse if(LOAD)binary<=TEMP;else if(TEMP>9999)beginFLOW_UP<=1;binary<=9999;endelseif(CLOCK_IN)TEMP<=TEMP+1;end//将二进制表示(或十六进制表示)的数转换为BCD码的形式,便于数码管译码显示always (binary or RESET)beginbin=binary;result=0;if(RESET)bcd<=0;elsebeginrepeat(B_SIZE-1)beginresult[0]=bin[B_SIZE-1];if(result[3:0]>4)result[3:0]=result[3:0]+4'd3;if(result[7:4]>4)result[7:4]=result[7:4]+4'd3;if(result[11:8]>4)result[11:8]=result[11:8]+4'd3;if(result[15:12]>4)result[15:12]=result[15:12]+4'd3;if(result[19:16]>4)result[19:16]=result[19:16]+4'd3;result=result<<1;bin=bin<<1;endresult[0]=bin[B_SIZE-1];bcd<=result;endendassign COUT=bcd[15:0];endmodule(3)信号显示处理:module FREQUENCY_DISPLY_BLOCK(DOUT,DCLK_IN,RESET,CDIN);output[10:0] DOUT;input[15:0] CDIN;input DCLK_IN;input RESET;reg[10:0] DOUT;reg[3:0] Temp1;reg[1:0] ;always (posedge DCLK_IN) //设置成动态扫描beginif(RESET)cn<=0;elsebegincn<=cn+1;case(cn)2'b00: begin DOUT[10:7]<=4'b0001; Temp1<=CDIN[3:0];end2'b01: begin DOUT[10:7]<=4'b0010; Temp1<=CDIN[7:4];end2'b10: begin DOUT[10:7]<=4'b0100; Temp1<=CDIN[11:8];end2'b11: begin DOUT[10:7]<=4'b1000; Temp1<=CDIN[15:12];endendcaseendendalways (T emp1) //译码显示begincase(Temp1)4'b0000: DOUT[6:0]<=7'b0111111; //3fh=04'b0001: DOUT[6:0]<=7'b0000110; //06h=14'b0010: DOUT[6:0]<=7'b1010110; //56h=24'b0011: DOUT[6:0]<=7'b1001111; //4fh=34'b0100: DOUT[6:0]<=7'b1100110; //66h=44'b0101: DOUT[6:0]<=7'b1101101; //6dh=54'b0110: DOUT[6:0]<=7'b1111101; //7dh=64'b0111: DOUT[6:0]<=7'b0000111; //07h=74'b1000: DOUT[6:0]<=7'b1111111; //7fh=84'b1001: DOUT[6:0]<=7'b1101111; //6fh=9default: DOUT[6:0]<=7'b0111111; //3fhendcaseendendmodule顶层verilog程序:moduleFREQUENCY_COUNTER_DISPLY_BLOCK(DOUT,FLOW_UP,CLK,TEST_CLK_IN,RESET);output[10:0] DOUT;output FLOW_UP;input CLK;input TEST_CLK_IN;input RESET;wire gated_clk,load,counter_clr;wire[15:0] cout_cdin;FREQUENCY_COUNTROL_BLOCKu1(.GATED_CLK(gated_clk),.LOAD(load),.COUNTER_CLR(counter_clr),.CLK_IN(CLK),.S IGNAL_TEST(TEST_CLK_IN),.RESET(RESET));FREQUENCY_COUNTER_BLOCKu2(.COUT(cout_cdin),.FLOW_UP(FLOW_UP),.CLOCK_IN(gated_clk),.RESET(RESET),.LO AD(load),.COUNTER_CLR(counter_clr));FREQUENCY_DISPLY_BLOCKu3(.DOUT(DOUT),.DCLK_IN(CLK),.RESET(RESET),.CDIN(cout_cdin));endmodule五、仿真结果分析仿真结果如图所示,输入标准时钟频率为1MHz,经过分频后变成频率为0.5Hz的信号,将其与测试信号相与得到采样信号GATED_CLK,同时利用测试信号和0.5Hz的分频信号可以产生LOAD信号和COUNTER_CLR信号,它们和采样信号的关系在图上可以清楚的看出。