.答:数据类型BIT \\ INTEGER \\ BOOLEAN均定义在STD库中。IEEE库和程序包STD_LOGIC.1164 、STD_LOGIC_UNSIGNED、STD_LOGIC_SIGNED、STD_LOGIC_ARITH等总是可见的。
5-6.函数和过程有什么区别?
答:子程序有两种类型,即过程(PROCEDURE)和函数(FUNCTION)。它们的区别在于:过程的调用可以通过其界面获得多个返回值,而函数只能返回一个值;在函数入口中,所有参数都是输入参数,而过程有输入参数、输出参数和双向参数;过程一般被看作一种语句结构,而函数通常是表达式的一部分;过程可以单
PROCESS (a , b ,c ,d) BEGIN
IF a=’0’AND b=’1’THEN NEXT1 <=\ ELSEIF a=’0’THEN NEXT1 <=d; ELSEIF b=’1’THEN NEXT1 <=c; ELSE NEXT1 <=\ END IF; END PROCESS; 独存在,而函数通常作为语句的一部分调用。
5-7.若在进程中加入WAIT语句,应注意哪几个方面的问题?
答:应注意以下问题:○1已列出敏感信号的进程中不能使用任何形式的WAIT语句;○2一般情况下,只有WAIT UNTIL格式的等待语句可以被综合器所接受,其余语句格式只能在VHDL仿真器中使用;○3在使用WAIT ON语句的进程中,敏感信号量应写在进程中的WAIT ON语句后面;○4在不使用WAIT ON语句的进程中,敏感信号量应在开头的关键词PROCESS后面的敏感信号表中列出。
5-8.哪些情况下需用到程序包STD_LOGIC_UNSIGNED?试举一例。
答:○1调用数据类型变换函数或重载运算符函数时;○2定义UNSIGNED类型的数据时。举例如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; · ·
IF temp=\ ELSE temp:=temp+16;END IF;···
5-9.为什么说一条并行赋值语句可以等效为一个进程?如果是这样的话,怎样实现敏感信号的检测?
答:因为信号赋值语句的共同点是赋值目标必须都是信号,所有赋值语句与其它并行语句一样,在结构体内的执行是同时发生的,与它们的书写顺序没有关系,所以每一信号赋值语句都相当于一条缩写的进程语句。由于这条语句的所有输入信号都被隐性地列入此缩写进程的敏感信号表中,故任何信号的变化
都将相关并行语句的赋值操作,这样就实现了敏感信号的检测。 5-10.比较CASE语句和WITH_SELECT语句,叙述它们的异同点?
答:相同点:CASE语句中各子句的条件不能有重叠,必须包容所有的条件;WITH_SECLECT语句也不允许选择值有重叠现象,也不允许选择值涵盖不全的情况。另外,两者对子句各选择值的测试都具有同步性,都依赖于敏感信号的变化。不同点:CASE语句只能在进程中使用,至少包含一个条件语句,可以有多个赋值目标;WITH_SECLECT语句根据满足的条件,对信号进行赋值,其赋值目标只有一个,且必须是信号。
5-11.将以下程序段转换为WHEN_ELSE语句:
原程序转换如下:
ARCHITECTURE one OF mux IS BEGIN
NEXT1 <=\’0’AND b=’1’ELSE d WHEN a=’0’ELSE c WHEN b=’1’ELSE \ END one; END PROCESS;
5-12试给出一位全减器的算法描述、数据流描述、结构描述和混合描述。 行为(算法)描述 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY f_sub IS PORT(x,y,sub_in:IN STD_LOGIC;
sub_out,diff:OUT STD_LOGIC);
END f_sub ;
ARCHITECTURE bhv OF f_sub IS
SIGNAL tmp:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
tmp<=x&y&sub_in; PROCESS(tmp) BEGIN
CASE tmp IS
WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN OTHERS=> NULL; END CASE;
END PROCESS;END bhv ; 数据流描述 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY f_sub IS PORT(x,y,sub_in:IN STD_LOGIC;
sub_out,diff:OUT STD_LOGIC);
END f_sub ;
ARCHITECTURE rtl OF f_sub IS
BEGIN
diff<=x XOR y XOR sub_in;
sub_out<=(NOT x AND y )OR ((x XNOR y) AND sub_in); END rtl ;
结构描述:
LIBRARY IEEE; - - 半减器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_sub IS PORT(a,b:IN STD_LOGIC;
co,so:OUT STD_LOGIC);
END h_sub ;
ARCHITECTURE fh1 OF h_sub IS BEGIN
so<=a XOR b; co<=NOT a AND b; END fh1;
LIBRARY IEEE; - -或门描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2a IS PORT(a,b:IN STD_LOGIC;
c:OUT STD_LOGIC);
END or2a;
ARCHITECTURE one OF or2a IS BEGIN
c<=a OR b; END one;
LIBRARY IEEE; - -全减器描述 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY f_sub1 IS
PORT(x,y,sub_in:IN STD_LOGIC;
sub_out,diff:OUT STD_LOGIC); END f_sub1 ;
ARCHITECTURE strl OF f_sub1 IS COMPONENT h_sub
PORT(a,b:IN STD_LOGIC;
co,so:OUT STD_LOGIC);
END COMPONENT; COMPONENT or2a PORT(a,b:IN STD_LOGIC;
c:OUT STD_LOGIC);
END COMPONENT;
SIGNAL d,e,f:STD_LOGIC; BEGIN
u1:h_sub PORT MAP(x,y,d,e); u2:h_sub PORT MAP(e,sub_in,f,diff); u3:or2a PORT MAP(d,f,sub_out); END strl ;
5-13用VHDL描述下列器件的功能:
(1)十进制—BCD码编码器,输出使能为低电平有效。 library ieee;
use ieee.std_logic_1164.all; entity bin_bcd is
port(bin : in integer range 0 to 20; ena : in std_logic;
BCD_out : out std_logic_vector(7 downto 0)); end;
architecture a of bin_bcd is begin
Binary_BCD : Block BEGIN BCD_out <= \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\
\end block;
end a;
(2)时钟(可控)RS触发器。 LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL; ENTITY ffrs IS
PORT(s,r: IN std_logic;
q,qb: OUT std_logic); END ffrs;
ARCHITECTURE rtl OF ffrs IS SIGNAL qn,nqn: std_logic; BEGIN
qn<= r NOR nqn; nqn<= s NOR qn; q<=qn;
qb<=nqn; END rtl;
(3)带复位端、置位端、延迟为15ns的响应 CP下降沿触发的JK触发器。 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity jkff is port(
j,k,rst,clr : IN bit; clk : in bit; q,nq : out bit ); end;
architecture a of jkff is signal q_s,nq_s : bit; begin
process(j,k,rst,clr,clk) begin
if rst='1' then q_s<='1'; nq_s<='0';
elsif clk'event and clk='0' then if clr='1' then q_s<='0'; nq_s<='1';
elsif j='0' and k='1' then q_s<='0'; nq_s<='1';
elsif j='1' and k='0' then q_s<='1'; nq_s<='0';
elsif j='1' and k='1' then q_s<=not q_s;
nq_s<=not nq_s; end if; else null; end if; q<=q_s; nq<=nq_s; end process; end a;
(4)集成计数器74161 Library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt4 is port(
clk,LDN,CLRN : in std_logic; d,c,b,a : in std_logic; carry : out std_logic; qd,qc,qb,qa : out std_logic ); end;
architecture a of cnt4 is
signal data_in: std_logic_vector(3 downto 0); begin
data_in<=d&c&b&a;
process(data_in,clk,ldn,clrn)
variable cnt:std_logic_vector(3 downto 0); begin
if clrn='0' then cnt:=(others=>'0');
elsif clk'event and clk='1' then if ldn='0' then cnt:=data_in; else cnt:=cnt+1; end if; end if; case cnt is
when \ when others=> carry<='0'; end case; qa<=cnt(0); qb<=cnt(1); qc<=cnt(2); qd<=cnt(3);
end process; end a; 程序2 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY S_C74161 IS
PORT(clk, ldn,clrn,enp,ent: IN STD_LOGIC;
din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ELSIF(clk'EVENT AND clk='1')THEN IF(ss=\
q1<=din;
ELSIF(ss=\
q1<=srsi&q1(3 downto 1); ELSIF(ss=\
q1<=q1(2 downto 0)&slsi; END IF; END IF;
q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ;
rco: OUT STD_LOGIC ); END S_C74161 ;
ARCHITECTURE behav OF S_C74161 IS
SIGNAL q1: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(clk, clrn) BEGIN
IF clrn = ‘0' THEN
q1 <= \
ELSIF (clk'EVENT AND clk = '1') THEN IF ldn=‘0' THEN q1<=din ;
ELSIF (enp=‘1’ and ent =‘1’ ) THEN q1<= q1+1; END IF; END IF;
q<= q1;
END PROCESS;
rco <= q1(3) and q1(2) and q1(1) and q1(0) and ent; END behav;
(5)集成移位寄存器74194 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY S_R74194 IS
PORT(clrn, clk, slsi, srsi: IN STD_LOGIC; din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ss:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END S_R74194 ;
ARCHITECTURE bhv OF S_R74194 IS SIGNAL q1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(clk,clrn)
BEGIN IF(clrn='0')THEN q1<=\
q<=q1;
END PROCESS;
END bhv;
5-14用VHDL描述一个三态输出的双4选一的数据选择器,其地址信号共用,且各有一个低电平有效的使能端。 答:程序1,使用两个并行关系的选择信号赋值语句 library ieee;
use ieee.std_logic_1164.all; entity dual_mux_41 is port(a,b,c,d : in std_logic; ena_n,enb_n : in std_logic;
s : in std_logic_vector(1 downto 0); outa,outb : out std_logic); end;
architecture a of dual_mux_41 is
signal p,q : std_logic_vector(2 downto 0); begin
p<=ena_n & s; q<=enb_n & s; with p select outa<=a when \ b when \ c when \ d when \ 'Z' when others; with q select outb<=a when \ b when \ c when \ d when \ 'Z' when others; end a;
答:另一个程序2,使用两个进程实现 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY muxk IS
PORT(a,b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0); en1,en2: IN STD_LOGIC;
q1,q2:OUT STD_LOGIC);
END muxk;
Architecture bhv of muxk is begin
process (en1 ,sel , a ) begin
if(en1='0') then case sel is
when\ when \ when \
when \ when others=>null;
end case; else q1<='Z'; END IF; End process; process (en2,sel , b ) begin
if(en2='0') then case sel is
when \ when \ when \
when \ when others=>null;
end case; else q2<='Z'; END IF; End process; End bhv;
5-15.试用并行信号赋值语句分别描述下列器件的功能:(1) 3-8译码器 答:功能描述如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder38 IS
PORT(a,b,c,g1,g1a,a2b:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END decoder38;
ARCHITECTURE behave38 OF decoder38 IS SIGNAL inda: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
inda<=c&b&a; PROCESS(indata,g1,g2a,g2b) BEGIN
IF(g1='1' AND g2a='0' AND g2b='0') THEN CASE inda IS
WHEN \ WHEN \ WHEN \ WHEN \WHEN \
WHEN \ WHEN \ WHEN \ WHEN OTHERS =>q<=\ END CASE; ELSE
q<=\ END IF; END PROCESS; END behave38; (2) 8选1数据选择器 答:功能描述如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux8 IS
PORT(d0,d1,d2,d3,d4,d5,d6,d7:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
s0,s1,s2:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END mux8;
ARCHITECTURE behave OF mux8 IS
SIGNAL s: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
s <=s2&s1&s0; WITH s SECLECT d <=d0 WHEN \ d1 WHEN \ d2 WHEN \ d3 WHEN \ d4 WHEN \ d5 WHEN \ d6 WHEN \ d7 WHEN \ ‘X’WHEN OTHERS; END behave;
5-16利用生成语句描述一个由n个一位全减器构成的n位减法器,n的默认值为4。
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity f_sub4_2 is
GENERIC (n : INTEGER := 4); port(
a,b : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0); cin : IN std_logic;
diff: out STD_LOGIC_VECTOR(n-1 DOWNTO 0); Cout: OUT std_logic ); end;
architecture a of f_sub4_2 is component f_sub1 is port(
a,b,cin : IN std_logic; diff,Cout : OUT std_logic ); end component;
signal c :STD_LOGIC_VECTOR(n DOWNTO 0); begin c(0)<=cin;
n1: for i in 0 to n-1 generate
U1: f_sub1 port map(a(i),b(i),c(i),diff(i),c(i+1)); end generate; cout<=c(n); end a;
5-17用VHDL语言设计实现输出占空比为50%的1000分频器。
library ieee;
use ieee.std_logic_1164.all; entity div_1000 is port(
clk ,clr: in std_logic; div : out std_logic ); end;
architecture a of div_1000 is signal q : std_logic; begin div<=q;
process(clk,clr)
variable cnt : integer range 0 to 499; begin
if clr='1' then cnt:=0; q<='0';
elsif rising_edge(clk) then if cnt=499 then cnt:=0; q<=not q; else
cnt:=cnt+1; end if; end if; end process;