计组课程实验MaxPlusII设计直接补码阵列乘法器

开源仓库

zzySerendipity/MaxPlusII_Experiments: 计算机组成(原理)与体系结构课程实验:使用MaxPlusII软件进行设计,完成3x3位直接补码阵列乘法器,并拓展完成4x4位直接补码阵列乘法器(源码与设计教程)。https://github.com/zzySerendipity/MaxPlusII_Experiments/tree/main如果对你有帮助,那真是太棒了。

如果仓库的代码对你有帮助记得Star!

 MaxPlusII设计 3x3阵列乘法器

全加器

已知:

根据表2-1,可以推导出这四类全加器S和C的逻辑表达式。

Si = Xi ⊕ Yi ⊕ Zi-1

Ci = XiYi + Zi-1(Xi + Yi)

  • 对0类、3类全加器而言有:

  • 对1类、2类全加器,则有:

0类和3类全加器中S和C的逻辑表达式相同,它和常规的全加器是一致的。1类和2类全加器中S 和C的逻辑表达式也是相同的。

 阵列乘法器逻辑原理

注意理解输入的符号位 和 输出的 补充符号位。

 

全加器图元设计

对0类、3类全加器而言,完成FA0图元设计:

采取VHDL语言设计图元形式:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
-- ENTITY FA0 
ENTITY FA0 IS 

PORT( 
X,Y,Z:IN STD_LOGIC; 
S,C:OUT STD_LOGIC 
); 
END FA0; 
    
ARCHITECTURE A OF FA0 IS 
BEGIN 
	S<=(NOT X AND NOT Y AND Z)OR(NOT X AND Y AND NOT Z)OR(X AND NOT Y AND NOT Z)OR(X AND Y AND Z);
	C<=(X AND Y)OR(Y AND Z)OR(X AND Z); 
END A; 

对1类、2类全加器而言,完成FA1图元设计:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY FA1 IS 
PORT( 
X,Y,Z:IN STD_LOGIC; 
S,C:OUT STD_LOGIC 
); 
END FA1; 
    
ARCHITECTURE A OF FA1 IS 
BEGIN 
	S<=(NOT X AND NOT Y AND Z)OR(NOT X AND Y AND NOT Z)OR(X AND NOT Y AND NOT Z)OR(X AND Y AND Z);
	C<=(X AND Y)OR(X AND NOT Z)OR(Y AND NOT Z); 
END A; 

3x3 阵列乘法器图元设计

top顶层需要使用总线的形式输入与输出,因此在顶层文件中,我们所涉及的3x3 阵列乘法器 需要作为一个“元件”加入到top层中。

Multiple-array:

输入总线与阵列图元设计

ANDARRAY:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY ANDARRAY IS
PORT(
   A, B : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
   A0B0, A1B0, A0B1, A0B2, A2B0, A1B1, A1B2, A2B1, A2B2 : OUT STD_LOGIC
);
END ANDARRAY;

ARCHITECTURE A OF ANDARRAY IS
BEGIN
	A0B0 <= A(0) AND B(0);
    A1B0 <= A(1) AND B(0);
	A0B1 <= A(0) AND B(1);
	A0B2 <= A(0) AND B(2); 
	A2B0 <= A(2) AND B(0);
	A1B1 <= A(1) AND B(1);
	A1B2 <= A(1) AND B(2);
  	A2B1 <= A(2) AND B(1);
	A2B2 <= A(2) AND B(2);
END A;

输出总线图元设计

CONVERT:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY CONVERT IS
PORT(
	I0, I1, I2, I3, I4, I5 : IN STD_LOGIC;
	P : OUT STD_LOGIC_VECTOR(5 DOWNTO 0)
);
END CONVERT;

ARCHITECTURE A OF CONVERT IS
BEGIN
	-- P <= (I5, I4, I3, I2, I1, I0);
	P(0) <= I0;
	P(1) <= I1;
	P(2) <= I2;
	P(3) <= I3;
	P(4) <= I4;
	P(5) <= I5;
END A;

顶层gdf文件设计

WaveForm仿真运行

 与顶层top.gdf同名!!:top.scf

 运行结果:

 结果分析:

由于输入端为3位,因此在直接补码阵列乘法器中,只能完成 - 4 ~ + 3 之间的乘法运算。  

MaxPlusII设计 4x4阵列乘法器

设计4x4 输入的阵列乘法器,可以完成 - 8 ~ + 7 之间的乘法运算。结果输出总线也会相应增加。

全加器设计

多位乘法在直接阵列乘法器中,采用的加法器相同。

共需12个全加器,其中3个O类,3个一类,6个二类全加器。

全加器设计与3x3阵列乘法器完全相同。

4x4 阵列乘法器图元设计

通过理解指导书中的3x3 阵列乘法器设计思路完成:

设计原理图

红色括号是带符号位,由上两行确定中间的四行。根据符号位可以确定输入端的权值。

 

逻辑原理图

由各个全加器的输入端的正负权值分类确定C 与 S两个输出位的正负权。从而确定该全加器是0、1、2类全加器(本例用不到3类全加器)。

图元内部结构图

 

Graphic Edit

 由上分析可知,FA1包含1类和2类全加器。一类全加器在Z输入端口为负权,而二类全加器在Z输入端口为正权。

注意:FA0 FA1的三输入端 X Y Z 不能随意指定引脚,需要考虑该类全加器在 Z 端口输入值得正负权,依照上图逻辑原理图绘制

1类与2类全加器FA1,在XYZ三个输入端有区别:一类全加器在Z输入端口为负权,而二类全加器在Z输入端口为正权。

因此设计电路图时,要根据逻辑原理图确保输入端口正确接线

 4x4 阵列乘法器图元设计实例图:

此图不可以画错!每个全加器的三个输入端XYZ并不都是完全一样的,也就是说对于全加器的输入选择,不是任意的!

原因见上,写在这里不过是为了在提醒以下,因为笔者在测试时发生了错误,经过来回推敲确定是这里的问题。

输入总线与阵列图元设计

剩下的就是老规矩了,和3x3阵列乘法器相似:编写VHDL语言,保存后生成图元文件。但要注意PORT部分会存在细微差别。

 ANDARRAY:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY ANDARRAY IS
PORT(
   A, B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
   A0B0, A1B0, A0B1, A0B2, A2B0, A1B1, A1B2, A3B0, A2B1, A0B3, A1B3, A3B1, A2B2, A3B2, A2B3, A3B3 : OUT STD_LOGIC
);
END ANDARRAY;

ARCHITECTURE A OF ANDARRAY IS
BEGIN
	A0B0 <= A(0) AND B(0);
    A1B0 <= A(1) AND B(0);
	A0B1 <= A(0) AND B(1);
	A0B2 <= A(0) AND B(2); 
	A2B0 <= A(2) AND B(0);
	A1B1 <= A(1) AND B(1);
	A1B2 <= A(1) AND B(2);
  	A2B1 <= A(2) AND B(1);
	A2B2 <= A(2) AND B(2);
	A3B0 <= A(3) AND B(0);
	A0B3 <= A(0) AND B(3);
	A1B3 <= A(1) AND B(3);
	A3B1 <= A(3) AND B(1);
	A3B2 <= A(3) AND B(2);
	A2B3 <= A(2) AND B(3);
	A3B3 <= A(3) AND B(3);
END A;

输出总线图元设计

CONVERT:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY CONVERT IS
PORT(
	I0, I1, I2, I3, I4, I5, I6, I7 : IN STD_LOGIC;
	P : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END CONVERT;

ARCHITECTURE A OF CONVERT IS
BEGIN
	-- P <= (I7, I6, I5, I4, I3, I2, I1, I0);
	P(0) <= I0;
	P(1) <= I1;
	P(2) <= I2;
	P(3) <= I3;
	P(4) <= I4;
	P(5) <= I5;
	P(6) <= I6;
	P(7) <= I7;
END A;

顶层gdf文件设计

保证对齐!这里我的ANDARRAY与阵列图元的输出引脚顺序错了,图没有更新。如果使用上述代码生成图元需要注意和Multiple-Array图元输入端相应引脚相连。

正常且美观的情况下,不会出现下面的那两个“结”。

WaveForm仿真运行

运行结果:

 结果分析:

输入范围: - 8 ~ + 7

输入样例:

Final

嘿嘿,总觉得要有头有尾。

开源Github仓库(首尾交相呼应):zzySerendipity/MaxPlusII_Experiments: 计算机组成(原理)与体系结构课程实验:使用MaxPlusII软件进行设计,完成3x3位直接补码阵列乘法器,并拓展完成4x4位直接补码阵列乘法器(源码与设计教程)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值