用verilog HDL设计地4位频率计

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

简单4位数字频率计设计

一、设计要求

(1)、利用Verilog HDL语言行为描述方法,设计一个简单的4位数字频率计;(2)、要求输入标准时钟信号频率为1MHz,系统可计数频率围为1Hz~9999Hz;(3)、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示(动态扫描显示)。

二、系统结构框图

4位数字频率计系统结构框图

根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s占空比50%的信号,用来对输入信号采样,得到采样信号GATED_CLK;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD和COUNTER_CLR,LOAD信号控制计数完成后的数据及时输出给显示,COUNTER_CLR信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP;显示控制模块要完成将计数模块输入的信号进行译码显示。

三、信号描述

测试信号采样原理:

Gated signal

Signal for test

To display

Signal for test

GATED_CLK 、LOAD

、COUNTER_CLR 信号的关系:

COUNTER_CLR

GATED_CLK

LOAD

程序中用到的信号变量:

四、Verilog程序

各子模块verilog程序:

(1)信号处理模块_verilog:

module

FREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNAL _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];

reg A1,A2;

//信号分频:由CLK_IN得到分频后的信号DIVIDE_CLK(0.5Hz)

always (posedge CLK_IN)

begin

if(RESET)

begin

DIVIDE_CLK<=0;

cn<=0;

end

else if(cn==1000000)

begin

cn<=0;

DIVIDE_CLK<=~DIVIDE_CLK;

end

else

cn<=cn+1;

end

//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always (posedge SIGNAL_TEST)

begin

A1<=~DIVIDE_CLK;

end

always (posedge SIGNAL_TEST)

begin

A2=A1;

end

always (A1 or A2)

begin

LOAD=A1&&(!A2);

end

always (posedge SIGNAL_TEST)

COUNTER_CLR=LOAD;

//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号assign GATED_CLK=SIGNAL_TEST&DIVIDE_CLK;

endmodule

(2)、计数器模块:

module

FREQUENCY_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) begin

if(RESET|COUNTER_CLR)

begin

TEMP<=0;

FLOW_UP<=0;

end

else if(LOAD)

binary<=TEMP;

else if(TEMP>9999)

begin

FLOW_UP<=1;

binary<=9999;

end

else

if(CLOCK_IN)

相关文档
最新文档