Step1: 频率计数

根据等精度测频法的原理,我们将基准信号和待测信号对齐,设置Fx_temp1和Fx_change两个信号。Fx_temp1将Fx延迟1个时钟周期,当Fx_temp1上升沿时Fx_change为下降沿。Fx_change && (!Fx_temp1)来确定同步闸门信号Sync_Gate的上升沿。此时Sync_Gate和Fx_temp1一同开始上升沿。在Sync_Gate开启时,每个待测信号上升沿计数值+1。最后同步闸门信号的下降沿。通过判断所在时钟周期的闸门信号为低电平且上一时钟周期闸门信号为高电平来判断闸门信号的下降沿。当下降沿来临时,将计数值传送给Nc和Nx进行结果输出。

Step2: 数据整理

数据计算模块如图4.3所示。En接的是频率计数模块的Data_Done数据,使能控制计算模块进行数据计算。当处于非锁存状态时,将计数值Nc和Nx通过公式
f'x=(100*Nx/Nc)*fc
计算得到待测信号频率值。这里乘以100倍是为了计算出小数点后两位的数据。使用4个8位寄存器将计算的频率值转化为BCD码的形式。每一个寄存器保存两位频率数据。因为1602LCD显示器一行可以显示16位数据,每一位用8位编码表示。我们将频率值整合为一个128位的数据,可以轻松简单的实现1602的显示。
计算模块同时受锁存的控制。当前为锁存状态时,不再进行128位的数据转换,data_row保持上一次转换的值不变。

Step3: 数据锁存

当按下锁存键后产生一个锁存触发信号。因为物理按键的弹性作用,在按下按键时可能产生物理抖动,因此我们需要进行按键消抖。从图中我们可以看出,keycontinue比ReadData延迟一个周期,当keycontinue xor ReadData= 1且ReadData=1时,即按键下降沿时,产生一个脉冲keytrigger。此时keycontinue与ReadData值均为1,下一个时钟周期脉冲信号回落到0。这样,我们就产生了一个锁存脉冲信号。

Step4: LCD显示

我们使用的1602液晶是通过HD44780型号的芯片驱动的。HD44780内置了DDRAM、CGROM和CGRAM。DDRAM—Display data RAM,即显示数据RAM,用来寄存待显示的字符代码;CGROM—Character generator ROM,即字符产生ROM,保存了192个常用字符的字模;CGRAM—Character generator RAM,即字符产生RAM,里面可保存8个用户自定义的字符。要在液晶上的某个位置上显示某个字符,就是要向DDRAM的某个地址写入要显示的数据代码。HD44780芯片已经做好的192个常用字符的字模使用8位二进制数值表示。由于我们需要的字符较为常见,字模中已经包含,因此不需要再构造自模。
查看HD44780的指令格式,我们只要把这些指令按照一定的顺序输入到液晶驱动芯片里,液晶就可以显示了。我们的指令输入顺序是:清屏指令->功能设置指令->进入模式设置指令->显示开关控制指令->设定DDRAM地址指令->数据写入DDRAM指令。
设置一个state寄存器进行状态的存储和转换。每一个状态结束以后,state执行下一个状态的指令,直至所有状态完成,回到第一个状态,等待驱动信号。
为了简单起见,我们可以写完指令或数据后等待足够长的时间后再开始下一次的指令或数据写入,这样我们可以省去了读取忙信号指令,以简化我们的操作。
使用Basys3上的Pmod接口实现硬件的外扩。将LCD的指令数据通过Pmod和面包板传输到1602液晶上,使用5V电压对1602进行供电。

Step5: 流水灯设计

keystop信号为锁存信号keytrigger,当产生锁存信号后,流水灯停止流水,表示当前处于锁存状态。当keytrigger再次产生后,表示取消锁存,流水灯继续流水。

Step6:

评论