船山学院
实验报告
( 2009 ~2010 学年度 第二学期 )
| 课程名称 | EDA |
| 实验名称 | 8位乘法器 |
| 专业 | 计算机科学与技术 | 班级 | 01 |
| 地点 | 8-212 | 教师 |
学习和了解八位乘法的原理和过程
二、设计思路:
纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器,基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。这里介绍由八位加法器构成的以时序逻辑方式设计的八位乘法器,具有一定的实用价值,而且由FPGA构成实验系统后,可以很容易的用ASIC大型集成芯片来完成,性价比高,可操作性强。其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
三、实验逻辑图:
四、实验代码:
1) 选通与门模块的源程序ANDARITH.VHD
LIBRARY IEEE;USE IEEE.STD_LOGIC_11.ALL;
ENTITY ANDARITH IS
PORT (ABIN:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR (7 DOWNTO 0)
DOUT:OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ANDARITH;ARCHITECTURE ART OF ANDARITH IS
BEGIN
PROCESS (ABIN,DIN)
BEGIN
FOR I IN 0 TO 7 LOOP
DOUT (I)<=DIN (I)AND ABIN;
END LOOP;
END PROCESS;
END ART;
2) 16位锁存器的源程序REG16B.VHDLIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;ENTITY REG16B IS
PORT (CLK:IN STD_LOGIC;
CLR:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR (8 DOWNTO 0)
Q:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END REG16B;
ARCHITECTURE ART OF REG16B IS
SIGNAL R16S:STD_LOGIC_VECTOR(15 DOWNTO 0);BEGIN
PROCESS (CLK,CLR)
BEGIN
IF CLR = '1' THEN R16S<= "0000000000000000";
ELSIF CLK'EVENT AND CLK = '1'
THEN
R16S(6 DOWNTO 0)<=R16S(7 DOWNTO 1);
R16S(15 DOWNTO 7)<=D;
END IF;
END PROCESS;
Q<=R16S;
END ART;
3) 8位右移寄存器的源程序SREG8B.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
ENTITY SREG8B IS
PORT (CLK:IN STD_LOGIC; LOAD :IN STD _LOGIC;
BIN:IN STD_LOGIC_VECTOR(7DOWNTO 0);
QB:OUT STD_LOGIC );END SREG8B;
ARCHITECTURE ART OF SREG8B IS
SIGNAL REG8B:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS (CLK,LOAD)
BEGIN
IF CLK'EVENT AND CLK= '1' THEN
IF LOAD = '1' THEN REG8<=DIN;
ELSE REG8(6 DOWNTO0)<=REG8(7 DOWNTO 1);
END IF;
END IF;
END PROCESS;
QB<= REG8 (0);
END ART;
4) 乘法运算控制器的源程序ARICTL.VHD LIBRARY
IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ARICTL
IS
PORT ( CLK:IN STD_LOGIC; START:IN
STD_LOGIC;
CLKOUT:OUT STD_LOGIC; RSTALL:OUT
STD_LOGIC;
ARIEND:OUT STD_LOGIC );
END ARICTL;ARCHITECTURE ART OF ARICTL IS SIGNAL
CNT4B:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
RSTALL<=START;
PROCESS (CLK,START)
BEGIN
IF START = '1' THEN CNT4B<= "0000";
ELSIF CLK'EVENT AND CLK = '1' THEN
IF CNT4B<8 THEN
CNT4B=CNT4B+1;
END IF;
END IF;
END PROCESS;
PROCESS (CLK,CNT4B,START)
BEGIN
IF START = '0' THEN
IF CNT4B<8 THEN
CLKOUT <=CLK; ARIEND<= '0';
ELSE CLKOUT <= '0'; ARIEND<= '1';
END IF;
ELSE CLKOUT <=CLK; ARIEND<= '0';
END IF;
END PROCESS;
END ART;
5) 8位乘法器的源程序MULTI8X8.VHDLIBRARY
IEEE;USE IEEE.STD_LOGIC_11.ALL;
ENTITY MULTI8X8 IS
PORT(CLK:IN STD_LOGIC;
START:IN STD_LOGIC;
A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ARIEND:OUT STD_LOGIC;
DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END MULTI8X8;
ARCHITECTURE ART OF MULTI8X8 IS
COMPONENT ARICTL
PORT(CLK:IN STD_LOGIC;START:IN STD_LOGIC;
CLKOUT:OUT STD_LOGIC;RSTALL:OUT STD_LOGIC;
ARIEND:OUT STD_LOGIC);
END COMPONENT;COMPONENT ANDARITH
PORT(ABIN:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT:OUT_STD_LOGIC_VECTOR( 7 DOWNTO 0) );
END COMPONENT;
COMPONENT ADDER8B
...
COMPONENT SREG8B
...
COMPONENT REG16B
...
SIGNAL GNDINT:STD_LOGIC;
SIGNAL
INTCLK:STD_LOGIC;
SIGNAL RSTALL:STD_LOGIC;
SIGNAL QB:STD_LOGIC;
SIGNAL ANDSD:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL DTBIN:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL DTBOUT:STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
DOUT<=DTBOUT;GNDINT<= '0';
U1:ARICTL PORT MAP(CLK=>CLK, START=>START,
CLKOUT=>INTCLK, RSTALL=>RSTALL,
ARIEND=>ARIEND); U2:SREG8B PORT MAP
(CLK=>INTCLK, LOAD=>RSTALL.
DIN=>B,
QB=>QB);
U3:ANDARITH PORT MAP(ABIN=>QB,DIN=>A,
DOUT=>ANDSD);
U4:ADDER8B PORT
MAP(CIN=>GNDINT,A=>DTBOUT(15 DOWNTO 8),
B=>ANDSD, S=>DTBIN(7 DOWNTO 0),COUT
=>DTBIN(8));U5:REG16B PORT MAP(CLK =>INTCLK,
CLR=>RSTALL,
D=>DTBIN,
Q=>DTBOUT);
END ART;
五、实验结果:
六、实验心得:
通过本实验基本上了解了八位乘法的工作原理:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。下载本文