用verilog HDL设计的4位频率计_第1页
用verilog HDL设计的4位频率计_第2页
用verilog HDL设计的4位频率计_第3页
用verilog HDL设计的4位频率计_第4页
用verilog HDL设计的4位频率计_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./简单4位数字频率计设计设计要求〔1、利用VerilogHDL语言行为描述方法,设计一个简单的4位数字频率计;〔2、要求输入标准时钟信号频率为1MHz,系统可计数频率围为1Hz~9999Hz;〔3、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示〔动态扫描显示。系统结构框图根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s占空比50%的信号,用来对输入信号采样,得到采样信号GATED_CLK;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD和COUNTER_CLR,LOAD信号控制计数完成后的数据及时输出给显示,COUNTER_CLR信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP;显示控制模块要完成将计数模块输入的信号进行译码显示。信号描述测试信号采样原理:GATED_CLK、LOAD、COUNTER_CLR信号的关系:程序中用到的信号变量: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]; regA1,A2;//信号分频:由CLK_IN得到分频后的信号DIVIDE_CLK<0.5Hz> always<posedgeCLK_IN> begin if<RESET> begin DIVIDE_CLK<=0; cn<=0; end elseif<cn==1000000> begin cn<=0; DIVIDE_CLK<=~DIVIDE_CLK; end else cn<=cn+1; end //频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always<posedgeSIGNAL_TEST> begin A1<=~DIVIDE_CLK; end always<posedgeSIGNAL_TEST> begin A2=A1; end always<A1orA2> begin LOAD=A1&&<!A2>; end always<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> begin if<RESET|COUNTER_CLR> begin TEMP<=0; FLOW_UP<=0; end elseif<LOAD> binary<=TEMP; elseif<TEMP>9999> begin FLOW_UP<=1; binary<=9999; end else if<CLOCK_IN> TEMP<=TEMP+1; end //将二进制表示〔或十六进制表示的数转换为BCD码的形式,便于数码管译码显示 always<binaryorRESET> begin bin=binary; result=0; if<RESET> bcd<=0; else begin repeat<B_SIZE-1> begin result[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; end result[0]=bin[B_SIZE-1]; bcd<=result; end end assignCOUT=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]; always<posedgeDCLK_IN>//设置成动态扫描 begin if<RESET> cn<=0; else begin cn<=cn+1; case<cn> 2'b00:beginDOUT[10:7]<=4'b0001;Temp1<=CDIN[3:0];end 2'b01:beginDOUT[10:7]<=4'b0010;Temp1<=CDIN[7:4];end 2'b10:beginDOUT[10:7]<=4'b0100;Temp1<=CDIN[11:8];end 2'b11:beginDOUT[10:7]<=4'b1000;Temp1<=CDIN[15:12];end endcase end end always<Temp1>//译码显示 begin case<Temp1> 4'b0000:DOUT[6:0]<=7'b0111111;//3fh=0 4'b0001:DOUT[6:0]<=7'b0000110;//06h=1 4'b0010:DOUT[6:0]<=7'b1010110;//56h=2 4'b0011:DOUT[6:0]<=7'b1001111;//4fh=3 4'b0100:DOUT[6:0]<=7'b1100110;//66h=4 4'b0101:DOUT[6:0]<=7'b1101101;//6dh=5 4'b0110:DOUT[6:0]<=7'b1111101;//7dh=6 4'b0111:DOUT[6:0]<=7'b0000111;//07h=7 4'b1000:DOUT[6:0]<=7'b1111111;//7fh=8 4'b1001:DOUT[6:0]<=7'b1101111;//6fh=9 default:DOUT[6:0]<=7'b0111111;//3fh endcase end endmodule顶层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的分频信号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论