内容发布更新时间 : 2024/11/3 0:34:19星期一 下面是文章的全部内容请认真阅读。
END CASE; END PROCESS; END behave;
3-10 利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。对于比较(AB)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。
--3-10 利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。
--对于比较(AB)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMP IS
PORT( A,B: IN STD_LOGIC_VECTOR(2 DOWNTO 0); --两个3位输入 LT: OUT STD_LOGIC; --小于输出 GT: OUT STD_LOGIC; --大于输出 EQ: OUT STD_LOGIC); --等于输出 END ENTITY COMP;
ARCHITECTURE ONE OF COMP IS BEGIN
PROCESS(A,B) BEGIN
IF (AB) THEN GT<='1';ELSE GT<='0';END IF; IF (A=B) THEN EQ<='1';ELSE EQ<='0';END IF; END PROCESS;
-- LT <= (AB); --大于 -- EQ <= (A=B); --等于 END ARCHITECTURE ONE;
3-11 利用8个全加器,可以构成一个8位加法器。利用循环语句来实现这项设计。并以此项设计为例,使用GENERIC参数传递的功能,设计一个32位加法器。 --3-11 利用GENERIC参数和循环语句将8个全加器构成成8位加法器 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); 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;--_VECTOR(S DOWNTO 0); BEGIN C1:=CIN; --C1(0):=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; END PROCESS;
END ARCHITECTURE ONE;
3-12 设计一个2位BCD码减法器。注意可以利用BCD码加法器来实现。因为减去一个二进制数,等于加上这个数的补码。只是需要注意,作为十进制的BCD码的补码获取方式与普通二进制数稍有不同。我们知道二进制数的补码是这个数的取反加1。假设有一个4位二进制数是0011,其取补实际上是用1111减去0011,再加上l。相类似,以4位二进制表达的BCD码的取补则是用9(1001)减去这个数再加上1。
--3-12 设计2位BCD码减法器(利用减去数等于加上该数补码方法) (a-b=a+[-b]补码) LIBRARY IEEE; --待例化元件 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_arith.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY SUB2BCD IS
PORT(a,b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); diff: out STD_LOGIC_VECTOR(7 DOWNTO 0); sout: OUT STD_LOGIC); END SUB2BCD;
ARCHITECTURE behave OF SUB2BCD IS BEGIN
PROCESS(a,b)
VARIABLE cc: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN
IF a
IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \
cc:=a+cc;
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