名称:利用VHDL语言,实现0~8090任意进制8421BCD计数译码显示电路,并将计数器输出的8421BCD进行共阴数码管显示设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
1、计数器具有同步置数功能、异步清零功能,用VHD实现计数逻辑,并阐述设计原理,给出关键block diagram设计框图。
2、8421BCD码7段译码部分可以参见74LS48功能,用VHDL实现译码逻辑,并阐述设计原理,给出关键 block diagram设计框图。
3、译码输岀后驱动的数码管为共阴极数码管,阐述电路原理,给出相应编码方式。
报告要求
(1)按要求的格式书写,所有内容一律打印、封面要求统一。
(2)报告内容包括设计过程、软件仿真的结果及分析。
(3)报告中要有整体电路原理图、各模块原理图。
(4)软件仿真包括各个模块的仿真和整体电路的仿真。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
设计文档:
任意进制8421BCD计数译码显示
1、课题任务及要求
1.1课题任务
利用VHDL语言,实现0~8090任意进制8421BCD计数译码显示电路,并将计数器输出的8421BCD进行共阴极数码管显示。要求:
1. 计数器具有同步置数功能、异步清零功能,利用VHDL实现计数逻辑,并阐述设计原理,给出关键block diagram设计框图。
2. 8421BCD码译码部分可以参见74LS48功能,用VHDL实现译码逻辑,并阐述设计原理,给出关键block diagram设计框图。
3. 译码输出后驱动的数码管为共阴极数码管,阐述电路原理,给出响应的编码方式。
1.2课题要求
课题设计实现的功能指标为。
●设计指标一:计数器具有同步置数功能、异步清零功能
●设计指标二:使用8421BCD计数器
●设计指标三:译码输出后驱动的数码管为共阴极数码管
2、设计内容
系统总体设计思路为采用分模块设计,模块分为计数模块、数码管显示模块及顶层模块,具体模块功能具体介绍如下。
2.1 设计总体功能简介
系统总体设计思路为采用分模块设计,模块分为计数模块、数码管显示模块及顶层模块,采用自顶向下的设计思想。总体功能为实现0~8090任意进制8421BCD计数译码显示电路,并将计数器输出的8421BCD进行共阴极数码管显示
2.2 顶层模块功能
顶层模块实现将计数模块和显示模块连接的功能,顶层模块如下图所示
上图中,bcd_counter为计数模块,display为显示模块。顶层输入端口有:
Clk:时钟信号
Load:同步置数使能信号
Data_in[15:0]:同步置数的数据,采用8421BCD编码
顶层输出端口为4个7段数码管信号:
HEX0[6..0]:数码管0
HEX1[6..0]:数码管1
HEX2[6..0]:数码管2
HEX3[6..0]:数码管3
2.3 计数模块功能
计数模块如下图所示:
输入端口有:
Clk:时钟信号
Rst_p:系统复位信号,高电平有效
Load:同步置数使能信号
Data_in[15:0]:同步置数的数据,采用8421BCD编码
输出端口为计数值:
Data_out[15..0]:计数值输出采用8421BCD编码
该模块实现0~8090任意进制8421BCD计数器的功能,计数器具有同步置数功能、异步清零功能
2.4 显示模块功能
显示模块如下图所示:
输入端口有:
Clk:时钟信号
Data[15:0]:计数值,采用8421BCD编码
输出端口为4个7段数码管信号:
HEX0[6..0]:数码管0
HEX1[6..0]:数码管1
HEX2[6..0]:数码管2
HEX3[6..0]:数码管3
该模块实现8421BCD码译码功能,译码输出后驱动的数码管为共阴极数码管。
3、设计及实现方法
3.1 计时模块设计方法
计时模块实现0~8090任意进制8421BCD计数器的功能,计数器具有同步置数功能、异步清零功能。主要代码如下:
上述代码中,为实现任意进制的功能,定义了一个信号MOD_NUM信号,将该值设置为多少就是多少进制。下面process进制实现具体任意进制BCD码计数器的功能,定义了一个BCD编码的信号为count。
首先,实现异步清零的功能,当rst信号为1时,输出count为0,然后实现同步置数功能,当load信号为1时,将输入的data_in赋值给count。
最后就是实现BCD码计数器功能,首先判断是否计数到999,若是,则千位加1,否则继续判断是否计数到99,若是,则百位加1;否则继续判断是否计数到9,若是,则十位加1。否则只需要个位加1。
Count为BCD编码,其15~12位表示千位,11~8表示百位,7~4表示十位,3~0表示个位。
3.2 显示模块设计方法
显示模块实现8421BCD码译码功能,译码输出后驱动的数码管为共阴极数码管。其中单个数码管显示代码如下:
数码管显示模块用于控制数码管将计数值显示出来。使用7段数码管显示,每个数码管输入为7位,对应下图中的abcdefg7段,数码管为共阴极,当输入1时对应的段点亮,当输入为0时,对应的段灭。
根据上图可以观察到,若要显示数字0,G灭,ABCDEF亮,如果是共阳极数码管也就是对应编码为“1000000”,共阴极数码管则正好相反,故可以写成not “1000000”,也就是“0111111”,其中从左到右依次对应GFEDCBA。以此类推可以得到0~9的所有编码。
4、调试及运行结果
4.1 计时模块调试及运行结果
对计时模块进行单独仿真,仿真图如下图所示(为便于观察,设置进制为34)。
上图中,rst为异步清零信号,图中可以看到,当rst信号为1时,输出data_out立马清零。图中load为置位信号,图中可以看到,load信号为高时,输出data_out为data_in得值。
当rst和load信号均无效时,计数器按时钟正常计数,可以看到,当计数到34后,计数器清零,重新开始计数,故进制正确。
4.2 显示模块调试及运行结果
对显示模块进行单独仿真,仿真图如下图所示(为便于观察,设置计数器计数0~9)。
上图中,计数值输入为0000~0009,其中HEX0显示个位,也就是0~9,HEX1~3均显示0。根据前面关于数码管的介绍可知,0对应的编码为0111111,1对应的编码为0000110,以此类推可以做到仿真图0~9编码具正确。
4.3 系统总体调试及运行结果
对系统进行总体仿真,仿真图如下图所示:
上图可以看到,整体仿真图的仿真结果相当于将计数模块和显示模块进行合并显示,最终输出为HEX0~3的编码值。可以看到,当异步清零时,输出的编码值为0000,当同步置数时,输出的编码值为0034,其他情况下为递增计数。
5、设计总结
5.1设计中的问题、原因分析及解决方法
设计中一开始没有正确理解BCD编码的含义,导致使用了通常的二进制编码,这种编码的优点是代码简单,计数器较容易实现,但是缺点是不能直接按位分离出千位,百位,十位个位,导致时数码管显示不正确,后续改进为8421BCD编码,虽然计数器代码设计相对复杂一点,但是对于数码管显示部分就可以按位分离出千位,百位,十位和个位。
5.2设计方案的优缺点
本设计方案的优点是结构清晰,采用分模块设计方法,各个模块功能比较明确,可以分模块仿真,易于调试;缺点的话在于任意进制的设计在计数模块内通过一个参数进行定义,当要修改进制时,需要修改该模块内的参数,不是很灵活。
5.3心得体会
通过这次设计,我加深了对VHDL代码的理解,熟悉了quartus软件的编码和仿真操作,并且对8421BCD码的作用也有了更深刻的认识。通过这次实验,我对我使用VHDL和EDA工具有了一定的提高,后续有其他功能设计的话可以更加容易的上手,也锻炼了自己发现问题和解决问题的能力,为今后打下坚固基础。
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ENTITY?display?IS ???PORT?( ??????clk???:?IN?STD_LOGIC; ??????data??:?IN?STD_LOGIC_VECTOR(15?DOWNTO?0); ??????HEX0??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX1??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX2??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX3??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0) ???); END?display; ARCHITECTURE?RTL?OF?display?IS BEGIN ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(3?DOWNTO?0)?IS ????????????WHEN?"0000"?=> ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(7?DOWNTO?4)?IS ????????????WHEN?"0000"?=> ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(11?DOWNTO?8)?IS ????????????WHEN?"0000"?=> ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ?????????END?CASE; ??????END?IF; ???END?PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1518
1274