跳转至

实验要求

1 设计数码管扫描

  • 采用模块化设计
  • 完成上板测试
  • 查看RTL分析、综合和实现的电路图(Schematic)
  • 查看电路资源使用情况

1.1 设计要求

按照下图所示,完成数码管扫描显示,数码管以十进制无符号整数显示定时器的剩余秒数。为了完成这个任务,你需要设计如下内容:

  • 一个数码管动态显示单元,支持8个数码管的动态扫描显示
  • 一个定时器,用于产生定时信号,这个定时器的计数将会显示在数码管中。

数码管动态扫描显示

上图(来源于PPT)的数据通路中,d3-d0是定时器的输出,对应四组数码管的每组 4 位数据。在本次试验中,你需要点亮 8 个数码管,因此需要将各个信号拓宽。数码管刷新的选择信号前设置分频器降频,是因为数码管刷新过快会导致亮度降低。

**方案1:**注意上图中的计数器不是我们先前提到的定时器,也不是我们先前提到的定时器中例化的计数器,而是另一个位数较小的计数器,这个计数器不需要输入start信号,会在分频器输出的新时钟下循环计数,计数结果再被译成独热码作为数码管刷新的选择信号。

方案2:使用上图中的计数器向多路选择和译码器的直接连线只是一种可选的设计,如果你的定时器中的计数器使用的是开关数据和低位多个零的位拼接,然后以高位数据作为显示数据,你可选择较低的两位作为数码管刷新(此时哪组数码管点亮)的选择信号,而不需要再写一个计数器。

**方案3:**可以将扫描计数器、多路选择器和位选译码器封装在同一个显示模块中。模块内部用一个3位循环计数器记录当前扫描的数码管编号,每当降频后的时钟上升沿到来时切换到下一位。多路选择器和位选译码器共用这个编号,分别选择显示数据和点亮对应的数码管。

无论哪种方案,你都要保证肉眼看不清数码管的扫描。

在本次试验中,我们使用开关作为定时器的置数,并启动计时。

你需要自己实现按键开关去抖动和数码管动态扫描显示。

你可以自行决定具体的数据通路和模块间关系,只要输入输出正确即可。

限制文件第二行的period为主时钟周期(ns),waveform中的两个参数为时钟上升沿和下降沿,上升沿默认为0,下降沿默认应设为时钟周期的一半,比如:

  set_property -dict { PACKAGE_PIN E3    IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
  create_clock -add -name sys_clk_pin -period 50.00 -waveform {0 25} [get_ports {clk}];

由于只使用16个开关,最大输入数据为216-1=65535,这会导致计数在肉眼不可分辨的时间完成。为了解决这个问题,我们不推荐大幅度更改限制文件的周期,而推荐使用分频器降频,用脉冲输出作为计数器的时钟;或者令计数器的输入数据为开关数据做高位和内置数据低位补零的位拼接。

你的计数器最终上板显示的计数速度,应近似为一秒一次。

将btnr按钮作为计数开始start按钮。计数完成时IO_L11P_T1_SRCC_14 Sch=led16_r灯亮

这一步中实验顶层模块接口如下:

  input  logic         clk,      // 时钟信号
  input  logic         rstn,      // 复位信号
  input  logic  [15:0] sw,        // 定时器设置的周期数(16位)
  input  logic         st,        // 定时器开始信号
  output logic  [ 7:0] an,        // 数码管位选信号
  output logic  [ 6:0] seg,       // 数码管段选信号
  output logic         td         // 定时器到时信号,连接led16_r

1.2 验收要求

上板:向助教展示以下现象:

  • 开关设置非零初值,按下btnr启动,到时指示灯熄灭,显示值约每秒减一;再次按下btnr,按当前开关值重新计时。
  • 计数归零或复位后,显示0,到时指示灯亮,停止计数。
  • 八位数码管在计时及停止时均稳定显示,无明显闪烁或重影。

2 实验验收要求

本次实验只要求完成32位定时器的设计。要求能够正确显示定时器的计数值,计数完成时,IO_L11P_T1_SRCC_14 Sch=led16_r灯亮。