基于Verilog的数字频率计的设计(包含代码及仿真).doc

合集下载

用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信号,它们和采样信号的关系在图上可以清楚的看出。

根据Verilog的数字频率计的设计

根据Verilog的数字频率计的设计

根据Verilog的数字频率计的设计以下是一个使用Verilog设计并仿真的数字频率计的示例:```verilogmodule frequency_counterinput reset,input clk,output reg [31:0] frequencyreg [31:0] count;reg [31:0] prev_count;reg counting;if (reset) begincounting <= 0;count <= 0;prev_count <= 0;end else beginprev_count <= count;count <= count + 1;if (prev_count == 0) begincounting <= 1;counting <= 0;frequency <= count;count <= 0;endendendendmodule```为了仿真该模块,可以使用任何支持Verilog仿真的工具,如ModelSim。

以下是一个对该模块进行仿真的示例测试台代码:```verilogmodule frequency_counter_tb;reg reset;reg clk;wire [31:0] frequency;frequency_counter dut.reset(reset),.clk(clk),.frequency(frequency)initial beginreset = 1;;reset = 0;endalways begin;clk = ~clk;endendmodule```在上述测试台代码中,引脚`reset`和`clk`通过不断的切换来产生复位和时钟信号。

然后,通过监视`frequency`引脚,可以检查计算的频率是否正确。

完成设计和测试台代码后,可以使用仿真工具对其进行仿真,以验证设计的正确性和性能。

基于fpga控制的数字频率计设计(含程序、仿真图)大学毕设论文

基于fpga控制的数字频率计设计(含程序、仿真图)大学毕设论文

目录1 引言 (1)1.1 课题背景 (1)1.2 课题意义 (2)1.3 国内外现状及发展趋势 (2)1.4 系统开发环境及技术分析 (3)1.4.1 FPGA开发简介 (3)1.4.2 VHDL特点及设计方法 (5)2 需求分析 (7)2.1 系统基本要求 (7)2.2 系统结构 (7)3 系统设计 (8)3.1 总体方案比较 (8)3.2 程序流程图 (10)3.3 系统模块设计 (11)3.3.1 整形电路 (11)3.3.2 计数器 (12)3.3.3分频器 (14)3.3.4锁存器 (16)3.3.5控制器 (19)3.3.6 显示器 (22)4 系统仿真及测试 (23)结论 (29)致谢 (30)参考文献 (31)附录1 (32)附录2 (35)1 引言1.1 课题背景进入信息时代以来,微电子技术和计算机技术飞速发展, 各种电子测量仪器在原理、功能、精度及自动化水平等方面都发生了巨大的变化, 特别是DSP技术诞生以后,电子测量技术更是迈进了一个全新的时代[1]。

近年来,DSP逐渐成为各种电子器件的基础器件,逐渐成为21世纪最具发展潜力的朝阳行业,甚至被誉为信息化数字化时代革命旗手。

在电子技术领域内,频率是一个最基本的参数,频率与其它许多电参量的测量方案、测量结果都有十分密切的关系。

如时间,速度等都涉及到或本身可转化为频率的测量。

因此,频率的测量就显得更为重要。

而且,目前在电子测量中,频率的测量精确度是最高的.现在市场上有各种多功能,高精度,高频率的数字频率计,但价格不菲。

而在实际工程中,不是对所有信号的频率测量都要求达到非常高的精度。

因此,本文提出了一种能满足一般测量精度要求,但成本低廉的数字频率计的设计方案。

在电子工程中、资源勘探、仪器仪表等相关应用中,频率计是工程技术人员必不可少的测量工具。

数字频率计是计算机,通信设备,音频视频等科研生产领域不可缺少的车辆仪器,采用VHDL语言编程设计实现的数字频率计,除被测信号的整形部分,键输入部分和数码显示部分以外其余全在一片FPGA芯片上实现,整个设计过程变得十分透明,快捷和方便,特别是对于各层次电路系统的工作时序的了解显得尤为准确而且具有灵活的现场可更改性。

基于Verilog的数字频率计的设计(包含代码及仿真)

基于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可以用来进行各种层次的逻辑设计,也可以进数字系统的逻辑综合,仿真验证和时序分析等。

Verilog-数字频率计

Verilog-数字频率计

摘要本文介绍了基于FPGA的数字频率计的设计方法,设计采用硬件描述语言Verilog,在软件开发平台ISE上完成,可以在较高速时钟频率(48MHz)下正常工作。

该数字频率计采用测频的方法,能准确的测量频率在10Hz到100MHz之间的信号。

使用ModelSim仿真软件对Verilog程序做了仿真,并完成了综合布局布线,最终下载到芯片Spartan3A上取得良好测试效果。

关键词:FPGA,Verilog,ISE,测频方法IAbstractThis paper introduces the design method of digital frequency meter based on FPGA,which use hardware description language-Verilog in software development platform ISE and can word in relatively high-speed clock of48MHz.The frequency meter uses the method of frequency measurement,which could accurately measure the frequency of signals between10Hz to100MHz.This system uses the simulation tool-ModelSim to run and debug the Verilog program,and design the circuit placement.A good result can be achieved when the program was burnt on the chip Spartan3A.KeywordsKeywords::FPGA,Verilog,ISE,Frequency MeasurementIIII目录第一章测量原理与方法................................................................................................................................................................................................441.1测频方法.............................................................................................................41.2测周方法.............................................................................................................51.3等精度测量法....................................................................................................51.4放大整形电路....................................................................................................61.5时基信号产生. (7)第二章任务要求..........................................................................................................................................................................................................................88第三章各模块功能及介绍....................................................................................................................................................................................883.1分频器..................................................................................................................84.2闸门选择器........................................................................................................104.3频率计数器........................................................................................................124.4锁存器................................................................................................................144.5扫描显示控制译码系统.. (15)第四章顶层电路及总体仿真............................................................................................................................................................................16164.1顶层电路.. (16)4.2总体仿真结果 (16)4.3测试结果 (19)第一章测量原理与方法所谓“频率”,就是周期性信号在单位时间(秒)内变化的次数。

100MHz等精度频率计设计(基于某VerilogHDL)

100MHz等精度频率计设计(基于某VerilogHDL)

某某:X中权学号:152210303127班级:电子1班数电课设报告100MHz等精度频率计设计〔基于Verilog HDL〕一、设计要求:提供一个幅值为10mV ~ 1 V,频率为 1 ~ 100MHz的正弦信号,需测试以下指标:1.频率:测频X围 1Hz ~ 100MHz,测频精度为测频全域内相对误差恒为百万分之一。

2.占空比:测试精度 1% ~ 99%3.相位差:测试两个同频率的信号之间的相位差,测试X围 0 ~ 360 某某科技大学2017/10/12二、设计分析使用FPGA数字信号处理方法,首先需要将正弦信号转换成可读取的数字方波信号,再经过FPGA 设计计算得出所需测量值。

三、模电局部首先选择比拟器,对于 100 MHz 信号,比拟器灵敏度需要达到5ns内,TI公司的LTV3501灵敏度为4.5ns,符合要求由TLV3501数据手册得知:当频率低于 50MHz 的时候,正弦波的峰峰值需大于 20mV,频率高于50MHz时,峰峰值需大于 1V。

然后需要选择放大器,当正弦波幅值为 10mV时,放大倍数需大于35。

方法通过二级放大,一级用OPA847放大20倍,二级用OPA675放大8倍,得到总放大倍数160的正弦波。

经转换后的输出电压符合TTL电平要求,可以被识别出0和1。

四、数电局部开发板:Cyclone IV E: EP4CE6E22C8板载时钟为 50MHz,带4个按键和一个复位键〔按键按下为0,抬起为1〕,四个七段数码管〔共阳〕,FPGA的引脚可由杜邦线引出。

设计思路:测量频率:输入一个100MHz的基准频率,由计数器T1来计算基准频率的上升沿个数,即周期数。

输入一个被测信号,它由计数器T2来测量周期数。

两个信号在同一个使能信号EN〔使能信号时间为1~2s〕下开始计数,计数完后,存储计数结果,由〔T1 * 10〕可以算出具体的计数时间〔单位ns〕,再由(〔T1 * 10ns〕/T2 )*10^9可算得被测信号频率,单位Hz。

Verilog频率计(低频))

Verilog频率计(低频))

日志档案发表于2010/5/17 23:45:37标签:无标签Verilog频率计(低频)小弟最近弄了个频率计,主要测量工频50HZ的。

代码附在下边。

下面的代码,功能实现了,通过了modelsim仿真,实际测试也成功。

还是存在一些问题,不是功能上的,而是实现方法上了,我总感觉我的这个设计肯定不是最好的,有一些除法,还有十进制书转化成BCD码的问题还须要很大的优化。

但是小弟,刚学FPGA,一些问题也搞不清楚,。

就发在网上,分享一下,也让大家指正一下。

//// Description 测量频率(工频50HZ 13~ 59.9HZ)// Create Date: 2010- 05 -17// Engineer: 张书腾// Module Name: frequency////nate:该设计只是适用于50HZ左右的频率测量,采用的是测周发module frequency(clk, rst_n, fre,sm_bit, segment);input clk; //50M系统时钟input rst_n; //异步复位端input fre;//频率输入端output [3:0] sm_bit;//数码管位码output[7:0] segment; //数码管位码reg [3:0] sm_bit;//数码管位码寄存器reg [7:0] segment;//数码管位码寄存器////////////////////标准信号F="100K",测周///////////////////////////reg [9:0]count;//100K时钟分频计数器always @ (posedge clk or negedge rst_n) beginif(!rst_n)count <= 1'b0;else if(count< 10'd499)count <= count+1'b1;elsecount <= 1'b0;endreg clk_100K;//100K时钟输出寄存器always @ (posedge clk or negedge rst_n) beginif(!rst_n)clk_100K <= 1'b0;else if(count<=249) //时钟的占空比为50%clk_100K <= 1'b0;else clk_100K <= 1'b1;end///////////////////////////////////////////////待测频率进行2分频,2分频后,就可以只计二分频后信号的高电平或低电平//就可以了,如果不2分频,只记高电平或低电平的话,信号的占空比不同会导致结果不准确reg fre_2;always @ (posedge fre or negedge rst_n) beginif(!rst_n)fre_2 <= 1'b0;else if(fre)fre_2 <= ~fre_2;//2分频end//////////////测周计数模块,计2分频后的待测频的高电平或低电平/////////////////////// //相当于在待测频率的整个周期内计数//////////////////////////////////////////////////////reg [12:0] cnt;//计数寄存器//由于位宽的限制,最大计数值8192,所以测低频(低于14HZ时会出错)always @ (posedge clk_100K or negedge rst_n) beginif(!rst_n) begincnt <= 13'd0;endelse if(!fre_2) //低电平计数cnt <= cnt + 1'b1;else begincnt <= 13'd0;//不为低电平时清零endend////////锁存信号,上升沿有效//////////////////////////reg load;always @ (posedge fre_2 or negedge rst_n) beginif(!rst_n) beginload <= 1'b0;endelse load <= ~load;//产生上升沿end//////////////////////////////////reg [12:0] cnt_r;//存储锁存的值always @ (posedge load)//load上升沿锁存begincnt_r <= cnt;//将计数值锁存end/////////////////////////数据处理单/////////////////////////////////////////////////////////////////////////////reg [23:0] temp; //暂存数据//(将一个十进制的四位数各个位取出),fre_r 中的数为实际频率是100倍,是为了后面的计算方便always @ (posedge clk or negedge rst_n)if(!rst_n) beginfre_r <= 13'd0;endelse begintemp <= (24'd1*******)/cnt_r;//fre_r=(1/(10us * cnt_r ))*100实际频率扩大100倍//采用了一个除法运算符,不清楚效率如何,但是能工作fre_r <= temp[12:0]; //取出低位消除警告//////////////////////////////////////end//////////////////////////////////reg [12:0] fre_r , temp1, temp2,temp3;//fre_r , temp1, temp2,temp3用于计算reg [3:0] count1,count2,count3,count4;//数码管要显示的每位十进制数reg [3:0] state;///状态机的状态寄存器///////////////////////状态机编码//////////////////parameter shiwei = 4'b0001, //十位gewei = 4'b0010,//个位shifenwei = 4'b0100,//十分位baifenwei = 4'b1000;//百分位always @ (posedge clk or negedge rst_n) ////状态机,取出一个四位数的各个位的值,用比较法if(!rst_n) beginstate <= shiwei;count1 <= 4'd0;count2 <= 4'd0;count3 <= 4'd0;count4 <= 4'd0;endelse begincase(state)shiwei: beginstate <= gewei; /////////////// //十位//用比较发对照出每位的十进制数if((fre_r>=5000)&&(fre_r<6000)) begin count1 <=4'd5; temp1<=fre_ r-13'd5000; endelse if((fre_r>=4000)&&(fre_r<5000)) begin count1 <=4'd4; temp1<=fre_ r-13'd4000; endelse if((fre_r>=3000)&&(fre_r<4000)) begin count1 <=4'd3; temp1<=fre_ r-13'd3000; endelse if((fre_r>=2000)&&(fre_r<3000)) begin count1 <=2; temp1<=fre_r-1 3'd2000; endelse if((fre_r>=1000)&&(fre_r<2000)) begin count1 <=1; temp1<=fre_r-1 3'd1000; endelse if(fre_r<1000) begin count1 <=0; temp1<=fre_r; endelse begin count1 <=5; temp1<=fre_r-13'd5000;end endgewei: beginstate <= shifenwei; ////////////////////////个位//用比较发对照出每位的十进制数 if(temp1>=900) begin count2 <=9; temp2<=temp1-13'd90 0; endelse if((temp1>=800)&&(temp1<900)) begin count2 <=8; temp2<=temp1 -13'd800; endelse if((temp1>=700)&&(temp1<800)) begin count2 <=7; temp2<=temp1 -13'd700; endelse if((temp1>=600)&&(temp1<700)) begin count2 <=6; temp2<=temp1 -13'd600; endelse if((temp1>=500)&&(temp1<600)) begin count2 <=5; temp2<=temp1 -13'd500; endelse if((temp1>=400)&&(temp1<500)) begin count2 <=4; temp2<=temp1 -13'd400; endelse if((temp1>=300)&&(temp1<400)) begin count2 <=3; temp2<=temp1 -13'd300; endelse if((temp1>=200)&&(temp1<300)) begin count2 <=2; temp2<=temp1 -13'd200; endelse if((temp1>=100)&&(temp1<200)) begin count2 <=1; temp2<=temp1 -13'd100; endelse if(temp1<100) begin count2 <=0; temp2<=temp1; endelse begin count2 <=0; temp2<=temp1-13'd900; end endshifenwei: beginstate <= baifenwei;///////////////////////////十分位//用比较发对照出每位的十进制数if(temp2>=90) begin count3 <=9; temp3<=temp2-13'd90; endelse if((temp2>=80)&&(temp2<90)) begin count3 <=8; temp3<=temp2-1 3'd80; endelse if((temp2>=70)&&(temp2<80)) begin count3 <=7; temp3<=temp2-1 3'd70; endelse if((temp2>=60)&&(temp2<70)) begin count3 <=6; temp3<=temp2-1 3'd60; endelse if((temp2>=50)&&(temp2<60)) begin count3 <=5; temp3<=temp2-13'd50; endelse if((temp2>=40)&&(temp2<50)) begin count3 <=4; temp3<=temp2-1 3'd40; endelse if((temp2>=30)&&(temp2<40)) begin count3 <=3; temp3<=temp2-1 3'd30; endelse if((temp2>=20)&&(temp2<30)) begin count3 <=2; temp3<=temp2-1 3'd20; endelse if((temp2>=10)&&(temp2<20)) begin count3 <=1; temp3<=temp2-1 3'd10; endelse if(temp2<10) begin count3 <=0; temp3<=temp2; endelse begin count3 <=0; temp3<=temp2-13'd90; end endbaifenwei: beginstate <= shiwei;/////////////////百分位///////////////////////////////////count4 <= temp3[3:0];enddefault: beginstate <= shiwei;endendcaseend////////////////////////////////////////////////////////////////显示模块 ///////////////reg [18:0] count_1ms; //用来产生数码管动态显示的位变化的驱动时钟always @ (posedge clk or negedge rst_n)if(!rst_n) begincount_1ms <= 19'd0;endelse begincount_1ms <= count_1ms + 1'b1;end//////////数码管动态扫描的位产生单元always @ (posedge clk or negedge rst_n)if(!rst_n)sm_bit=4'b0000;else begincase(count_1ms[18:16]) //数码管动态显示的位扫描//基本上是每一位亮1m s3'b000: sm_bit=4'b1110;3'b001: sm_bit=4'b1101;3'b010: sm_bit=4'b1011;3'b011: sm_bit=4'b0111;default: sm_bit=4'b1111;endcaseendalways @ (posedge clk or negedge rst_n)if(!rst_n) beginsegment =8'h03;endelse begincase(sm_bit)4'b1110: segment=convent(count1); //十位4'b1101: segment=convent(count2)-8'd1;///个位//显示小数点4'b1011: segment=convent(count3); //十分位4'b0111: segment=convent(count4); //百分位default: segment=8'b1111_1111;endcaseendfunction [7:0] convent;//将自然数转化成共阳数码管的函数input [3:0] bcd; //输入为自然数case(bcd)4'd0: convent="8"'h03; //数码管段码,a为最高位,dp为最低位 4'd1: convent="8"'h9f;4'd2: convent="8"'h25;4'd3: convent="8"'h0d;4'd4: convent="8"'h99;4'd5: convent="8"'h49;4'd6: convent="8"'h41;4'd7: convent="8"'h1f;4'd8: convent="8"'h01;4'd9: convent="8"'h09;default: convent = 8'hff;endcaseendfunction///////////////////////////////////////////////////////////。

基于verilog语言的数字频率计设计

基于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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验名称数字频率计的设计二、实验地点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可以用来进行各种层次的逻辑设计,也可以进数字系统的逻辑综合,仿真验证和时序分析等。

Verilog HDL适合算法级,寄存器级,逻辑级,开关级、系统级和版图级等各个层次的设计和描述.verilogHDL进行设计最大的优点是其工艺无关性.这使得工程师在效用设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件,即可设计出实际电路.verilogHDL是一种硬件描述语言(hardware description language),为了制作数字电路而用来描述ASICS和FPGA的设计之用。

verilogHDL 的设计者想要以 C 编程语言为基础设计一种语言,可以使工程师比较容易学习。

Verilog 是由en:Gateway Design Automation公司于大约1984年开始发展。

Gateway Design Automation公司后来被Cadence Design Systems于1990年所购并。

现在Cadence 对于Gateway 公司的Verilog 和Verilog-XL 模拟器拥有全部的财产权。

选择VHDL还是verilog HDL?这是一个初学者最常见的问题。

其实两种语言的差别并不大,他们的描述能力也是类似的。

掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。

选择何种语言主要还是看周围人群的使用习惯,这样可以方便日后的学习交流。

当然,如果您是专用集成电路(ASIC)设计人员,则必须首先掌握verilog,因为在IC设计领域,90%以上的公司都是采用verilog进行IC设计。

对于PLD/FPGA设计者而言,两种语言可以自由选择。

八、实验原理所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。

若在一定时间内计得这个周期信号变化的次数为N,则其频率可表达为:N f T=(1)1所示:首先,把被测信号①(以正弦波为例)通过放大整形电路变成脉冲②(实际上变成方波即可)其重复频率等于被测频率x f ,然后将它加到闸门的一个输入端。

闸门通过门控信号④来控制开、闭时间,只有在闸门开通时间T 内,被计数的脉冲⑤才能通过闸门,被送到十进制电子计数器进行计数。

门控信号的时间T 是非常准确的,以它作为时间基准,它由时基发生器提供。

时基信号发生器由一个高稳定的石英振荡器和一系列数字分频器组成,由它输出的标准时间脉冲(时标)去控制门控电路形成门控信号。

比如,时标信号的重复周期为1S,则加到闸门的门控信号作用时间T 及闸门时间亦准确的等于1S,及闸门开通时间为1S,这时若计得10000个数,则有(1)式知,被测频率10000x f Hz =。

从以上讨论可知,电子计数器的测频原理实质上以比较法为基础,它将x f 和时基信号频率相比,两个频率相比的结果以数字的形式显示出来。

一.分频模块程序module count(rest,clk,clk_1hz,clk_10hz,clk_100hz,clk_1khz);input clk,rest;output reg clk_1hz,clk_10hz,clk_100hz,clk_1khz;reg[29:0] count1,count2,count3,count4;initialbeginclk_1hz=0;clk_10hz=0;clk_100hz=0;clk_1khz=0;count1=0;count2=0;count3=0;count4=0;endalways@( posedge clk)beginif(!rest)begincount1<=0;count2<=0;count3<=0;count4<=0;clk_1hz<=0; clk_10hz<=0;clk_100hz<=0;clk_1khz<=0;endelse beginif(count1==24000000)begin count1<=0;clk_1hz<=~clk_1hz; endelse count1<=count1+1;if(count2==2400000)begin count2<=0;clk_10hz<=~clk_10hz;endelse count2<=count2+1;if(count3==240000)begin count3<=0;clk_100hz<=~clk_100hz;endelse count3<=count3+1;if(count4==24000)begin count4<=0;clk_1khz<=~clk_1khz;endelse count4<=count4+1;endendendmodule仿真图仿真模块二,门控电路和清零,锁存,阀门信号产生程序module chose(rest,clk_10hz,clk_100hzhz,clk_1khz,key1,key10,key100,gate_out1,ff,clk_latch,clk_clear);input rest ,clk_10hz,clk_100hz,clk_1khz,key1,key10,key100;output gate_out1,clk_latch,clk_clear;output reg [2:1] ff;reg gate_out1,clk_latch,clk_clear,gate;reg [4:1]count;initial begin gate_out1=0;ff=0;clk_latch=0;clk_clear=0;gate=0;count=0;endalways@( posedge clk_1khz)beginif(!rest) begin gate_out1<=0; ff<=2'b00;endelse beginif(key1==1&&key10==0&&key100==0) begin gate<=clk_10hz; ff<=2'b01;endelse if(key1==0&&key10==1&&key100==0) begin gate<=clk_100hz;ff<=2'b10;endelse if(key1==0&&key10==0&&key100==1) begin gate<=clk_1khz;ff<=2'b11;endelse begin ff<=0;endendend////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////always @(posedge gate)begincount<=count+1;if (count<=9)begin gate_out1<=1;clk_clear<=0;clk_latch<=0;endelse if (count==11)begin gate_out1<=0;clk_clear<=0;clk_latch<=1;endelse if (count==13)begin gate_out1<=0;clk_clear<=1;clk_latch<=0;count<=0;end elsebegin gate_out1<=0;clk_clear<=0;clk_latch<=0;end endendmodule仿真图仿真模块三, 计数器程序module counter(rest,start,clk_in,cnt1,cnt2,cnt3,cnt4,cnt5,cnt6,yichu,clk_clear);input rest,start,clk_in,clk_clear;output yichu;reg yichu;output reg [4:1]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;initial beginyichu=1;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;endalways@(posedge clk_in )beginif(!rest) begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;endelse beginif(clk_clear==1)begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;yichu<=1;endelse if(start==1)beginif((cnt6==4'b1001)&&(cnt5==4'b1001)&&(cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;yichu<=0;endelse if((cnt5==4'b1001)&&(cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=4'b0001;cnt6<=cnt6+4'b0001;endelse if((cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001)) begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;cnt5<=cnt5+4'b0001;cnt6<=cnt6;endelse if((cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=cnt4+4'b0001;cnt5<=cnt5;cnt6<=cnt6;endelse if((cnt2==4'b1001)&&(cnt1==4'b1001))begincnt1<=4'b0000;cnt2<=4'b0000;cnt3<=cnt3+4'b0001;cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;endelse if((cnt1==4'b1001))begincnt1<=4'b0000;cnt2<=cnt2+4'b0001;cnt3<=cnt3;cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;endelse begincnt1<=cnt1+4'b0001;cnt2<=cnt2;cnt3<=cnt3; cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;endendendendendmodule仿真图模块仿真图四,锁存以及译码扫描显示程序module v138(rest,clk_1khz,se,in1,in2,in3,in4,in5,in6,segs,ff,dp,led,en,clk_latch);input [4:1] in1,in2,in3,in4,in5,in6;input clk_1khz,rest;input [2:1]ff;input clk_latch;output reg dp, led,en;output reg [4:1] se;reg [3:1] count,dig;output reg [7:1] segs;reg [4:1] sign_out4;reg [4:1] latch1,latch2,latch3,latch4,latch5,latch6;。

相关文档
最新文档