《EDA技术实用教程(第五版)》习题答案(第1~10章)--潘 联系客服

发布时间 : 星期四 文章《EDA技术实用教程(第五版)》习题答案(第1~10章)--潘更新完毕开始阅读e5cbb5b5910ef12d2af9e790

IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \

IF a

cc:=\

IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \ END IF;

diff<=cc;

END PROCESS; END behave;

3-13 设计一个4位乘法器,为此首先设计一个加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此项设计为基础,使用GENERIC参数传递的功能,设计一个16位乘法器。

--3-13 4位移位相加型乘法器设计(例化调用加法器) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MULT4B IS

GENERIC( S: INTEGER:=4); --定义参数S为整数类型,且等于4 PORT( R: OUT STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0)); END ENTITY MULT4B;

ARCHITECTURE ONE OF MULT4B IS COMPONENT addern IS

PORT(a,b: IN STD_LOGIC_VECTOR; result: out STD_LOGIC_VECTOR); END COMPONENT;

SIGNAL A0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0);

SIGNAL RR3,RR2,RR1,RR0,ZZ1,ZZ0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); BEGIN

A0<=CONV_STD_LOGIC_VECTOR(0,S) & A; PROCESS(A,B) BEGIN

IF(B(0)='1')THEN RR0<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 0);ELSE RR0<=(OTHERS=>'0');END IF; IF(B(1)='1')THEN RR1<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 1);ELSE RR1<=(OTHERS=>'0');END IF; IF(B(2)='1')THEN RR2<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 2);ELSE RR2<=(OTHERS=>'0');END IF; IF(B(3)='1')THEN RR3<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 3);ELSE RR3<=(OTHERS=>'0');END IF;

END PROCESS;

u0: addern PORT MAP(a=>RR0,b=>RR1,result=>ZZ0);

u1: addern PORT MAP(a=>ZZ0,b=>RR2,result=>ZZ1); u2: addern PORT MAP(a=>ZZ1,b=>RR3,result=>R); END ARCHITECTURE ONE;

--3-13a 16位乘法器(通过底层3-13_MULTSB和顶层GENERIC参数和传递例化语句实现)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY MULT16B IS

PORT(D1,D2: IN STD_LOGIC_VECTOR(15 DOWNTO 0); Q: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END;

ARCHITECTURE BHV OF MULT16B IS

COMPONENT MULTSB --MULTS8模块的调用声明

GENERIC(S: integer); --照抄MULTSB实体中关于参数“端口”定义的语句 PORT(R: OUT std_logic_vector(2*S-1 DOWNTO 0); A,B: IN std_logic_vector(S-1 DOWNTO 0)); END COMPONENT ; BEGIN

u1: MULTSB GENERIC MAP(S=>16) PORT MAP(R=>Q,A=>D1,B=>D2); END;

3-14 用循环语句设计一个7人投票表决器。

--解:3-14 用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY vote_7 IS

PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);--7位表决输入(1:同意,0:不同意)

G_4: OUT STD_LOGIC; --超过半数指示

CNTH: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--表决结果统计数 END vote_7;

ARCHITECTURE BHV OF vote_7 IS BEGIN

PROCESS(DIN)

VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN

Q:=\

FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q;

IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF; END PROCESS; END BHV;

3-15 设计一个4位4输入最大数值检测电路。

--3-15 设计一个4位4输入最大数值检测电路。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MAXDATA IS

PORT(A: IN STD_LOGIC_VECTOR(3 DOWNTO 0); MAXOUT: OUT STD_LOGIC); END ENTITY MAXDATA;

ARCHITECTURE ONE OF MAXDATA IS BEGIN

PROCESS(A) BEGIN

IF A=\ END PROCESS;

END ARCHITECTURE ONE;

3-16 设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量AA和BB中。

--3-16 设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量A和B中。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY ADDER8B IS

GENERIC(S: INTEGER:=8); --定义参数S为整数类型,且等于4 PORT(A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0); CIN: IN STD_LOGIC;

SUM: OUT STD_LOGIC_VECTOR(S-1 DOWNTO 0); COUT: OUT STD_LOGIC;

AA,BB: OUT STD_LOGIC_VECTOR(S-1+4 DOWNTO 0)); END ENTITY ADDER8B;

ARCHITECTURE ONE OF ADDER8B IS BEGIN

PROCESS(A,B,CIN)

VARIABLE S1: STD_LOGIC_VECTOR(S-1 DOWNTO 0); VARIABLE C1: STD_LOGIC;

VARIABLE AB: STD_LOGIC_VECTOR(S-1+4 DOWNTO 0); BEGIN C1:=CIN;

FOR i IN 1 TO S LOOP

IF A(i-1)='1' XOR B(i-1)='1' XOR C1='1' THEN S1(i-1):='1'; ELSE S1(i-1):='0'; END IF;

IF (A(i-1)='1' AND B(i-1)='1')OR(A(i-1)='1' AND C1='1')OR(B(i-1)='1' AND

C1='1')OR(A(i-1)='1' AND B(i-1)='1' AND C1='1') THEN C1:='1'; ELSE C1:='0'; END IF; END LOOP;

SUM<=S1;COUT<=C1;

AA<=TO_STDLOGICVECTOR(TO_BITVECTOR(\ BB<=TO_STDLOGICVECTOR(TO_BITVECTOR(\ END PROCESS;

END ARCHITECTURE ONE; 3-17 举例说明GENERIC说明语句(在实体定义语句中定义类属常数)和GENERIC映射语句(在例化语句中将类属常数赋予新值)有何用处。P82

3-18 表达式C<=A+B中,A、B和C的数据类型都是STD_LOGIC_VECTOR,是否能直接进行加法运算?说明原因和解决方法。能(第一种将A、B转换成整型数相加结果再转换成逻辑位矢后送C P89;第二种使用USE IEEE.SDT_LOGIC_UNSIGNED.ALL语句打开重载运算符程序包。 P70,P130)

3-19 VHDL中有哪三种数据对象?详细说明它们的功能特点以及使用方法,举例说明数据对象与数据类型的关系。信号,变量,常量 P71

3-20 能把任意一种进制的值向一整数类型的数据对象赋值吗?如果能,怎样做? 能(若A,B,C,D是信号整数类型,A<=16#df#;B<=8#23#;C<=2#01#;D<=10)P83 3-21 回答有关BIT和BOOLEAN数据类型的问题:P59

(1)解释BIT(‘0’;‘1’)和BOOLEAN(“TRUE”,“FALSE”)类型的区别。 (2)对于逻辑操作应使用哪种类型?BIT (3)关系操作的结果为哪种类型? BOOLEAN

(4)IF语句测试的表达式是哪种类型? BOOLEAN

3-22 用两种方法设计8位比较器,比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是D、E、F。当A=B时D=1;当A>B时E=1;当A

--3-22 比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当A

--第一种设计方案是常规的比较器设计方法,即直接利用关系操作符进行编程设计。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMP IS

PORT( A,B: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --两个3位输入 LT: OUT STD_LOGIC; --小于输出 GT: OUT STD_LOGIC; --大于输出 EQ: OUT STD_LOGIC); --等于输出 END ENTITY COMP;

ARCHITECTURE ONE OF COMP IS BEGIN