Menu Close

Vivado下利用ROM显示数码管实验课

在上节课Vivado Block ROM 的生成与配置详解中学习了在Vivado下如何配置一个ROM IP核。这篇文章将使用之前生成的ROM IP核,设计一个用拨码开关控制数码管显示的实验。

1.实验目的

  • 学会使用Xilinx的Block Memory Generator,生成相应的ROM IP核。
  • 复习*.coe文件的格式,时钟分频,数码管的扫描显示,按键的去抖,并将各模块一起综合调度。

2.实验设计

  • 设计16位数据输出的ROM,地址范围0-255,地址宽度8-bit,针对每一个地址,存储地址的平方值,比如:在地址为0x11时,存储的值为0x121。
  • 使用FII-PRX100-D 板上的8位拨码开关作为ROM的寻址,在使用SW时注意去抖。
  • 要求用移位加的快速算法,将16进制转成BCD,使用5位数码管显示ROM中的内容。

Vivado下利用ROM显示数码管实验课

图1 工程框图

3.设计步骤

1)创建*.coe文件

在ROM IP核 rom16x256中填载了初始化的*.coe文件。按照实验设计要求,这个*.coe文件在每个地址中填充的是地址的平方值。这里使用了Verilog仿真工程生成相应的*.coe文件(参考文章verilog 仿真工程应用-生成coe/mif 文件,https://2743.com/archives/16307%EF%BC%89

最后生成的*.coe文件部分截图如下所示:(点击下面链接注册用户下载)

[content_control]test_rom.zip[/content_control]

 

图2

2)HEX2BCD

使用移位加的快速算法,将16进制的16-bit数转换成BCD码。参见文章权值变换法实现16进制到BCD码转换。

因为拨码开关输入最大值为0xFF,0xFF地址对应存储的数为0xFF X 0xFF = 0xFE01,换成十进制数是65025,在6位数码管的显示量程内。

HEX2BCD的代码如下:


 

注意在文章权值变换法实现16进制到BCD码转换里 HEX2BCD是转换了32-bit的十六进制数,这里只需要保留16-bit十六进制数所能表达的 个,十,百,千,万(ones,tens,hundreds, thousands,ten_thousands ),这里也省略了与上层控制程序的握手,因此纯是组合逻辑,不需要时钟。

 

3)数码管显示

数码管显示部分和文章复杂数字钟设计(4)–分频与显示译码,文章数码管动态扫描显示Verilog实现–秒表。

本工程使用的是的数码管工程,实现了将个,十,百,千,万(ones,tens,hundreds, thousands,ten_thousands )分别显示在对应的数码管上,并实现动态扫描,代码如下:


 

 

4)拨码开关的去抖

FII-PRX100-D FPGA开发板上拨码开关如下图所示:

图3

关于拨码开关去抖的原因和逻辑,参见文章自适应按键去抖Verilog实现与FPGA板载测试,注意按键去抖和拨码开关去抖略有差异,原因在于按键是“释放—按下,按下—释放”两个过程一般是代表一次操作;而拨码开关从上往下拨动,从下往上拨动应看作是两个操作,所以如果需要在按键去抖的工程上修改代码,需要将输出的脉冲信号位置和值稍作修改,修改后的代码如下:


 

上面的代码是对单bit拨码开关的去抖,在其上再包装一层,使用Verilog generate语句例化8个拨码开关(关于Verilog generate语句参见文章Verilog 中generate 语句),代码如下:


 

5)时钟与分频模块

时钟和分频模块主要是由PLL和f_div两个模块完成。PLL IP核的输入是FII-PRX100-D FPGA开发板的50 MHz晶振提供,输出的是100 MHz系统时钟。

注意除了上面的HEX2BCD模块是由组合逻辑构成,不需要时钟,其它的模块都需要系统时钟,或是分频模块产生的毫秒脉冲,秒脉冲,比如拨码开关去抖,需要使用系统时钟和毫秒脉冲。分频模块代码如下:


 

6)模块的组合与调度

本工程的顶层模块是top.v ,主要作用是组织各个模块,连接中间信号,接口FII-PRX100-D FPGA开发板上的晶振,拨码开关和数码管相关管脚。

代码如下:


 

7)管脚约束*.xdc文件

参考FII-PRX100-D FPGA开发板的硬件原理图,管脚约束文件如下:


 

4.下板实验现象

本工程在FII-PRX100-D上的实验现象如下所示:

5.实验思考

  • 如何编写*.coe文件形成正弦波形,余弦波形等函数发生器
  • 综合应用,结合ROM和PWM的特点,形成SPWM调制波形

 

Posted in FPGA, FPGA 教材教案, FPGA开发板, Verilog, Vivado, Vivado, 开发工具, 开发工具, 开发板, 开发语言, 教材与教案, 文章, 编程语言