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芯片中进行硬件实现。
vhdl语言描述的4位十进制的频率计的设计
实验七4位十进制频率计的设计实验目的:设计一个4位十进制频率计,学习复杂数字系统的设计方法。
实验原理:根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的脉冲计数允许信号,1秒计数结束后,计数值(即所测信号频率)锁入锁存器,并为下一次测频作准备,即将计数器清零。
试验内容:1、根据频率计的工作原理,将电路划分成控制器、计数器、锁存器和LED显示几个模块,控制器——产生1秒脉宽的计数允许信号、锁存信号和计数器清零信号计数器——对输入信号的脉冲数进行累计锁存器——锁存测得的频率值LED显示——将频率值显示在数码管上顶层文件框图如下:2、用元件例化语句写出频率计的顶层文件。
3、用VHDL硬件描述语言进行模块电路的设计。
本实验中不少模块在之前的实验中已经有所涉及,只需要对以前的设计做部分修改即可用于这次实验。
提示:十进制计数器输出的应是4位十进制数的BCD码,因此输出一共是4×4bit。
4、用QuartusII对设计进行编译、综合、仿真,给出仿真波形和时序分析数据(不包括数码管显示部分)。
5、通过QuartusII集成环境,将设计下载到实验电路上进行硬件测试。
实验结果:各模块电路的VHDL描述:10进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 isport (rst,fx,ena:in std_logic;cout: out std_logic;outy :out std_logic_vector(3 downto 0)); end cnt10;architecture behv of cnt10 isbeginprocess (rst,ena,fx)variable cqi :std_logic_vector(3 downto 0);beginif rst='1' then cqi :=(others =>'0');elsif fx'event and fx='1' thenif ena ='1' thenif cqi < 9 then cqi:=cqi+1;cout<='0';elsif cqi=9 thencqi :=(others =>'0');cout<='1';end if;elsif ena='0' then cqi:=(others =>'0');end if;end if;outy <=cqi;end process;end behv;4位10进计数器library ieee;use ieee.std_logic_1164.all;entity cnt10_4 isport(fx,rst,ena:in std_logic;d:out std_logic_vector(15 downto 0));end entity;architecture one of cnt10_4 iscomponent cnt10port (rst,fx,ena:in std_logic;cout: out std_logic;outy :out std_logic_vector(3 downto 0));end component;signal e:std_logic_vector(3 downto 0);beginu1:cnt10 port map(fx=>fx,rst=>rst,ena=>ena,cout=>e(0),outy=>d(3 downto 0));u2:cnt10 port map(fx=>e(0),rst=>rst,ena=>ena,cout=>e(1),outy=>d(7 downto 4));。
FPGA—4位十进制频率计
FPGA—4位十进制频率计4位十进制频率计一、设计目的用Verilog HDL语言设计一个能实现自动测频的4位十进制频率计。
1)测量范围: 1Hz~9999Hz2)测量的数值通过4个数码管显示3)频率超过9999Hz时,溢出指示灯亮,可以作为扩大测量范围的接口。
二、设计原理1、若某一信号在T秒时间里重复变化了N 次,则根据频率的定义可知该信号的频率fs 为:fs=N/T。
2、当T=1s时,N就是测得的频率。
3、根据以上所提出的方法,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器复位信号。
这个复位信号可以由一个测频控制信号发生器产生,即图1中的TESTCTL,它的设计要求是,TESTCTL 的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的EN使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,每0.01ms锁存器进行一次锁存,并由数码管显示计数值。
设置锁存器是为了使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作准备。
图3 芯片信息配置由于我们所采用的板子为RCXQ208_V5 FPGA开发板,所以配置如图所示。
1、新建各个分模块并输入代码。
图4 建立VHDL文件2、建立顶层文件为原理图型,例化各个模块并连接。
图5 建立VHDL文件3、对设计进行综合,如果出现错误,根据提示改正。
图6 综合黄色感叹符号代表有警告,有些警告可以忽略,绿色小勾表示综合成功。
4、建立测试文件并进行仿真,验证设计。
图7 建立激励文件之后一直点击确认即可。
为了结合我们的下载板子的时钟信号,在测试文件中设置时钟单位为10ns,精度为1ps,如图:图8 设置时钟单位仿真文件应验证个端口的正确性。
实验报告模板:实验四 数字频率计设计
实验四数字频率计设计(1)【实验目的】1.掌握数字频率计的Verilog描述方法;2.学习设计仿真工具的使用方法;3.学习层次化设计方法;【实验内容】1.用4位十进制计数器对用户输入时钟进行计数, 计数间隔为1秒, 计数满1秒后将计数值(即频率值)锁存到4位寄存器中显示, 并将计数器清0, 再进行下一次计数。
2.为上述设计建立元件符号【实验原理】设计clk为1秒的计数器, 对用户输入的时钟进行计数, 所以记数间隔为1秒。
而在计数器后是寄存器, 所以可以将产生的数据放在寄存器里进行寄存, 然后再进行4位到7位转换, 在led上显示。
【程序源代码】(加注释)module CNT(CLKK,CNT_EN,RST_CNT,LOAD);input CLKK;output CNT_EN,RST_CNT,LOAD;wire CNT_EN,LOAD;reg RST_CNT,div2clk;always @(posedge CLKK) //定义CLKK为上升沿敏感信号div2clk<=~div2clk;always@(CLKK or div2clk)beginif(CLKK==1'b0&div2clk==1'b0)RST_CNT<=1'b1; //使用非阻塞赋值语句else RST_CNT<=1'b0;endassign LOAD=~div2clk;assign CNT_EN=div2clk;endmodule //模块结束module C10(CLK,EN,RST,COUT,DOUT);input CLK,EN,RST;output COUT;output [3:0]DOUT; //定义DOUT为4位带宽reg[3:0]Q; //定义Q为4位位宽reg COUT;assign DOUT=Q;always@(posedge CLK or posedge RST)beginif(RST)Q=0;else if(EN)beginif(Q<9)Q=Q+1; //当Q小于9时Q=Q+1else Q=0;endendalways@(Q)if(Q==4'b1001) //当Q为4位的1001时执行语句COUT=1;elseCOUT=0;endmodulemodule RGB4(DIN,LOAD,Dout);input LOAD;input [3:0] DIN; //定义DIN为4位位宽output [3:0] Dout;reg [3:0] Dout; //定义Dout为4位位宽的寄存器变量always@(posedge LOAD)Dout=DIN;endmodulemodule LED(in,led7);input [3:0] in;output [6:0] led7;reg [6:0] led7; //定义了led7为4位位宽的寄存器变量always@(in)begincase(in) //使用case语句0:led7<=7'b0111111; //in=0时输出7位的二进制01111111:led7<=7'b0000110; // in=1时输出7位的二进制00001102:led7<=7'b1011011; // in=2时输出7位的二进制10110113:led7<=7'b1001111; // in=3时输出7位的二进制10011114:led7<=7'b1100110; // in=4时输出7位的二进制11001105:led7<=7'b1101101; //in=5时输出7位的二进制11011016:led7<=7'b1111101; // in=6时输出7位的二进制11111017:led7<=7'b0000111; // in=7时输出7位的二进制00001118:led7<=7'b1111111; // in=8时输出7位的二进制11111119:led7<=7'b1101111; // in=9时输出7位的二进制1101111default led7<=7'b1110111; //当出现错误时输出7位二进制1110111endcaseendendmodulemodule freg(CLK1,UCLK,led0,led1,led2,led3,rst,en,load);input CLK1,UCLK;output[6:0] led0,led1,led2,led3;output rst,en,load;wire [3:0] dout0,dout1,dout2,dout3, //定义dout0, dout1, dout2, dout3为网线型变量trs0,trs1,trs2,trs3;wire inload,inrst,inen,co,c1,c2; //定义inload, inrst, inen, c1, c2为网线型变量assign rst=inrst,load=inload,en=inen;CNT u1(.CLKK(CLK1),.CNT_EN(inen),.RST_CNT(inrst),.LOAD(inload)); //例化CNT模块C10 u2(.CLK(UCLK),.EN(inen),.RST(inrst),.COUT(c0),.DOUT(dout0));C10 u3(.CLK(c0),.EN(inen),.RST(inrst),.COUT(c1),.DOUT(dout1));C10 u4(.CLK(c1),.EN(inen),.RST(inrst),.COUT(c2),.DOUT(dout2));C10 u5(.CLK(c2),.EN(inen),.RST(inrst),.DOUT(dout3));RGB4 u6(.DIN(dout0),.LOAD(inload),.Dout(trs0));RGB4 u7(.DIN(dout1),.LOAD(inload),.Dout(trs1));RGB4 u8(.DIN(dout2),.LOAD(inload),.Dout(trs2));RGB4 u9(.DIN(dout3),.LOAD(inload),.Dout(trs3));LED u10(.in(trs0),.led7(led0));LED u11(.in(trs1),.led7(led1));LED u12(.in(trs2),.led7(led2));LED u13(.in(trs3),.led7(led3));endmodule【仿真和测试结果】【元件符号与总框图】【硬件仿真结果】:【实验心得和体会】随着做实验的次数越来越多, 我对QuartusII越来越熟悉, 对EDA也越来越熟悉, 对于这门课程也越来越有兴趣了, 我将会在接下来的学习中继续努力学习。
基于Verilog HDL数字频率计的设计
EDA设计课程论文题目基于Verilog HDL数字频率计的设计学院通信学院专业班级学生姓名大彬哥指导教师大陆会2013年5月17日EDA设计基础实验论文摘要频率是常用的物理量, 在实际测量过程中总是尽可能地把被测参量转换成频率参量进行测量。
例如工程中用振弦式方法测量力、时间测量、速度控制等, 都可转化为频率测量。
随着科学技术与计算机应用的不断发展, 以单片机作为核心的测量控制系统层出不穷。
在被测信号中, 较多的是模拟和数字开关信号, 此外还经常遇到以频率为参数的测量信号, 例如流量、转速、晶体压力传感器以及经过参变量一频率转换后的信号等等。
因此, 频率测量是电子测量技术中最基本的测量之一。
电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本文运用现代电子设计工具, 采用V er ilogHDL语言在CPLD器件上实现了简易数字频率计的设计。
在10Hz ~ 100MHz 频率测量范围内, 该频率计能根据输入被测频率信号, 自动调整测试量程进行测试并给出测试结果的BCD 码及七段LED 译码显示。
具有体积小、可靠性高、功耗低的特点。
关键词:数字频率计 Verilog_HDL 分频计数IEDA设计基础实验论文AbstractFrequency is a common physical quantities, in actual measurement process is always possible, the measured parameters are converted into the frequency parameter measurement. For example, engineering with vibrating method for measuring force, measurement of time, velocity control, can all be converted into frequency measurement. With the development of science and technology and the continuous development of computer applications, to single-chip microcomputer as the core control system for measuring the emerge in an endless stream. In the measured signal, more is analog and digital switch signal, in addition also frequently encountered with a frequency parameter measurement signal, such as flow rate, rotational speed, crystal pressure sensor and the variable frequency converted signal and so on. Therefore, the frequency measurement is the electronic measurement technology in the most fundamental measurement of.Electronic counter frequency measurement in two ways : one is the direct frequency measurement Law, or within a certain time gates of measured signal pulse number; two is the indirect frequency measurement Law, such as cycle frequency measurement method. Direct frequency measurement Law is applicable to the high frequency signal frequency measurement, indirect frequency measurement Law is applicable to low-frequency signals in the frequency measurement. The use of modern electronic design tool, using V Er ilogHDL language in CPLD device achieves simple digital frequency meter design. In the10Hz100MHz frequency measurement range, the frequency meter according to input the measured frequency signal, automatic adjustment and test range tested and the test results are given in the BCD code and the seven LED decoding display. Has the advantages of small volume, high reliability, low power consumption.Keywords: digital frequency meter Verilog_HDL frequency countingIIEDA设计基础实验论文目录摘要 (I)ABSTRACT (II)第1章绪论 (1)1.1数字频率计概况 (1)1.2本文研究内容 (1)1.3目的与意义 (2)第2章系统设计方案 (3)2.1数字频率计总体设计方案 (3)2.1.1 放大整形 (3)2.1.2 SW1、SW2、SW3按键 (3)2.1.3 标准时钟 (3)2.1.4 LED显示模块 (3)2.2系统的参数 (4)2.2.1 频率测量 (4)2.2.2 频率测量方法 (4)2.2.3 功能及技术指标 (4)第3章数字频率计的基本原理 (6)3.1计数模块COUNTER (6)3.2门控模块GATE_CONTROL (6)3.3分频模块FDIV (7)3.4寄存器模块FLIP_LATCH (7)3.5多路选择模块DATA_MUX (8)3.6动态位选模块DISPSELECT (9)3.7BCD译码模块DISPDECODER (11)第4章数字频率计软件设计 (15)4.1软件实现功能综述 (15)4.2多路选择模块DATA_MUX的设计 (15)4.2.1 多路选择模块data_mux的接口电路 (15)4.2.2 多路选择模块data_mux程序设计 (16)4.3动态位选模块DISPSELECT的设计 (17)4.3.1 动态位选模块dispselec的接口电路 (17)4.3.2 动态位选模块dispselec的程序设计 (17)IIIEDA设计基础实验论文4.4BCD译码模块DISPDECODER的设计 (18)4.4.1 BCD译码模块dispdecoder的接口电路 (18)4.4.2 BCD译码模块dispdecoder的程序设计 (19)第5章数字频率计系统的仿真分析 (23)5.1系统原理图 (23)5.2多路选择模块DATA_MUX的仿真分析 (24)5.3动态位选模块DISPSELEC的仿真分析 (25)5.4BCD译码模块DISPDECODER的仿真分析 (25)5.5软硬件调试 (26)结论 (28)参考文献 (29)IVEDA设计基础实验论文第1章绪论1.1数字频率计概况频率是常用的物理量, 在实际测量过程中总是尽可能地把被测参量转换成频率参量进行测量。
实验九 四位数字频率设计计数器设计
实验九 四位数字频率设计计数器设计实验报告一、实验要求 1、GW48实验箱;2、用层次设计方式设计100进制计数器,并进行编译、仿真、下载;3、总结实验步骤和实验结果。
二、实验内容采用一个标准的基准时钟,在单位时间里对被测信号的脉冲数进行计数,即为信号的频率。
4位数字频率计的顶层框图如图9.1所示,1、控制模块控制模块的作用是产生测频所需要的各种信号控制信号。
控制模块的标准输入时钟为1Hz ,每个时钟周期进行一次测频测量。
该模块产生3个控制信号,分别为COUNT_EN 、COUNT_CLK 和LOAD 。
COUNT_CLK 信号用于在每一次测量开始时对计数模块进行复位,以清除上次测量的结果。
复位信号高电平有效,持续半个时钟周期的时间。
COUNT_EN 信号为计数允许,在COUNT_EN 信号的上升沿时刻,计数模块开始对输入信号的频率进行测量,测量时间恰为一个时钟周期(正好为单位时间1s ),在此时间里对被测信号的脉冲进行计数,即为信号频率。
然后将该值所存,并送到数码管显示出来。
设置锁存器的好处是,显示的数据稳定,不会周期性的清零信号而不断闪烁。
在每一次测量开始时,都必须重新对计数模块清零。
控制模块所产生的几个控制信号的时序关系如图9.2所示。
图9.2 控制信号的时序关系从图中可以看出,计数使信号COUNT_EN取反产生一个锁存信号LOAD,随后产生清零信号COUNT_CLK。
2、锁存器模块锁存器模块也是比不可少的,测频模块测量完后,在LOAD信号的上升沿时刻将测量值锁存到寄存器中,然后输出,送到数码管上显示相应的数值。
3、计数模块计数模块用于在单位时间内输入信号的脉冲进行计数,该模块必须有计数允许、异步清零等端口,以便于控制。
如图9.3所示是四位数字频率计的顶层原理图。
其中fre-ctrl是控制模块,count10是计数模块,lath_16是16位所存模块。
这3个模块都采用文本方式设置实现。
Signal被测输入信号,clk为输入的基准时钟,qo[15..0]为输入数码管显示的频率计。
4位十进制频率计的设计 计算机与电子等专业课程设计
4位十进制频率计的设计计算机与电子等专业课程设计4位十进制频率计的设计一、主要指标和要求1.设计4位十进制频率计,学习较复杂的数字系统设计方法;2.深入学习数字系统设计的方法与步骤;3.用元件例化语句写出频率计的顶层文件;4.用VHDL硬件描述语言进行模块电路的设计;5.设计硬件要求:PC机,操作系统为Windows2000/XP,本课程所用系统均为max+plus II 5.1设计平台,GW48系列SOPC/EDA实验开发系统。
二、工作原理以及方案选择原理工作说明:根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。
这3个信号可以由一个测频控制信号发生器产生,即图(a)中的TESTCTL,它的设计要求是,TESTCTL的计数使能信号CNT_EN 能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要产生一个锁存信号LOAD,在该信号上升沿时,将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。
其工作时序波形如图(a)。
图(a) 频率计测频控制器TESTCTL测控时序图图 (b) 4位十进制频率计顶层文件原理图选择的设计方案:1.根据频率计的工作原理,将电路划分成控制器、计数器、锁存器和LED显示几个模块,控制器——产生1秒脉宽的计数允许信号、锁存信号和计数器清零信号计数器——对输入信号的脉冲数进行累计锁存器——锁存测得的频率值LED显示——将频率值显示在数码管上2.根据图(a)、(b)及(1)(2)描述的4位十进制频率计的工作原理,利用max+ plusII5.1对以上三者的程序进行文本编辑输入和仿真测试并根据图(b),写出频率计的顶层文件,并给出其测频时序波形,及其分析。
(总)基于Verilog的4位计数器源程序与testbench测试程序
1、简单4位计数器程序:module count4(clk,cnt);input clk;output reg[3:0]cnt=4'b0;always @(posedge clk)begincnt<=cnt+1;endendmodule测试程序:`timescale 1 ns/10 psmodule test_count4();reg clk=0;wire [3:0]cnt;count4 i1(.clk(clk),.cnt(cnt));always #10 clk=~clk;initialbegin$monitor($time,,,"clk=%d cnt=%d",clk,cnt); #400 $stop;endendmodule仿真波形:2、异步清零4位计数器源程序module count4_reset(clk,rst,cnt);input clk,rst;output reg[3:0]cnt=4'b0;always @(posedge clk or negedge rst)beginif(!rst) cnt<=4'b0;else cnt<=cnt+1;endendmodule测试程序`timescale 1 ns/10 psmodule test_count4_reset();reg clk=0;reg rst;wire [3:0]cnt;count4_reset i1(.clk(clk),.rst(rst),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;#20 rst=1;#45 rst=0;#10 rst=1;endinitialbegin$monitor($time,,,"clk=%d rst=%d cnt=%d",clk,rst,cnt);#800 $stop;endendmodule仿真波形3、异步清零、计数使能控制的4位计数器module count4_rst_en(clk,rst,en,cnt);input clk,rst,en;output [3:0]cnt;reg [3:0]cnt;always @(posedge clk or negedge rst)beginif(!rst) cnt<=0;else if(en==1) cnt<=cnt+1;endendmodule测试程序`timescale 1 ns/10 psmodule test_count4_rst_en();reg clk=0;reg rst,en;wire [3:0]cnt;count4_rst_en i1(.clk(clk),.rst(rst),.en(en),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;en=0;#15 en=1;#20 rst=1;#20 en=0;#20 en=1;rst=0;#20 rst=1;endinitialbegin$monitor($time,,,"clk=%d rst=%d en=%d cnt=%d",clk,rst,en,cnt);#800 $stop;endendmodule仿真波形:4、异步清零、计数使能、数据加载控制功能的4位计数器:module count4_rst_en_load(clk,rst,en,load,data,cnt);input clk,rst,en,load;input [3:0]data;output reg[3:0]cnt;always @(posedge clk or negedge rst)beginif(!rst) cnt<=0;else if(en==1)beginif(load) cnt<=data;else cnt<=cnt+1;endendendmodule测试程序:`timescale 1 ns/10 psmodule test_count4_rst_en_load();reg clk=0;reg rst,en,load;reg [3:0]data;wire [3:0]cnt;count4_rst_en_load i1(.clk(clk),.rst(rst),.en(en),.load(load),.data(data),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;en=0;load=0;data=4'd6;#20 en=1;#20 rst=1;#20 load=1;#20 rst=0;#20 rst=1;#20 load=0;endinitialbegin$monitor($time,,,"clk=%d rst=%d en=%d load=%d cnt=%d",clk,rst,en,load,data,cnt);#800 $stop;endendmodule仿真波形:。
- 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。