您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用verilog-HDL设计的4位频率计
简单4位数字频率计设计一、设计要求(1)、利用VerilogHDL语言行为描述方法,设计一个简单的4位数字频率计;(2)、要求输入标准时钟信号频率为1MHz,系统可计数频率范围为1Hz~9999Hz;(3)、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示(动态扫描显示)。二、系统结构框图信号处理模块计数模块显示控制模块DOUT[10:0]FLOW_UPCLK复位信号RESET测试信号signalLOADCOUNTER_CLRGATED_CLKFLOW_UPCOUT[15:0]4位数字频率计系统结构框图根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s占空比50%的信号,用来对输入信号采样,得到采样信号GATED_CLK;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD和COUNTER_CLR,LOAD信号控制计数完成后的数据及时输出给显示,COUNTER_CLR信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP;显示控制模块要完成将计数模块输入的信号进行译码显示。三、信号描述测试信号采样原理:Gatedsignalwidth=1sSignalfortestcounterTodisplayANDgate1sSignalfortestGATED_CLK、LOAD、COUNTER_CLR信号的关系:COUNTER_CLRGATED_CLKLOAD程序中用到的信号变量:FREQUENCY_COUNTROL_BLOCKFREQUENCY_COUNTER_BLOCKFREQUENCY_DISPLY_BLOCKGATED_CLK采样信号COUT计数输出信号DOUT输出到数码管LOAD控制计数器信号FLOW_UP计数溢出信号CDIN计数输入信号COUNTER_CLR清零计数器信号CLOCK_IN计数器时钟信号DCLK_IN标准时钟信号CLK_IN标准时钟信号LOAD控制计数输出RESET复位信号SIGNAL_TEST测试信号COUNTER_CLR清零计数信号RESET复位信号RESET复位信号四、Verilog程序各子模块verilog程序:(1)信号处理模块_verilog:moduleFREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNAL_TEST,RESET);outputGATED_CLK;outputLOAD;outputCOUNTER_CLR;inputCLK_IN;inputSIGNAL_TEST;inputRESET;regLOAD;regCOUNTER_CLR;regDIVIDE_CLK;reg[19:0]cn;regA1,A2;//信号分频:由CLK_IN得到分频后的信号DIVIDE_CLK(0.5Hz)always@(posedgeCLK_IN)beginif(RESET)beginDIVIDE_CLK=0;cn=0;endelseif(cn==1000000)begincn=0;DIVIDE_CLK=~DIVIDE_CLK;endelsecn=cn+1;end//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always@(posedgeSIGNAL_TEST)beginA1=~DIVIDE_CLK;endalways@(posedgeSIGNAL_TEST)beginA2=A1;endalways@(A1orA2)beginLOAD=A1&&(!A2);endalways@(posedgeSIGNAL_TEST)COUNTER_CLR=LOAD;//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号assignGATED_CLK=SIGNAL_TEST&DIVIDE_CLK;endmodule(2)、计数器模块:moduleFREQUENCY_COUNTER_BLOCK(COUT,FLOW_UP,CLOCK_IN,RESET,LOAD,COUNTER_CLR);output[15:0]COUT;outputFLOW_UP;inputCLOCK_IN;inputLOAD;inputCOUNTER_CLR;inputRESET;reg[15:0]TEMP;regFLOW_UP;parameterB_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_INorRESETorLOADorCOUNTER_CLR)beginif(RESET|COUNTER_CLR)beginTEMP=0;FLOW_UP=0;endelseif(LOAD)binary=TEMP;elseif(TEMP9999)beginFLOW_UP=1;binary=9999;endelseif(CLOCK_IN)TEMP=TEMP+1;end//将二进制表示(或十六进制表示)的数转换为BCD码的形式,便于数码管译码显示always@(binaryorRESET)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=result1;bin=bin1;endresult[0]=bin[B_SIZE-1];bcd=result;endendassignCOUT=bcd[15:0];endmodule(3)信号显示处理:moduleFREQUENCY_DISPLY_BLOCK(DOUT,DCLK_IN,RESET,CDIN);output[10:0]DOUT;input[15:0]CDIN;inputDCLK_IN;inputRESET;reg[10:0]DOUT;reg[3:0]Temp1;reg[1:0]cn;always@(posedgeDCLK_IN)//设置成动态扫描beginif(RESET)cn=0;elsebegincn=cn+1;case(cn)2'b00:beginDOUT[10:7]=4'b0001;Temp1=CDIN[3:0];end2'b01:beginDOUT[10:7]=4'b0010;Temp1=CDIN[7:4];end2'b10:beginDOUT[10:7]=4'b0100;Temp1=CDIN[11:8];end2'b11:beginDOUT[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_DISPLY_BLOCK(DOUT,FLOW_UP,CLK,TEST_CLK_IN,RESET);output[10:0]DOUT;outputFLOW_UP;inputCLK;inputTEST_CLK_IN;inputRESET;wiregated_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),.SIGNAL_TEST(TEST_CLK_IN),.RESET(RESET));FREQUENCY_COUNTER_BLOCKu2(.COUT(cout_cdin),.FLOW_UP(FLOW_UP),.CLOCK_IN(gated_clk),.RESET(RESET),.LOAD(load),.COUNTER_CLR(counter_clr));FREQUENCY_DISPLY_BLOCKu3(.DOUT(DOUT),.DCLK_IN(CLK),.RESET(RESET),.CDIN(cout_cdin));endmodule五、仿真结果分析仿真结果如图所示,输入标准时钟频率为1MHz,经过分频后变成频率为0.5Hz的信号,将其与测试信号相与得到采样信号GATED_CLK,同时利用测试信号和0.5Hz的分频信号可以产生LOAD信号和COUNTER_CLR信号,它们和采样信号的关系在图上可以清楚的看出。图中测试信号频率为2500Hz,16进制表示为09C4。Dout信号为要输入4个共阴数码管的信号,其高四位为片选控制,低七位为经译码后输入到数码管的信号。以下为综合后的顶层电路和各子电路图:(a)顶层模块综合后的电路(b)FREQUENCY_COUNTROL_BLOCK模块综合后的电路(c)FREQUENCY_COUNTER_BLOCK模块综合后的电路(d)FREQUENCY_DISPLY_BLOCK模块综合后的电路
本文标题:用verilog-HDL设计的4位频率计
链接地址:https://www.777doc.com/doc-5644172 .html