资源描述
VHDL程序设计题
四、 编程题(共50分)
1、请补全以下二选一VHDL程序(本题10分)
Entity mux is
port(d0,d1,sel:in bit;
q:out BIT ); (2)
end mux;
architecture connect of MUX is (4)
signal tmp1, TMP2 ,tmp3:bit; (6)
begin
cale:
block
begin
tmp1<=d0 and sel;
tmp2<=d1 and (not sel)
tmp3<= tmp1 and tmp2;
q <= tmp3; (8)
end block cale;
end CONNECT ; (10)
2、编写一个2输入与门的VHDL程序,请写出库、程序包、实体、构造体相关语句,将端口定义为标准逻辑型数据结构(本题10分)
&
a
b
y
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; (2)
ENTITY nand2 IS
PORT (a,b:IN STD_LOGIC; (4)
y:OUT STD_LOGIC); (6)
END nand2;
ARCHITECTURE nand2_1 OF nand2 IS (8)
BEGIN
y <= a NAND b; --与y <=NOT( a AND b);等价 (10)
END nand2_1;
3、根据下表填写完成一个3-8线译码器的VHDL程序(16分)。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decoder_3_to_8 IS
PORT (a,b,c,g1,g2a,g2b:IN STD_LOGIC;
y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); (2)
END decoder_3_to_8;
ARCHITECTURE rtl OF decoder_3_to_8 IS
SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0); (4)
BEGIN
indata <= c & b & a; (6)
PROCESS (indata,g1,g2a,g2b)
BEGIN
IF (g1 = '1' AND g2a = '0' AND g2b = '0' ) THEN (8)
CASE indata IS
WHEN "000"=> y <= "11111110";
WHEN "001" => y <= "11111101";
WHEN "010" => y <= "11111011"; (10)
WHEN "011" => y <= "11110111";
WHEN "100" => y <= "11101111";
WHEN "101" => y <= "11011111";
WHEN "110" => y <= "10111111"; (12)
WHEN "111" => y <= "01111111";
WHEN OTHERS=> y <= "XXXXXXXX";
END CASE;
ELSE
y <= "11111111"; (14)
END IF;
END PROCESS; (16)
END rtl;
4、三态门电原理图如右图所示,真值表如左图所示,请完成其VHDL程序构造体部分。
(本题14分)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY tri_gate IS
PORT(din,en:IN STD_LOGIC;
dout : OUT STD_LOGIC);
END tri_gate ;
ARCHITECTURE zas OF tri_gate IS
BEGIN
PROCESS (din,en)
BEGIN
IF (en=‘1') THEN dout <= din;
ELSE dout <= ‘Z’;
END IF;
END PROCESS ;
END zas ;
四、 编程题(共50分)
1、根据一下四选一程序的结构体部分,完成实体程序部分(本题8分)
entity MUX4 is
port( (2)
s: in std_logic_vector(1 downto 0); (4)
d: in std_logic_vector(3 downto 0); (6)
y: out std_logic (8)
);
end MUX4;
architecture behave of MUX4 is
begin
process(s)
begin
if (s="00") then
y<=d(0);
elsif (s="01") then
y<=d(1);
elsif (s="10") then
y<=d(2);
elsif (s="11") then
y<=d(3);
else
null;
end if;
end process;
end behave;
2、编写一个数值比较器VHDL程序的进程(不必写整个结构框架),要求使能信号g低电平时比较器开始工作,输入信号p = q,输出equ为‘0’,否则为‘1’。(本题10分)
process(p,q) (2)
begin
if g='0' then (4)
if p = q then
equ <= '0'; (6)
else
equ <= '1'; (8)
end if;
else
equ <= '1'; (10)
end if;
end process;
3、填写完成一个8-3线编码器的VHDL程序(16分)。
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity eight_tri is
port(
b: in std_logic_vector(7 downto 0); (2)
en: in std_logic;
y: out std_logic_vector(2 downto 0) (4)
);
end eight_tri;
architecture a of eight_tri is (6)
signal sel: std_logic_vector(8 downto 0);
begin
sel<=en & b; (8)
y<= “000” when (sel=”100000001”)else
“001” when (sel=”100000010”)else (10)
“010” when (sel=”100000100”)else
“011” when (sel=”100001000”)else
“100” when (sel=”100010000”)else (12)
“101” when (sel=”100100000”)else
“110” when (sel=”101000000”)else (14)
“111” when (sel=”110000000”)else (16)
“zzz”;
end a;
4、图中给出了4位逐位进位全加器,请完成其VHDL程序。(本题16分)
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity full_add is
port (
a,b: in std_logic_vector (3 downto 0); (2)
carr: inout std_logic_vector (4 downto 0);
sum: out std_logic_vector (3 downto 0)
);
end full_add;
architecture full_add_arch of full_add is
component adder (4)
port (
a,b,c: in std_logic;
carr: inout std_logic;
sum: out std_logic (6)
);
end component;
begin
carr(0)<='0';
u0:adder port map(a(0),b(0),carr(0),carr(1),sum(0));
u1:adder port map(a(1),b(1),carr(1),carr(2),sum(1)); (8)(10)
u2:adder port map(a(2),b(2),carr(2),carr(3),sum(2)); (12)
u3:adder port map(a(3),b(3),carr(3),carr(4),sum(3)); (14)(16)
end full_add_arch;
四、 编程(共50分)
1、完成下图所示的触发器。(本题10分)
CLR
CLK
D
Q
QN
library IEEE;
use IEEE.std_logic_1164.all;
entity VposDff is
port (CLK, CLR, D: in STD_LOGIC; ----------2分
Q, QN: out STD_LOGIC ); ----------4分
end VposDff;
architecture VposDff_arch of VposDff is
begin
process ( CLK, CLR ) ----------6分
begin
if CLR='1' then Q <= '0'; QN <='1';
elsif CLK'event and CLK='1' then
Q <= D; QN <= not D; ----------8分
end if;
end process; ----------10分
end VposDff_arch;
2、完成以下4位全加器代码(本题10分)
library IEEE;
use IEEE.std_logic_1164.all;
entity full_add is
port (
a,b: in std_logic_vector (3 downto 0);
cin: in std_logic;
cout: out std_logic;
sum: out std_logic_vector (3 downto 0)
);
end full_add;
architecture full_add_arch of full_add is
component adder
port ( a,b,c: in std_logic;
carr: out std_logic;
sum: out std_logic );
end component;
signal c1,c2,c3: std_logic; 2分
begin
u0:adder port map(a(0),b(0),cin,c1,sum(0)); 4分
u1:adder port map(a(1),b(1),c1,c2,sum(1)); 5分
u2:adder port map(a(2),b(2),c2,c3,sum(2)); 6分
u3:adder port map(a(3),b(3),c3,cout,sum(3)); 10分
end full_add_arch;
3、补充完整如下代码,使之完成4状态不断循环。(本题10分)
ARCHITECTURE arc OF ss IS
type states is ( st0,st1,st2,st3 ); 2分
signal outc: states; 4分
BEGIN
PROCESS(clk)
BEGIN
IF reset='1' then
outc <=st0 ; 6分
elsif clk'event and clk='1' then
CASE outc IS
WHEN st0 => outc <= st1; 7分
WHEN st1 => outc <= st2; 8分
WHEN st2 => outc <= st3; 9分
WHEN st3 => outc <= st0; 10分
WHEN OTHERS => outc <=st0;
END CASE;
end if;
END PROCESS;
END arc;
4、设计异或门逻辑:(本题20分)
如下异或门,填写右边的真值表。(此项5分)
A
B
Y
0
0
0
0
1
1
1
0
1
1
1
0
其表达式可以表示为:(此项5分)
这一关系图示如下:
试编写完整的VHDL代码实现以上逻辑。可以采用任何描述法。(此项10分)
library ieee;
use ieee.std_logic_1164.all; 1分
entity yihuo1 is
port( a,b :in std_logic;
y :out std_logic );
end yihuo1; 4分
architecture yihuo1_behavior of yihuo1 is
begin 7分
process(a,b) y<=a xor b;
begin (第2种写法)
if a=b then
y<='0';
else
y<='1';
end if;
end process;
end yihuo1_behavior; 10分
四、 编程(共50分,除特殊声明,实体可只写出PORT语句,结构体要写完整)
1、用IF语句编写一个二选一电路,要求输入a、b, sel为选择端,输出q。(本题10分)
Entity sel2 is
Port (
a,b : in std_logic;
sel : in std_logic;
q : out std_logic
);
End sel2; (3)
Architecture a of sel2 is
begin
if sel = ‘0’ then
q <= a; (6)
else
q <= b; (9)
end if;
end a; (10)
2、编写一个4位加法计数器VHDL程序的进程(不必写整个结构框架),要求复位信号reset低电平时计数器清零,变高后,在上升沿开始工作;输入时钟信号为clk,输出为q。(本题10分)
Process(reset,clk) (2)
begin
if reset = ‘0’ then
q <= “0000”; (4)
elsif clk’event and clk = ‘1’ then (6)
q <= q + 1; (9)
end if;
end process; (10)
3、填写完成一个8-3线编码器的真值表(5分),并写出其VHDL程序(10分)。
8 -3线编码器真值表
en
b
y0y1y2
1
00000000
000
1
00000010
001
1
00000100
010
1
00001000
011
1
00010000
100
1
00100000
101
1
01000000
110
1
10000000
111
0
xxxxxxxx
高阻态
entity eight_tri is
port(
b: in std_logic_vector(7 downto 0);
en: in std_logic;
y: out std_logic_vector(2 downto 0)
);
end eight_tri; (3)
architecture a of eight_tri is
signal sel: std_logic_vector(8 downto 0); (4)
begin
sel<=en & b;
y<= “000” when (sel=”100000001”)else
“001” when (sel=”100000010”)else
“010” when (sel=”100000100”)else
“011” when (sel=”100001000”)else
“100” when (sel=”100010000”)else
“101” when (sel=”100100000”)else
“110” when (sel=”101000000”)else
“111” when (sel=”110000000”)else (9)
“zzz”; (10)
end a;
4、根据已给出的全加器的VHDL程序,试写出一个4位逐位进位全加器的VHDL程序。(本题15分)
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity adder is
port (
a,b,c: in std_logic;
carr: inout std_logic;
sum: out std_logic
);
end adder;
architecture adder_arch of adder is
begin
sum <= a xor b xor c;
carr <= (a and b) or (b and c) or (a and c);
end adder_arch;
entity full_add is
port (
a,b: in std_logic_vector (3 downto 0);
carr: inout std_logic_vector (4 downto 0);
sum: out std_logic_vector (3 downto 0)
);
end full_add; (5)
architecture full_add_arch of full_add is
component adder
port (
a,b,c: in std_logic;
carr: inout std_logic;
sum: out std_logic
);
end component; (10)
begin
carr(0)<='0';
u0:adder port map(a(0),b(0),carr(0),carr(1),sum(0));
u1:adder port map(a(1),b(1),carr(1),carr(2),sum(1));
u2:adder port map(a(2),b(2),carr(2),carr(3),sum(2));
u3:adder port map(a(3),b(3),carr(3),carr(4),sum(3));
end full_add_arch; (15)
四、 编程(共50分,除特殊声明,实体可只写出PORT语句,结构体要写完整)
1、用IF语句编写一个四选一电路,要求输入d0~d3, s为选择端,输出y。(本题10分)
entity MUX4 is
port(
s: in std_logic_vector(1 downto 0);
d: in std_logic_vector(3 downto 0);
y: out std_logic
);
end MUX4; (3)
architecture behave of MUX4 is
begin
process(s)
begin
if (s="00") then
y<=d(0); (4)
elsif (s="01") then
y<=d(1); (5)
elsif (s="10") then
y<=d(2); (6)
elsif (s="11") then
y<=d(3); (7)
else
null; (9)
end if;
end process;
end behave; (10)
2、编写一个数值比较器VHDL程序的进程(不必写整个结构框架),要求使能信号g低电平时比较器开始工作,输入信号p = q,输出equ为‘0’,否则为‘1’。(本题10分)
process(p,q) (2)
begin
if g='0' then (4)
if p = q then
equ_tmp <= '0'; (6)
else
equ_tmp <= '1'; (8)
end if;
else
equ_tmp <= '1'; (10)
end if;
end process;
3、填写完成一个3-8线译码器的真值表(5分),并写出其VHDL程序(10分)。
3-8译码器的真值表
en
a2a1a0
y
1
000
00000001
1
001
00000010
1
010
00000100
1
011
00001000
1
100
00010000
1
101
00100000
1
110
01000000
1
111
10000000
0
xxx
00000000
entity tri_eight is
port(
a: in std_logic_vector (2 downto 0);
en: in std_logic;
y: out std_logic_vector (7 downto 0)
);
end tri_eight; (2)
architecture a of tri_eight is
signal sel: std_logic_vector (3 downto 0); (4)
begin
sel(0) <= a(0); sel(1) <= a(1); sel(2) <= a(2); sel(3) <= en; (5)
with sel select
y <= "00000001" when "1000",
"00000010" when "1001",
"00000100" when "1010",
"00001000" when "1011",
"00010000" when "1100",
"00100000" when "1101",
"01000000" when "1110",
"10000000" when "1111",
"00000000" when others; (9)
end a; (10)
4、根据已给出的二-十(BCD)进制优先权编码器功能表,试写出其VHDL程序。(本题15分)
二-十(BCD)进制优先权编码器功能表
输入
输出
I1
I2
I3
I4
I5
I6
I7
I8
I9
Y3
Y2
Y1
Y0
1
1
1
1
1
1
1
1
1
1
1
1
1
X
X
X
X
X
X
X
X
0
0
1
1
0
X
X
X
X
X
X
X
0
1
0
1
1
1
X
X
X
X
X
X
0
1
1
1
0
0
0
X
X
X
X
X
0
1
1
1
1
0
0
1
X
X
X
X
0
1
1
1
1
1
0
1
0
X
X
X
0
1
1
1
1
1
1
0
1
1
X
X
0
1
1
1
1
1
1
1
1
0
0
X
0
1
1
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
0
entity prior is
port(
d : in std_logic_vector(9 downto 1);
q : out std_logic_vector(3 downto 0)
);
end prior; (2)
architecture behavior of prior is
begin
process(d) (4)
1
begin
if d = "111111111" then
q <= "1111";
elsif d(9) = '0' then
q <= "0110";
elsif d(8) = '0' then
q <= "0111";
elsif d(7) = '0' then
q <= "1000";
elsif d(6) = '0' then
q <= "1001";
elsif d(5) = '0' then
q <= "1010";
elsif d(4) = '0' then
q <= "1011";
elsif d(3) = '0' then
q <= "1100";
elsif d(2) = '0' then
q <= "1101";
elsif d(1) = '0' then
q <= "1110";
end if; (9)
end process;
end behavior;
展开阅读全文