VHDL语言设计实例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3、四位全加器的设计
library ieee; use ieee.std_logic_1164.all;
entity adder4b is
port(cin:in std_logic; a,b:in std_logic_vector(3 downto 0); s:out std_logic_vector(3 downto 0); cout:out std_logic); end adder4b; architecture struct of adder4b is component full_adder PORT(A,B,CIN:IN end component; signal carry_out0,carry_out1,carry_out2:std_logic; --低三位的进位 begin STD_LOGIC; COUT,SUM:OUT STD_LOGIC);
ARCHITECTURE behavior OF adder8 IS SIGNAL ss: STD_LOGIC_VECTOR ( 8 DOWNTO 0 ); SIGNAL aa, bb: STD_LOGIC_VECTOR ( 8 DOWNTO 0 ); BEGIN aa <= ‘0’& a; bb <= ‘0’& b; ss <= aa + bb + ci; s <= ss( 7 DOWNTO 0 ); co <= ss( 8 ); END behavior; 2、用结构描述实现1位全加器
--输出低电平有效
2、七段显示译码器 将四位二进制代码所表示的十进制数翻译成对应的七段显示码。 七段数码管见下图。它包含有七个笔划,通过控制各笔划的亮暗显示出数字。 它的输入信号端(a, b, c, d, e, f, g)与显示数码(十进制数字)的对应关系 下表所示。对应的七段译码器电路图如下图所示。其输入为代表显示数字的二进 制数(BCD码x4, x3, x2, x1),输出为数码管的输入信号。
选择信号赋值语句 ARCHITECTURE behavior OF decoder3_8 IS
SIGNAL SA: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN SA<= S&A;
WITH SA SELECT
Y<=“11111110”WHEN“0000”, "11111101"WHEN "0001" , --输出低电平有效
u3: full_adder
port map(cin=>carry_out1,a=>a(2),b=>b(2), sum=>s(2),cout=>carry_out2);
u4:add1bit
port map(cin=>carry_out2,a=>a(3),b=>b(3), sum=>s(3),cout=>cout);
Y: out STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出端
BEGIN
IF S=‘0’ THEN IF A=“000” THEN THEN THEN ELSIF A=“001” ELSIF A=“010” Y<=“11111101”; Y<=“11111011”; --低电平有效 Y<=“11111110”; --输出低电平有效
"11111011"WHEN "0010“ ,
"11110111"WHEN "0011“, "11101111"WHEN "0100“, "11011111"WHEN "0101“, "10111111"WHEN "0110“, "01111111"WHEN "0111“, "11111111"WHEN OTHERS; END behavior;
1
1 1
1
0 1
0
1 1
0 0
1 0 0 0
0
1 1源自文库
4
5 6 7
0100
0101 0110 0111
0
1 1 1
1
0 0 1
1
1 1 1
0
1 1 0
0 1
0 1 1 1 0 0
1
1 1 0
8
9
1000
1001
1
1
1
1
1
1
1
1
1 1
0 1
1
1
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DECL7S IS PORT (X:IN STD_LOGIC_VECTOR(4 DOWNTO 1); LED7S :OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END; ARCHITECTURE ONE OF DECL7S IS BEGIN PROCESS(X) BEGIN CASE X IS WHEN "0000"=>LED7S<="0111111";--相当于gfdecba<=“0111111” WHEN "0001"=>LED7S<="0000110"; WHEN "0010"=>LED7S<="1011011"; WHEN "0011"=>LED7S<="1001111"; WHEN "0100"=>LED7S<="1100110"; WHEN "0101"=>LED7S<="1101101"; WHEN "0110"=>LED7S<="1111101"; WHEN "0111"=>LED7S<="0000111"; WHEN "1000"=>LED7S<="1111111"; WHEN "1001"=>LED7S<="1101111";
第三章 VHDL语言设计实例
本章主要讲解VHDL语言设计常用的组合逻辑电路、时序逻辑电路和有限 状态机。 3.1组合逻辑电路的设计 在任何时刻的输出仅取决于当时的输入信号的逻辑电路。 常用的组合逻辑电路有加法器、译码器、编码器、数据选择器等。 一、加法器 1、用行为描述实现8位全加器 设加法器的输入端为a(加数),b(加数),ci(来自低位的进位),输 出端口为s(和),co(进位)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY adder8 IS PORT ( ci: IN STD_LOGIC; a,b: IN STD_LOGIC_VECTOR( 7 DOWNTO 0 ) ; s: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ) ; co: OUT STD_LOGIC ); END adder8;
u1: full_adder
port map(cin=>cin,a=>a(0),b=>b(0), sum=>s(0),cout=>carry_out0);
--名称映射/关联
u2: full_adder
port map(cin=>carry_out0,a=>a(1),b=>b(1), sum=>s(1),cout=>carry_out1);
U2
cin
U1 A s
半加器
s e
半加器
sum f U3
x y
sum
c
B
c
d
ORR2
cout
cout
d, e, f为中间节点 1位全加器
1位半加器
底层文件
--1位半加器的VHDL源程序 LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY half_adder IS PORT( x, y : IN Std_Logic; sum, cout : OUT Std_Logic); END half_adder; ARCHITECTURE behav1 OF half_adder IS BEGIN PROCESS(x, y) BEGIN sum <= x XOR y; cout <= x AND y; END PROCESS; END behav1; --或门orr2的VHDL源程序 LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY oor2 IS PORT( in1, in2: IN Std_Logic; out1: OUT Std_Logic ); END orr2; ARCHITECTURE behav2 OF orr2 IS BEGIN out1<= in1 OR in2; END behav2;
条件信号赋值语句
ARCHITECTURE behavior OF decoder3_8 IS SIGNAL SA: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN SA<= S&A; Y<=“11111110” WHEN SA=“0000” else "11111101“ WHEN SA= "0001" else "11111011“ WHEN SA= "0010“ else "11110111“ WHEN SA= "0011“ else "11101111“ WHEN SA= "0100“ else "11011111“ WHEN SA= "0101“ else "10111111“ WHEN SA= "0110“ else "01111111“ WHEN SA= "0111“ else "11111111“; END behavior;
end struct;
两个四位的全加器可以构成一个8为的全加器。
二、译码器 练习IF语句、CASE语句、条件信号赋值语句和选择信号赋值语句的使用。
1、3-8译码器
library IEEE; use IEEE.std_logic_1164.all;
entity decoder3_8 is
port (A: in STD_LOGIC_VECTOR(2 DOWNTO 0); --数据输入端 --使能控制端 S:in STD_LOGIC; end decoder3_8; architecture behavior of decoder3_8 is
顶层文件 LIBRARY IEEE; --1位全加器的VHDL源程序 USE IEEE.Std_Logic_1164.ALL; ENTITY full_adder IS PORT( A, B, cin : IN Std_Logic; sum, cout : OUT Std_Logic); END full_adder; ARCHITECTURE structural_view OF full_adder IS --基于电路结构的结构风格 结构体 SIGNAL e, d , f : Std_Logic; --与中间节点对应的内部信号 COMPONENT half_adder --半加器元件说明/定义 PORT(A, B : IN Std_Logic; sum, cout : OUT Std_Logic ); END COMPONENT; COMPONENT orr2 --或门加器元件说明/定义 PORT( in1, in2 : IN Std_Logic; out1: OUT Std_Logic ); END COMPONENT; BEGIN u1 : half_adder PORT MAP (a, b, e, d); --位置映射 u2 : half_adder PORT MAP (cin, e, sum, f); 元件例化 u3 : orr2 PORT MAP (d, f, cout); END structural_view;
END IF;
END IF; END behave;
以上是用IF语句写的结构体。下面分别用CASE语句、条件信号赋值语句
和选择信号赋值语句来完成结构体的功能描述。
CASE语句 ARCHITECTURE behavior OF decoder3_8 IS SIGNAL SA: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN SA<= S&A; PROCESS(SA) begin CASE SA IS WHEN “0000”=>Y<=“00000001”; --输出高电平有效 WHEN “0001" =>Y<="00000010"; WHEN “0010" =>Y<="00000100"; WHEN “0011" =>Y<="00001000"; WHEN “0100" =>Y<="00010000"; WHEN “0101" =>Y<="00100000"; WHEN “0110" =>Y<="01000000"; WHEN “0111" =>Y<="10000000"; WHEN others =>Y<=“00000000"; END CASE; END PROCESS; END BEHAVIOR;
ELSIF ELSIF ELSIF ELSIF ELSIF ELSE
A=“011” A=“100” A=“101” A=“110” A=“111”
THEN Y<=“11110111”; THEN Y<=“11101111”; THEN Y<=“11011111”; THEN Y<=“10111111”; THEN Y<=“01111111”; Y<=“11111111”;
a f e g d b
显示译码电路 a b c d e f g
c
x1
x2
x3
x4
a
b
c
d
e
f
g
七段译码器
七段数码管示意图
七段数码管(共阴即高电平亮)的输入代码与显示数码的对应关系 要显示的数字 输出代码
数 字
0
BCD码
0000
a
1
b
1
c
1
d
1
e f
1 1
g
0
1
2 3
0001
0010 0011
0
1 1
相关文档
最新文档