柜台上的纸张

这是大规模数字集成电路在系统编程领域的经典课程设计。

数字频率计是现代电子技术领域的重要测量工具之一,在其他许多领域也有着广泛的应用。数字频率计记录在指定的参考时间内测量的脉冲数,将它们转换成频率并以数字形式显示出来。数字频率计用于测量信号(方波、正弦波或其他周期信号)的频率,并以十进制数字显示。具有精度高、测量速度快、读数直观、使用方便等优点。

用VHDL语言实现的一个例子如下:

-项目名称:恒精度频率计

-目标设备:FPGA或CPLD

-修订版0.01 -文件已创建

-备注:clk -系统工作时钟,2MHz。

-系统复位信号,高电平有效。

- FX是要测试的信号。

-频率nx是待测信号的计数值。

- freqns是标准信号的计数值。

- freq是待测信号的频率。

-

-

图书馆IEEE

使用IEEE。STD_LOGIC_1164。所有;

使用IEEE。STD_LOGIC_ARITH。所有;

使用IEEE。STD_LOGIC_UNSIGNED所有;

-

实体频率计是

generic(clk_freq:整数:= 2000000);-系统工作时钟频率

port(clk:in STD _ LOGIC;

复位:在STD_LOGIC中;

Fx:在STD_LOGIC中;-待测量的信号

freq ns:out natural;

freq NX:out natural);

-Freq:out natural);

终点频率计;

-

频率计的结构行为是

-

信号开始:STD _ LOGIC-当该信号为高电平时,计数器开始计数。

信号CTRL:STD _ LOGIC;- CTRL信号是由待测信号和选通信号产生的计数器启动信号。

信号CNTx:自然;-测试中的信号计数器

信号CNT:自然;-标准信号计数器

-

开始

- *************************************** -

-产生一个选通信号,高电平有效。

GateCtrl : process(clk)

-

变量CNT0:整数范围0到2 _ 097 _ 152;门控信号计数器

-

开始

如果上升沿(clk ),则

如果reset='1 ',则

CNT 0:= 0;

其他

CNT 0:= CNT 0+1;

结束if;

-

如果reset='1 ',则

开始& lt= '0';

elsif CNT0 & lt(clk_freq*3/4)那么

开始& lt= '1';

其他

开始& lt= '0';

结束if;

结束if;

结束进程GateCtrl

- *************************************** -

-产生CTRL信号,由被测信号和选通信号产生的计数器启动信号。

CtrlGen:进程(Fx)

开始

如果上升沿(Fx ),则

如果reset='1 ',则

CTRL & lt= '0';

其他

CTRL & lt=开始;

结束if;

结束if;

结束进程CtrlGen

- *************************************** -

-使用两个计数器分别对标准信号clk和待测信号进行计数。

-

-计数标准信号,在CTRL高电平期间有效。

计数:进程(时钟)

开始

如果上升沿(clk ),则

如果reset='1 ',则

CNTs & lt= 0;

elsif CTRL='1 '然后

CNTs & lt= CNTs+1;

其他

CNTs & lt= 0;

结束if;

结束if;

结束进程计数;

-

-待测量的计数信号,在CTRL高电平期间有效。

CountX:进程(Fx)

开始

如果上升沿(Fx ),则

如果reset='1 ',则

CNTx & lt= 0;

elsif CTRL='1 '然后

CNTx & lt= CNTx+1;

其他

CNTx & lt= 0;

结束if;

结束if;

结束进程CountX

- *************************************** -

- CTRL下降沿将输出技术结果和测量值。

计数:流程(CTRL)

开始

如果下降沿(CTRL)则

如果reset='1 ',则

FreqNs & lt= 0;

FreqNx & lt= 0;

-Freq & lt;= 0;

其他

FreqNs & lt= CNTs

FreqNx & lt= CNTx

-Freq & lt;=(clk _ freq/CNTs * CNTx);

结束if;

结束if;

结束进程计数;

结束行为;

下面是为上述模块编写的测试平台,已经通过Modelsim下的仿真。因为数据量大,建议不要用Altera和ISE仿真。

-

图书馆ieee

使用IEEE . STD _ logic _ 1164。所有;

使用IEEE . STD _ logic _ unsigned . all;

使用ieee.numeric_std。所有;

实体tb是

终结TB;

tb的架构行为是

-被测装置的部件声明(UUT)

分量频率计

端口(

clk:在std_logic中;

复位:在std_logic中;

Fx:在std_logic中;

freq ns:OUT natural;

freq NX:OUT natural;

频率:超越自然

);

末端组件;

-输入

信号clk:STD _ logic:= ' 0 ';

信号复位:STD _ logic:= ' 1 ';

信号Fx:STD _ logic:= ' 0 ';

-产出

信号频率:自然;

信号FreqNx:自然;

-信号频率:自然;

-时钟周期定义

常数clk_period:时间:= 500ns

开始

-实例化被测单元(UUT)

uut:频率计端口映射(

clk = & gtclk,

reset = & gt重置,

Fx = & gt外汇,

FreqNs = >频率,

FreqNx = & gtFreqNx,

- Freq = >频率

);

-时钟流程定义

clk_process:进程

开始

clk & lt= '0';

等待clk _ period/2;

clk & lt= '1';

等待clk _ period/2;

结束进程;

-产生待测量的信号

Fx_process:进程

开始

Fx & lt= '0';

等待2 * clk _ period

Fx & lt= '1';

等待2 * clk _ period

结束进程;

刺激过程

进程进程

开始

-保持复位状态100毫秒。

等待clk _ period * 10;

重置& lt= '0';

-在此插入刺激

等等;

结束进程;

结束;

参考原理M/T频率测量方法。