计数器与分频器实验

实验目的

(1) 熟悉计数器的功能特性和分频器应用;

(2) 用HDL语言设计二进制计数器和时钟分频器。

(3) 熟悉仿真软件的使用。

实验内容和要求

参考设计

流水灯实验中用按键手动产生时钟信号,本实验使用系统的连续时钟,使流水灯能自动移动。由于系统时钟的频率比较高,进入到VirtualBoard模块的CLOCK信号的频率是10MHz;如果直接用它作为移位寄存器的时钟,人的肉眼将无法分辨出LED灯的移动。所以需要设计一个分频器将时钟频率降下来。

实验材料中给出了一个二进制计数器的设计,认真阅读并理解HDL代码,计算出送给移位寄存器的clk信号的周期(频率的倒数);编译后下载到实验板上,观察流水灯的自动移动。注意需开启虚拟面板的自动刷新,如图 1所示。远程实验系统默认的自动刷新时间间隔为1000毫秒。

Snipaste_2019-09-22_00-08-32
图 1. 自动流水灯的虚拟面板

思考为什么观察到的流水灯移动会跳跃,如何才能观察到LED灯的匀速移动(提示:需根据clk信号的周期恰当设置刷新间隔)。

实验任务1

用HDL设计一个分频器,对10MHz输入时钟进行分频,分频后的时钟频率为1Hz。使用分频后的时钟作为移位寄存器的时钟,使LED灯每隔1秒移动一位。运行效果如图 2

自动流水灯
图 2. 时钟频率为1Hz的自动流水灯运行效果

分频器要求写成独立模块,端口声明如下。

module ClockDivider
#(parameter RATIO = 8)
(
input wire ClkIn,Reset,
output reg ClkOut
);

其中参数RATIO用来声明分频数。

实验任务2

用ModelSim仿真参考设计。关于ModelSim的用法请阅读实验教程《ModelSim仿真入门》,下面针对本实验做几点说明。

(1)Testbench在实验材料中已经提供,应读懂。本实验只做功能仿真,被仿真的设计模块是VirtualBoard。

(2)需要手动将count和q添加到波形窗口,重新启动仿真后的波形如图 3

Snipaste_2022-08-11_18-09-17
图 3. 计数器的仿真波形

从波形上看移位寄存器的输出q(图中最后一行)一直是00000001没有变化,也就是复位的初值。这是因为仿真的时间不够长,计数器count还没有溢出。可以修改testbench,延长停止仿真前的时长;或者将设计代码中的“assign clk = count[22];”改为较小的分频数以便能观察到q的变化。