33
entity char_4to1_7segv is port(
s:in std_logic_vector(1 downto 0);
U,V,W,X:in std_logic_vector(2 downto 0); hex0:out std_logic_vector(6 downto 0)); end char_4to1_7segv;
architecture behave_char_4to1_7segv of char_4to1_7segv is component char_7seg is port(
c:in std_logic_vector(2 downto 0); hex:out std_logic_vector(6 downto 0)); end component;
component mux_4to1_3bit is port(
s:in std_logic_vector(1 downto 0);
u,v,w,x:in std_logic_vector(2 downto 0); m:out std_logic_vector(2 downto 0)); end component;
signal mout:std_logic_vector(2 downto 0); begin
34
u1:mux_4to1_3bit port map(s,U,V,W,X,mout); u2:char_7seg port map(mout,hex0) ; end behave_char_4to1_7segv;
代码中用红色标识出来的就是元件的定义和调用部分。将文件另存为char_4to1_7segv.vhd,并将其设定为项目的顶层设计文件。再进行语法检查、引脚分配和编译下载。
实验4:BCD码显示及运算 1.二进制码到BCD码的转换
二进制码与BCD码之间的转换关系见下表:
表中将4位二进制输入V=v3v2v1v0转换成2位十进制D=d1d0,实现办法是用SW[3..0]作为二进制输入,而用HEX1和HEX0作为十进制输出的显示。从上述表中可以看出,当V<=9时,d1=0、d0=V;反之,d1=1、d0=V-10。
35
实验步骤如下:
第1步:新建一个Quartus项目。 第2步:建立一个VHDL文件,根据上述工作原理编写代码以实现所要求的电路,文件另存为bin_bcd.vhd。由于程序中用到了二进制码与十进制数之间的比较,所以需要添加一个程序包如下:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
第3步:完成代码转换之后,需要将BCD码在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。
第4步:采用图形编辑方法或元件调用方法都可以完成最终的电路功能。
第5步:编译并下载验证。
2.1位BCD加法器
电路原理是输入两个BCD码A和B以及1位进位输入cin,输出是BCD码的和sum以及1位进位输出cout。例如当A=1001(9)、B=1001(9)、cin=1时,cout=1,sum=1001(9)。电路的输出最大值也就是19。
1位BCD加法器可以利用两个二进制加法器实现,其原理如下图所示。在VHDL中,二进制加法可以直接用A+B实现。不过前提
36
是需要使用std_logic_unsigned.all这个程序包。 程序的部分代码如下: …..
signal m:std_logic_vector(4 downto 0); signal c:std_logic; begin
m<=('0'&A)+('0'&B)+cin;
c<=m(4) or (m(3) and m(2)) or (m(3) and m(1)); cout<=c;
sum<=m(3 downto 0)+('0'&c&c&'0'); …….
这个程序完全是按照上述工作原理图得出的,文件另存为bcd_add_1bit.vhd。由于需要将结果值在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。
验证电路时可以用SW[0]作为cin输入端,SW[4..1]、SW[8..5]分别作为A和B的输入端,HEX0作为sum的输出端,LEDG[0]作
37
为cout的输出端。
3.2位BCD加法器
从1位BCD加法器扩展为2位BCD加法器,可以采用图形编辑器和VHDL文本输入两种方法实现。输入两个2位BCD码A1A0和B1以及1位进位输入cin,输出2位BCD码和S1S0和1位进位输出cout。验证电路时可用SW[8..1]表示A1A0,SW[16..9]表示B1,SW[0]表示cin;HEX1和HEX0
B0
B0
表示S1S0,LEDG[0]表示cout。
方法1:采用图形编辑器的方法,最终效果图如下所示。
方法2:采用1位BCD加法器的设计思路重新设计一个2位BCD加法器,以下是实现2位BCD加法器的伪代码,可作为编程的思路。
1 T0 = A0 + B0 2 if(T0 > 9) then 3 Z0 = 10; 4 c1 = 1; 5 else