ENTITY g_5_cmp IS
PORT( d_in : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入数据
cmp_out : OUT STD_LOGIC); --比较输出(1:输入数据>5) END g_5_cmp;
ARCHITECTURE BHV OF g_5_cmp IS BEGIN
PROCESS(d_in) BEGIN
IF(d_in>\
cmp_out<='1'; --输入数据大于5,比较输出1。 else
cmp_out<='0'; --输入数据小于等于5,比较输出0。 END IF;
END PROCESS; END BHV;
3-7 利用if语句设计一个全加器。 --3-7 利用if语句设计一个全加器
LIBRARY IEEE; --1位二进制全加器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY f_adder IS
PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END ENTITY f_adder;
ARCHITECTURE fd1 OF f_adder IS BEGIN
PROCESS (ain,bin,cin) BEGIN
IF ain='1' XOR bin='1' XOR cin='1' THEN sum<='1'; ELSE sum<='0'; END IF;
IF (ain='1' AND bin='1')OR(ain='1' AND cin='1')OR(bin='1' AND cin='1')OR(ain='1' AND bin='1' AND cin='1')
THEN cout<='1'; ELSE cout<='0'; END IF;
END PROCESS;
END ARCHITECTURE fd1;
3-8 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 --解:3-8 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY org_patch IS
PORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--原码输入 patch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--补码输出
END org_patch;
ARCHITECTURE BHV OF org_patch IS BEGIN
PROCESS(org_data) BEGIN
IF(org_data(7)='0') THEN
patch_data<=org_data; --org_data>=0,补码=原码。 else
patch_data<=org_data(7)&(not org_data(6 DOWNTO 0))+1;--org_data<0,补码=|原码|取反+1。 END IF;
END PROCESS; END BHV;
3-9 设计一个格雷码至二进制数的转换器。 --3-9 设计一个格雷码至二进制数的转换器。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --为使用类型转换函数,打开此程序包。 ENTITY grayTObinary IS
port( DIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT: OUT BIT_VECTOR(3 DOWNTO 0)); END grayTObinary;
ARCHITECTURE behave OF grayTObinary IS BEGIN
PROCESS (DIN) BEGIN
CASE DIN IS
WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN OTHERS => NULL;
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;