Verilog HDL语言 四位数字频率计 课程设计
用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信号,它们和采样信号的关系在图上可以清楚的看出。
实验三 4位十进制频率计设计

实验三4位十进制频率计设计一、实验目的1.掌握数字频率计的Verilog描述方法;2.学习设计仿真工具的使用方法3.学习层次化设计方法;二、实验原理根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽位1秒的输入信号脉冲计数允许信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一次测频计数周期做准备的计数器清零信号。
这3个信号由测频控制信号发生器产生,它的设计要求是,测频控制信号发生器的计数使能信号输出CNT_EN 能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN 高电平时,允许计数;当CNT_EN低电平时停止计数,并保持所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进各个锁存器REG4B中,并由外部的七段译码器译出,显示计数值。
设置锁存器的好处是,显示数据稳定,不会由于周期性的清零信号而不断闪烁。
信号锁存之后,还必须用清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作做准备。
三、实验内容1、用4位十进制计数器对用户输入时钟进行计数,计数间隔为1秒,计数满1秒后将计数值(即频率值)锁存到4位寄存器中显示,并将计数器清0,再进行下一次计数。
2、为上述设计建立元件符号3、设计仿真文件,进行验证。
4、编程下载并在实验箱上进行验证四、实验步骤程序源代码module FREG (clk1HZ,uclk,led0,led1,led2,led3,rst,en,load);input clk1HZ, uclk;output [3:0]led0,led1,led2,led3;output load,rst,en;wire in_load,in_rst,in_en,c0,c1,c2;wire [3:0]dout0,dout1,dout2,dout3;assign load=in_load;assign rst=in_rst;assign en=in_en;CNTL u1(.CLK(clk1HZ),.CNL_EN(in_en),.RST_CNL(in_rst),.LOAD(in_load));CNT10 u2 (.CLK(uclk),.EN(in_en),.RST(in_rst),.COUT(c0),.DOUT(dout0));CNT10 u3 (.CLK(c0),.EN(in_en),.RST(in_rst),.COUT(c1),.DOUT(dout1));CNT10 u4 (.CLK(c1),.EN(in_en),.RST(in_rst),.COUT(c2),.DOUT(dout2));CNT10 u5 (.CLK(c2),.EN(in_en),.RST(in_rst),.DOUT(dout3));RGB4 u6 (.DIN(dout0),.LOAD(in_load),.DOUT(led0));RGB4 u7 (.DIN(dout1),.LOAD(in_load),.DOUT(led1));RGB4 u8 (.DIN(dout2),.LOAD(in_load),.DOUT(led2));RGB4 u9 (.DIN(dout3),.LOAD(in_load),.DOUT(led3));endmodulemodule CNT10(CLK,RST,EN,COUT,DOUT); //4位计数器input CLK,RST,EN;output COUT;output[3:0] DOUT;reg[3:0] Q; reg COUT;always @ (posedge CLK or posedge RST)beginif(RST) Q=0;else if(EN) beginif(Q<9) Q=Q+1;else Q=0;endendalways @ (Q)if(Q==4'b1001) COUT=1;else COUT=0;assign DOUT=Q;endmodulemodule RGB4(DIN,LOAD,DOUT); //数据缓存器input LOAD;input[3:0] DIN;output[3:0] DOUT;reg[3:0] DOUT;always @ (posedge LOAD)DOUT=DIN;endmodulemodule CNTL(CLK,CNL_EN,RST_CNL,LOAD);//控制部分input CLK;output CNL_EN,RST_CNL,LOAD;reg CLKDIV,CNL_EN,LOAD,RST_CNL;always @ (posedge CLK)CLKDIV=~CLKDIV;always @ (posedge CLK) beginCNL_EN=CLKDIV;LOAD=~CLKDIV;endalways @ (CLK) beginif(CLK==1'b0&&CNL_EN==1'b0)RST_CNL=1;elseRST_CNL=0; endendmoduleRTL视图仿真结果功能分析:在波形中,CLK1HZ的频率为1HZ,以CLK1HZ为输入,产生en,rst,load的输出波形。
四位数字频率计实验报告

数字逻辑电路大型实验报告姓名指导教师专业班级学院信息工程学院提交日期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的数字频率计的设计(包含代码及仿真)

一、实验名称数字频率计的设计二、实验地点211楼303三、实验目的和任务(1) 了解数字电路设计的基本特点(2) 了解数字频率计电路的基本原理(3) 基本掌握ISE 软件的使用(设计输入、仿真、实现)(4) 了解可编程逻辑器件(FPGA )的一般情况(5) 基本掌握HDL 的使用四、实验内容(1) 设计出符合设计要求的解决方案(2) 设计出单元电路(3) 利用EDA 软件对各单元电路及整体电路进行仿真(4)利用EDA 软件在ELB 电子课程设计实验板实现设计(5) 观察实验结果五、项目需用仪器设备名称以及所需主要元器件PC 机、EDA教学实验系统一台,带有(SPARTAN -3A XC3S200A芯片,LED 管, 七段数码管等)的实验板一块, 跳线、下载电缆一根,函数发生器。
六、实验任务与要求频率测量范围为10Hz~10MHz,用6只数码管以kHz为单位显示测量结果;有三个带锁按键开关(任何时候都只会有一个被按下)用来选择1S、0.1S和0.01S三个闸门时间中的一个;有一个按钮开关用来使频率计复位;有两只LED,一只用来显示闸门的开与闭,另一只当计数器溢出时做溢出指示。
数字频率计的相关技术指标如下:1、位数:测量频率通过LED数码管为六位十进制数显示。
2、测试频率范围为:10HZ-10MHZ。
3、计数器溢出时要有溢出标志over。
4、需要有闸门标志gate。
5、显示工作方式:a、用BCD七段共阳极数码管显示读数,只有在读数不发生跳变时才是正确的结果。
b、采用记忆显示方法,即在一次测试结束时,显示测试结果,此显示值一直保留到下次测量显示数到来,才将上次显示更新。
用第二次测试结果,更新显示值。
6、要求被测输入信号应是符合数字电路要求的脉冲波。
七、verilog设计环境介绍VerilogVerilog HDL是目前应用最为广泛的硬件描述语言.Verilog HDL可以用来进行各种层次的逻辑设计,也可以进数字系统的逻辑综合,仿真验证和时序分析等。
实验四位计数器设计样本

实验四 4 位计数器设计1.实验目学习quartusii 和modelsim用法;学习原理图和veriloghdl混合输入设计办法;掌握4 位计数器设计设计及仿真办法。
2.实验原理依照下面FPGA内部电路,设计4 位计数器,并在在kx3c10F+开发板上实现该电路,并作仿真。
设计其中计数器模块CNT4B和数码管译码驱动模块DECL7SverilogHDL代码,并作出整个系统仿真。
2.1 4位计数器模块代码module CNT4B(out,CLK,RST);//定义模块名和各个端口output out;//定义输出端口input CLK,RST;//定义输入时钟和复位reg [3:0] out;//定义四位计数器always @(posedge CLK or negedge RST) //上升沿时钟和下降沿复位beginif(!RST) //低电平复位out <= 4'd0;elseout <= out + 1;//每一种clk计数endendmodule效果图:2.2七段数码管代码module segled(out1,a);//定义模块名和输入输出端口input [3:0]a;//输入一种3位矢量output [6:0]out1;//输出一种6位矢量reg [6:0]out1;//reg型变量用于always语句always@(a) //敏感信号abegincase(a) //case语句用于选取输出4'b0000:out1<=7'b0111111;4'b0001:out1<=7'b0000110;4'b0010:out1<=7'b1011011; 4'b0011:out1<=7'b1001111; 4'b0100:out1<=7'b1100110; 4'b0101:out1<=7'b1101101; 4'b0110:out1<=7'b1111101; 4'b0111:out1<=7'b0000111; 4'b1000:out1<=7'b1111111; 4'b1001:out1<=7'b1101111; 4'b1010:out1<=7'b1110111; 4'b1011:out1<=7'b1111100; 4'b1100:out1<=7'b0111001; 4'b1101:out1<=7'b1011110; 4'b1110:out1<=7'b1111001; 4'b1111:out1<=7'b1110001; endcaseendendmodule //模块结束效果图:2.3综合模块代码// Copyright (C) 1991- Altera Corporation// Your use of Altera Corporation's design tools,logic functions// and other software and tools,and its AMPP partner logic// functions,and any output files from any of the foregoing// (including device programming or simulation files),and any// associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License// Subscription Agreement,Altera MegaCore Function License// Agreement,or other applicable license agreement,including,// without limitation,that your use is for the sole purpose of// programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the// applicable agreement for further details.// PROGRAM "Quartus II 64-Bit"// VERSION "Version 13.1.0 Build 162 10/23/ SJ Web Edition" // CREATED "Tue Apr 11 22:35:09 "module cou(CLK,RST,Q);input wire CLK;input wire RST;output wire [6:0] Q;wire [3:0] SYNTHESIZED_WIRE_0; CNT4B b2v_inst(.CLK(CLK),.RST(RST),.out(SYNTHESIZED_WIRE_0)); segled b2v_inst1(.a(SYNTHESIZED_WIRE_0),.out1(Q));endmodule效果图:3.实验设备kx3c10F+开发板,电脑。
4位十进制频率计数器的设计(EDA论文)

4位十进制频率计数器的设计摘要:生活中经常会用到频率计数器,我们习惯的是十进制的计数器,而且一位或两位的计数器又不能满足人们的日常需求,所以经常会需要多位的十进制频率计数器。
在Quartus II 中,人们可以使用VHDL语言或者Verilog HDL语言来设计自己所需要的计数器。
并且Quartus II 中还可以对所设计的器件进行时序仿真,除此之外,Quartus II 还可以进行元件的封装,以便以后用到。
关键词:VHDL语言、Quartus II、4位十进制频率计数器、编译、时序仿真The Design of Four Decimal FrequencyCounterAbstract : We often use frequency counter in our life , we used is the decimal counter , and one or two counters can’t meet the demand of people’s dailly life , so we often need more than a decimal frequency counter . In the Quartus II , people can use VHDL or Verilog HDL language to design their own need to counter . And Quartus II can in timing simulation of the designed device , in addition , the Quartus II can be components encapsulation , for later use.Key words :VHDL language , Quartus II , Four Decimal Frequency Counter , compole , timing simulation一、EDA设计简介EDA,英文全称为Electronic Design Automation , 它是现代电子设计技术的核心,它依赖于功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL (Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、逻辑化简、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
4位全加器verilog课程设计

4位全加器verilog课程设计一、课程目标知识目标:1. 理解4位全加器的原理和功能,掌握其Verilog硬件描述语言实现方法。
2. 学习并掌握数字电路中加法器的基本结构和工作原理。
3. 掌握Verilog模块化编程,能够实现并测试4位全加器的基本功能。
技能目标:1. 能够运用Verilog语言编写4位全加器的代码,并进行功能仿真。
2. 学会使用硬件描述语言进行数字电路的设计,提高实际问题解决能力。
3. 能够对4位全加器进行调试和优化,提升编程实践技能。
情感态度价值观目标:1. 培养学生的团队合作意识,提高学生在项目实践中的沟通与协作能力。
2. 增强学生对数字电路设计领域的兴趣,激发学生的创新精神。
3. 引导学生树立正确的价值观,认识到科技发展对社会进步的重要性。
课程性质:本课程为电子信息工程及相关专业高年级的数字电路设计课程,旨在通过4位全加器的Verilog实现,让学生掌握数字电路设计的基本方法和实践技能。
学生特点:学生已具备一定的数字电路基础和Verilog编程知识,具备分析问题和解决问题的能力。
教学要求:注重理论与实践相结合,鼓励学生积极参与课堂讨论,培养学生的动手能力和实际操作技能。
通过课程学习,使学生在知识、技能和情感态度价值观方面均取得明显进步。
二、教学内容本课程教学内容主要包括以下几部分:1. 数字加法器原理回顾:介绍加法器的基本原理,重点讲解4位全加器的工作流程和关键特性。
- 教材章节:数字电路基础,第3章第2节。
2. Verilog硬件描述语言基础:复习Verilog的基本语法,强调模块化编程方法。
- 教材章节:硬件描述语言Verilog,第4章。
3. 4位全加器的Verilog设计:- 设计原理:讲解4位全加器的设计思路和实现方法。
- 代码编写:引导学生编写4位全加器的Verilog代码,并进行模块化设计。
- 教材章节:数字电路设计,第5章第3节。
4. 功能仿真与调试:- 介绍仿真工具和仿真方法,指导学生进行4位全加器的功能仿真。
基于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)。
1、设计目的和要求1、设计一个4位十进制数字频率计。
2、测量范围1~9999Hz,采用4位数码管显示,有溢出指示。
3、量程有1KHz,1MHz两档,用LED灯指示。
4、读数大于9999时,频率计处于超量程状态,发出溢出指示,下次量程,量程自动增大一档。
5、读数小时,频率计处于前量程状态,下次测量,量程自动减小一档。
6、采用记忆显示方式,在计数与显示电路中间加以锁存电路,每次计数结束,将计数结果送锁存器锁存,并保持到下一个计数结束。
2、设计原理1、基本原理频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求sysclk 能产生一个1s脉宽的周期信号,并对频率计的每一个计数器cntp的使能端进行同步控制。
当clK_cnt高电平时允许计数,并保持其所计的数。
在停止计数期间,首先需要一个锁存信号将计数器在前1s的计数值锁存进锁存器reg中,并由外部的7段译码器译出并稳定显示。
原理图如图1-1图1-12、模块原理根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、控制模块、计数模块、译码模块和量程自动切换模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
3、设计内容1、分频模块由于晶体振荡器提供的为50MHz的时钟,而在整个频率计里将用到周期为2s,半个周期为1s的闸门信号,所以我们在此模块先分频产生0.5Hz的分频信号。
always@(posedge sysclk)beginif(cnt==26’b10_1111_1010_1111_0000_1000_0000)begin clk_cnt<=~clk_cnt;cnt<=0;endelsebegin cnt<=cnt+1;endend二进制的26’b10_1111_1010_1111_0000_1000_0000,即为十进制的50x10^7,由程序中的clk_cnt<=~clk_cnt;cnt<=0;得知会产生我们想要的周期为2s的clk_int信号。
仿真结果如图1-2.图1-2 2、 4位十进制计数器模块4位十进制计数器模块包含4位十进制的计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有清零控制和进位扩展输出的功能。
always@(posedge clkint)beginif(clk_cnt)beginif(cntp1==’b1001)begin cntp1<=’b0000; cntp2<=cntp2+1;if(cntp2==’b1001)begin cntp2<=’b0000; cntp3<=cntp3+1;if(cntp3==’b1001)begin cntp3<=’b0000; cntp4<=cntp4+1;i f(cntp4==’b1001)begin cntp4<=’b0000; led=1;本程序采用的是以累加的方法结合巧妙地if语句进行四重循环,实现四位十进制不同的高低级别,实现计数。
一位十进制原理图仿真如图1-3。
图1-3 四位十进制原理图仿真如图1-4。
图1-4 3、锁存模块如果计数器输出直接与译码器相连接,那么在计数过程中输出端则随输入脉冲数的增加而不断跳变,那么显示数码管则也会不断闪烁跳变,让人不能看到稳定的输出,设锁存器后,则不再跳变,便可清晰读出计数结果。
其生成的功能模块如图所示:if(cntp1!=’b0000|cntp2!=’b0000|cntp3!=’b0000|cntp4!=’b0000)begincntq1<=cntp1;cntq2<=cntp2;cntq3<=cntp3;cntq4<=cntp4;cntp1<='b0000;cntp2<=’b0000;cntp3<=’b0000;cntp4<=’b0000;4、动态扫描模块本设计采用扫描方式来实现LED数码管动态显示,控制好数码管之间的延迟时间相当重要。
根据人眼视觉暂留原理,LED数码管每秒导通16次以上,人眼就无法LED数码管短暂的不亮,认为是一直点亮的(其实LED数码管是以一定频率在闪动的)。
但是,延时(导通频率)也不是越小越好,因为LED数码管达到一定亮度需要一定时间。
如果延时控制的不好则会出现闪动,或者亮度不够,根据经验,延时0.005S可以达到满意的效果。
另外,显示的字符有变化时,可在延时到达后送一个地电平(共阴极数码管)LED数码管先短暂熄灭,再显示一个字符,可使在视觉上字符的变化更清楚。
begincase(cnt[14:13])'b00:begin scan<=’b00000001;dat<=cntq1; end'b01:begin scan<=’b00000010;dat<=cntq2; end'b10:begin scan<=’b00000100;dat<=cntq3; end'b11:begin scan<=’b00001000;dat<=cntq4; enddefault:begin scan<=’bx;dat<=’bx; end5、译码模块译码模块是对计数出的数进行译码显示出来。
endcasecase(dat[3:0])4’b0000:begin seg7[6:0]=7’b1111110:end4’b0001:seg7[6:0]=7’b0110000;4’b0010:seg7[6:0]=7’b1101101;4’b0011:seg7[6:0]=7’b1111001;4’b0100:seg7[6:0]=7’b0110011;4’b0101:seg7[6:0]=7’b1011011;4’b0110:seg7[6:0]=7’b1011111;4’b0111:seg7[6:0]=7’b1110000;4’b1000:seg7[6:0]=7’b1111111;4’b1001:seg7[6:0]=7’b1111011;default:seg7[6:0]=’bX;其中分别对应着十进制的0—9这是个数字。
6、编译仿真最后的程序的编译仿真结果如图1-5。
图1-5附录1:module cymometer(seg7,scan,sysclk,clkin);output[6:0]seg7;output[7:0]scan;output led;reg led;input sysclk; //20MHz时钟信号input clkin;reg[6:0]seg7;reg[7:0]scan;reg[25:0]cnt;reg clk_cnt;reg[2:0]cntp1,cntp2,cntp3,cntp4;reg[2:0]cntq1,cntq2,cntq3,cntq4;reg[3:0]dat;always@(posedge sysclk)beginif(cnt==26’b1_0111_1101_0111_1000_0100_0000)begin clk_cnt<=~clk_cnt;cnt<=0;endelsebegin cnt<=cnt+1;endendalways@(posedge clkint)beginif(clk_cnt)beginif(cntp1==’b1001)begin cntp1<=’b0000; cntp2<=cntp2+1;if(cntp2==’b1001)begin cntp2<=’b0000; cntp3<=cntp3+1;if(cntp3==’b1001)begin cntp3<=’b0000; cntp4<=cntp4+1;if(cntp4==’b1001)begin cntp4<=’b0000; led=1;endendendendelse begin cntp1<=cntp+1;endendelsebeginif(cntp1!=’b0000|cntp2!=’b0000|cntp3!=’b0000|cntp4!=’b0000 |)cntq1<=cntp1;cntq2<=cntp2;cntq3<=cntp3;cntq4<=cntp4;cntp1<='b0000;cntp2<=’b0000;cntp3<=’b0000;cntp4<=’b0000; end endendalwaysbegincase(cnt[14:13])'b00:begin scan<=’b00000001;dat<=cntq1; end'b01:begin scan<=’b00000010;dat<=cntq2; end'b10:begin scan<=’b00000100;dat<=cntq3; end'b11:begin scan<=’b00001000;dat<=cntq4; enddefault:begin scan<=’bx;dat<=’bx; endendcasecase(dat[3:0])4’b0000:begin seg7[6:0]=7’b1111110:end4’b0001:seg7[6:0]=7’b0110000;4’b0010:seg7[6:0]=7’b1101101;4’b0011:seg7[6:0]=7’b1111001;4’b0100:seg7[6:0]=7’b0110011;4’b0101:seg7[6:0]=7’b1011011;4’b0110:seg7[6:0]=7’b1011111;4’b0111:seg7[6:0]=7’b1110000;4’b1000:seg7[6:0]=7’b1111111;4’b1001:seg7[6:0]=7’b1111011;default:seg7[6:0]=’bX;endcaseendendmodule。