实验内容

  1. 移位相加型8位硬件乘法器设计。
  2. 高速硬件除法器设计。

1. 移位相加型8位硬件乘法器设计

实验原理:利用一个数的二进制码对另一个数的二进制码进行移位操作实现相乘。

实验模块代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY MULT8B IS
GENERIC (S: INTEGER :=8);
PORT ( RESULT :OUT STD_LOGIC_VECTOR(2*S DOWNTO 1);
A,B : IN STD_LOGIC_VECTOR(S DOWNTO 1)
);
END ENTITY;
ARCHITECTURE BEHAV OF MULT8B IS
SIGNAL A0 : STD_LOGIC_VECTOR(2*S DOWNTO 1);
BEGIN
A0 <= CONV_STD_LOGIC_VECTOR(0,S) & A;
PROCESS(A,B)
VARIABLE RESULT1: STD_LOGIC_VECTOR(2*S DOWNTO 1);
BEGIN
RESULT1 :=(OTHERS =>'0');
FOR I IN 1 TO S LOOP
IF(B(I) = '1') THEN
RESULT1 := RESULT1 +TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL(I-1));
END IF ;
END LOOP;
RESULT<= RESULT1;
END PROCESS;
END ARCHITECTURE;

TestBench:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
LIBRARY ieee;                                               
USE ieee.std_logic_1164.all;                                
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY MULT8B_vhd_tst IS
END MULT8B_vhd_tst;
ARCHITECTURE MULT8B_arch OF MULT8B_vhd_tst IS
                                   
SIGNAL A : STD_LOGIC_VECTOR(8 DOWNTO 1) :=CONV_STD_LOGIC_VECTOR(6,8);
SIGNAL B : STD_LOGIC_VECTOR(8 DOWNTO 1) :=CONV_STD_LOGIC_VECTOR(15,8);
SIGNAL RESULT : STD_LOGIC_VECTOR(16 DOWNTO 1);
COMPONENT MULT8B
PORT (
A : IN STD_LOGIC_VECTOR(8 DOWNTO 1);
B : IN STD_LOGIC_VECTOR(8 DOWNTO 1);
RESULT : OUT STD_LOGIC_VECTOR(16 DOWNTO 1)
);
END COMPONENT;
BEGIN
u1 : MULT8B
PORT MAP (
A => A,
B => B,
RESULT => RESULT
);

A <= CONV_STD_LOGIC_VECTOR(6,8), CONV_STD_LOGIC_VECTOR(50,8) AFTER 100 NS, CONV_STD_LOGIC_VECTOR(128,8) AFTER 200 NS;
B <= CONV_STD_LOGIC_VECTOR(15,8), CONV_STD_LOGIC_VECTOR(50,8) AFTER 150 NS, CONV_STD_LOGIC_VECTOR(64,8) AFTER 200 NS;

END MULT8B_arch;

仿真波形:

img

实验结果:根据仿真输出波形数据判断,实验模块的相乘功能没有错误,但是仿真输出波形有延迟,初步怀疑是process的原因,因为只有当输入变化时,输出才会变化,但是输出的是上一个相乘的结果,更像是运行完process后,有一个锁存器把相乘结果锁住了。

2. 高速硬件除法器设计

实验模块代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
LIBRARY ieee;                                               
USE ieee.std_logic_1164.all;                                
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY DIV16B IS
PORT(A,B:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
QU,RE: OUT STD_LOGIC_VECTOR(15 DOWNTO 0) --QU是商,RE是余数
);
END DIV16B;
ARCHITECTURE BEHAV OF DIV16B IS
BEGIN
PROCESS(A,B)
VARIABLE AT,BT,P,Q:STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
P:=CONV_STD_LOGIC_VECTOR(0,16);
Q:=CONV_STD_LOGIC_VECTOR(0,16);
AT:=A;
BT:=B;
FOR I IN QU'RANGE LOOP
P :=P(14 DOWNTO 0) & AT(15);
AT :=AT(14 DOWNTO 0) & '0';
P :=P-BT;
IF P(15)='1' THEN Q(I):='0';
P:=P+BT;
ELSE Q(I) :='1';
END IF;
END LOOP;
QU<=Q; RE<=P;
END PROCESS;
END BEHAV;

TestBench:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
LIBRARY ieee;                                               
USE ieee.std_logic_1164.all;                                
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY DIV16B_vhd_tst IS
END DIV16B_vhd_tst;
ARCHITECTURE DIV16B_arch OF DIV16B_vhd_tst IS
-- constants                                                
-- signals                                                  
SIGNAL A : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL B : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL QU : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL RE : STD_LOGIC_VECTOR(15 DOWNTO 0);
COMPONENT DIV16B
PORT (
A : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
QU : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
RE : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END COMPONENT;
BEGIN
i1 : DIV16B
PORT MAP (

A => A,
B => B,
QU => QU,
RE => RE
);
A<= CONV_STD_LOGIC_VECTOR(44,16), CONV_STD_LOGIC_VECTOR(55,16) AFTER 150 NS, CONV_STD_LOGIC_VECTOR(10086,16) AFTER 300 NS;
B<= CONV_STD_LOGIC_VECTOR(4,16), CONV_STD_LOGIC_VECTOR(11,16) AFTER 100 NS, CONV_STD_LOGIC_VECTOR(4,16) AFTER 200 NS;                              
END DIV16B_arch;

仿真波形:

img

实验结果分析:A为被除数,B为除数,QU为商,RE是余数的情况下,仿真波形结果完全正确。