VHDL学习--简易ALU设计

ALU,即算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。
ALU的实现较为简单,根据真值表利用case语句分情况设计即可。本人所写ALU较为简单,具有以下功能:
在这里插入图片描述
模块的端口主要有3位的功能选择端,两个8位的A,B数据输入端口,1位的C进位/借位端口,以及8位的数据输出端口。C仅在进行加法和减法时有效。当有进位或借位时输出1,无则为0。其中乘法功能为AB输入低四位相乘。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ALU is
port(
     S:in std_logic_vector(2 downto 0);
	  A:in std_logic_vector(7 downto 0);
	  B:in std_logic_vector(7 downto 0);
	  C:out std_logic;
	  D:out std_logic_vector(7 downto 0)
	  );
end ALU;

architecture behave of ALU is

signal temp: std_logic_vector(8 downto 0);
signal aa:std_logic_vector(8 downto 0);
signal bb:std_logic_vector(8 downto 0);

begin

process(A,B,aa,bb,temp) 
begin
case S is
when "000"=>
	D<=A and B;
when "001"=>
	  D<=A;
when "010"=>	 
	aa<='0'& A(7 downto 0);
	bb<='0'& B(7 downto 0);
   temp<=aa+bb;
	C<=temp(8);
	D<=temp(7 downto 0);
when "011"=>	
	aa<='0'& A(7 downto 0);
	bb<='0'& B(7 downto 0);
   temp<=aa-bb;
	if(aa>=bb) then
	C<='0';
	else
	C<='1';
	end if;
	D<=temp(7 downto 0);
when "100"=>
   D<=A(3 downto 0)*B(3 downto 0);
when others => null;
  end case;
  end process ;
 end behave;

	  
	  
	  
	  

接下来是仿真波形图:
与功能
在这里插入图片描述

直通功能
在这里插入图片描述

加法功能
在这里插入图片描述

减法功能
在这里插入图片描述
乘法功能(低位乘法)
在这里插入图片描述
通过观察波形图,判断功能基本正确。这其中减法器最费功夫,C借位信号常常为高阻态,不能正常显示借位信息。隐隐觉得写的有些问题。如有大佬们发现了代码中的错误,还请大家指出。

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 算术逻辑单元 1. 实验目的 (1) 掌握运算器的工作原理。 (2) 验证运算器的功能 2. 实验要求 (1)基本要求 设计一个4位的算术逻辑单元,满足以下要求。 ①4位算术逻辑单元能够进行下列运算:法、法、1、1、与、或、非和传递。用3位操作码进行运算,控制方式如下表所示。 运算操作码     运   算 对标识位Z和C的影响 000 result ←A+B 影响标志位Z和C 001 result ←A+1 影响标志位Z和C 010 result ←A-B 影响标志位Z和C 011 result ←A-1 影响标志位Z和C 100 result←A and B 影响标志位Z 101 result←A or B 影响标志位Z 110 result← not B 影响标志位Z 111 result←B 不影响标志位Z和C ②设立两个标志触发器Z和C。当复位信号reset为低电平时,将这两个标志触发器清零。当运算结束后,在时钟clk的上升沿改变标志触发器Z和C的值。运算结果改变标志触发器C、Z的情况如下:法、法、1、1运算改变Z、C;与、或、非运算改变Z,C保持不变;传送操作保持Z、C不变。因此在运算结束时Z、C需要两个D触发器保持。 ③为了保存操作数A和B,设计两个4位寄存器A和B。当寄存器选择信号sel=0时,如果允许写信号write=1,则在时钟clk的上升沿将数据输入dinput送入A寄存器;当sel=1时,如果允许写信号write=1,则在时钟clk的上升沿将数据输入dinput送入B。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值