VerilogHDL语言四位数字频率计课程设计报告
- 格式:doc
- 大小:130.00 KB
- 文档页数:6
简单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信号,它们和采样信号的关系在图上可以清楚的看出。
根据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`引脚,可以检查计算的频率是否正确。
完成设计和测试台代码后,可以使用仿真工具对其进行仿真,以验证设计的正确性和性能。
数字逻辑电路大型实验报告姓名指导教师专业班级学院信息工程学院提交日期一、实验目的学习用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。
实验四 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位十进制频率计数器的设计摘要:生活中经常会用到频率计数器,我们习惯的是十进制的计数器,而且一位或两位的计数器又不能满足人们的日常需求,所以经常会需要多位的十进制频率计数器。
在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课程设计一、课程目标知识目标: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位全加器的功能仿真。
数字系统设计实验报告一、设计要求: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课程设计实验报告一、教学目标本课程旨在通过Verilog硬件描述语言的学习,让学生掌握数字电路设计的自动化工具,理解并实践硬件描述语言在数字系统设计中的应用。
通过本课程的学习,学生应达到以下目标:1.知识目标:–理解Verilog的基本语法和结构。
–掌握Verilog中的模块化设计方法。
–学习常用的Verilog描述技巧,包括逻辑门级建模、行为级建模和结构级建模。
2.技能目标:–能够运用Verilog语言进行简单的数字电路设计。
–学会使用至少一种Verilog仿真工具进行电路功能验证。
–能够阅读和理解Verilog代码,进行简单的代码优化。
3.情感态度价值观目标:–培养学生的团队合作意识,在实验报告中能够体现分工合作的精神。
–培养学生的问题解决能力,鼓励学生在遇到问题时积极寻找解决方案。
–培养学生对新技术的好奇心和学习兴趣,激发他们对电子工程领域的热爱。
二、教学内容依据教学目标,本课程的教学内容将围绕Verilog语言的基础知识、实践应用和项目设计展开。
教学大纲安排如下:1.第一部分:Verilog基础知识(2周)–介绍Verilog的背景和基本概念。
–详细讲解Verilog的数据类型、运算符和语句。
2.第二部分:模块化设计(2周)–讲解模块的定义和封装。
–实践模块的端口声明和模块实例化。
3.第三部分:数字电路的Verilog描述(2周)–通过实例教学,掌握逻辑门、触发器等基本组件的Verilog建模。
–学习组合逻辑和时序逻辑的设计方法。
4.第四部分:仿真与测试(1周)–学习使用仿真工具进行电路功能验证。
–理解并实践测试台(testbench)的编写。
5.第五部分:项目设计(3周)–小组合作完成一个较为复杂的数字系统设计项目。
–包括系统模块的划分、编码、仿真和测试。
三、教学方法为了提高学生的学习效果,将采用多种教学方法相结合的方式进行授课:1.讲授法:用于讲解Verilog的基本概念和语法。
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数字频率计概况频率是常用的物理量, 在实际测量过程中总是尽可能地把被测参量转换成频率参量进行测量。
一、实验名称数字频率计的设计二、实验地点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可以用来进行各种层次的逻辑设计,也可以进数字系统的逻辑综合,仿真验证和时序分析等。
一、实验名称数字频率计的设计二、实验地点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位十进制频率计的设计实验目的:设计一个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位十进制频率计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、设计一个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;endelsebegint<=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)begintp1<=’b0000;tp2<=cntp2+1;if(cntp2==’b1001)begintp2<=’b0000;tp3<=cntp3+1;if(cntp3==’b1001)begintp3<=’b0000;tp4<=cntp4+1;if(cntp4==’b1001)begintp4<=’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;tp1<='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<=c ntq2; 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;endelsebegint<=cnt+1;endendalways(posedge clkint)beginif(clk_cnt)beginif(cntp1==’b1001)begintp1<=’b0000;tp2<=cntp2+1;if(cntp2==’b1001)begintp2<=’b0000;tp3<=cntp3+1;if(cntp3==’b1001)begintp3<=’b0000;tp4<=cntp4+1;if(cntp4==’b1001)begint p4<=’b0000; led=1;endendendendelse begintp1<=cntp+1;endendelsebeginif(cntp1!=’b0000|cntp2!=’b0000|cntp3!=’b0000|cntp4!=’b0000 |) begincntq1<=cntp1;cntq2<=cntp2;cntq3<=cntp3;cntq4<=cntp4;tp1<='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 s can<=’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。