计算机组成原理实验第二个,VHDL语言,ISE设计环境设计一个16位的ALU。
资源下载:
链接:https://pan.baidu.com/s/1cyhJ2ZynUMMFnYi2YOIMmA
提取码:0upp

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;entity alu isPort ( clk : in  STD_LOGIC;--时钟rst : in  STD_LOGIC;--复位In_A : in  STD_LOGIC_VECTOR (15 downto 0);--操作数AIn_B : in  STD_LOGIC_VECTOR (15 downto 0);--操作数BOut_Y : out  STD_LOGIC_VECTOR (15 downto 0);--输出OP : in  STD_LOGIC_VECTOR(3 downto 0);--操作码Flags :out STD_LOGIC_VECTOR(3 DOWNTO 0));--标志位为OF/CF/ZF/SF
end alu;architecture Behavioral of alu issignal State:STD_LOGIC_VECTOR (1 downto 0):= "00";--记录当前的状态,来判断该进行什么操作signal int_A, int_B, int_Y : INTEGER RANGE 0 TO 65535:=0;signal temp_A, temp_B, temp_Y : STD_LOGIC_VECTOR (15 downto 0);--定义临时操作数signal Flag_OF : STD_LOGIC;--溢出标志signal Flag_CF : STD_LOGIC;--进位标志signal Flag_ZF : STD_LOGIC;--0标志位signal Flag_SF : STD_LOGIC;--正负标志signal M:  STD_LOGIC:='0';--扩展:对于带符号运算ADC/SBB
beginprocess(rst,clk)beginif (rst='1') thenState <= "00";Flag_OF <= '0';Flag_CF <= '0';Flag_ZF <= '0';Flag_SF <= '0';M <='0';elseif (State = "00") then--状态1,读取A数字转换;temp_A <= In_A;int_A <= CONV_INTEGER(In_A); --将A输入转化为整形State <= "01";end if;if (State = "01") then--状态2,读取B数字转换;int_B <= CONV_INTEGER(In_B);--将B输入转化为整形temp_B <= In_B;State <= "10";end if;if (State = "10") then--状态3,进行运算;CASE OP ISWHEN "0000" => --ADD加Out_Y <= In_A + In_B;temp_Y <= In_A + In_B;M <= '1';--int_Y := int_A + int_B;--Out_Y <= CONV_STD_LOGIC_VECTOR(int_Y,16);if(temp_A(15) = '0' and temp_B(15) = '0' and temp_Y(15) = '1') then --进行溢出和是否进位判断Flag_OF <= '1'; end if;if(temp_A(15)='1' and temp_B(15)='1' and temp_Y(15)='0') then --进行溢出和是否进位判断Flag_OF <= '1'; Flag_CF <='1'; end if;if(temp_Y = "0000000000000000") then --0标志位与0进行比较Flag_ZF <= '1'; end if;if(temp_Y(15) = '1') then --通过符号位来判断正负标志位Flag_SF <= '1'; end if;State <= "11";WHEN "0001" => --SUB减                 int_Y <= int_A - int_B;                    if(int_Y = 0) then Flag_ZF <= '1'; end if;if(int_Y < 0) then Flag_SF <= '1'; end if;Out_Y <= CONV_STD_LOGIC_VECTOR(int_Y,16); State <= "11";WHEN "0010" => --AND逻辑与Out_Y <= (In_A AND In_B);temp_Y <= (In_A AND In_B);if(CONV_INTEGER(temp_Y) = 0) then Flag_ZF <= '1';end if;if(CONV_INTEGER(temp_Y) < 0) then Flag_SF <= '1'; end if;State <= "11";WHEN "0011" => --OR逻辑或Out_Y <= In_A OR In_B;State <= "11";WHEN "0100" => --XOR逻辑异或Out_Y <= In_A XOR In_B;State <= "11";WHEN "0101" => --NOT逻辑非Out_Y <= NOT In_A;State <= "11";WHEN "0110" => --SLL逻辑左移if(In_B = "0000") thenOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SLL CONV_INTEGER(In_B(3 downto 0)));elseOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SLL 1);end if;State <= "11";WHEN "0111" => --SLA算术左移if(In_B = "0000") thenOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SLA CONV_INTEGER(In_B(3 downto 0)));elseOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SLA 1);end if;State <= "11";WHEN "1000" => --SRL逻辑右移if(In_B = "0000") thenOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SRL CONV_INTEGER(In_B));elseOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SRL 1);end if;State <= "11";WHEN "1001" => --SRA算术右移if(In_B(3 downto 0) = "0000") thenOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SRA CONV_INTEGER(In_B(3 downto 0)));elseOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) SRA 1);end if;State <= "11";WHEN "1010" => --ROL循环逻辑左移if(In_B(3 downto 0) = "0000") thenOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) ROL CONV_INTEGER(In_B(3 downto 0)));elseOut_Y <= TO_STDLOGICVECTOR(To_bitvector(In_A) ROL 1);end if;State <= "11";WHEN "1011" =>  --ADC带进位加法if M ='1' thenOut_Y <= In_A + In_B + Flag_CF;temp_Y <= In_A + In_B + Flag_CF;M <='0';end if;WHEN "1100" =>  --SBB带进位减法if M ='1' thenint_Y <= int_A - int_B;Out_Y <= CONV_STD_LOGIC_VECTOR(int_Y,16) - Flag_CF;M <='0';end if;WHEN OTHERS=>Out_Y <= "1111111111111111";--默认报错用-1State <= "11";                      end case;  end if;if State = "11" then--输出FLAGS;Flags(3) <= Flag_OF;Flags(2) <= Flag_CF;Flags(1) <= Flag_ZF;Flags(0) <= Flag_SF;State <= "00";end if; end if;       end process;
end Behavioral;仿真test文件:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;ENTITY test IS
END test;ARCHITECTURE behavior OF test IS -- Component Declaration for the Unit Under Test (UUT)COMPONENT aluPORT(clk : IN  std_logic;rst : IN  std_logic;In_A : IN  std_logic_vector(15 downto 0);In_B : IN  std_logic_vector(15 downto 0);Out_Y : OUT  std_logic_vector(15 downto 0);OP : IN  std_logic_vector(3 downto 0);Flags : OUT  std_logic_vector(3 downto 0));END COMPONENT;--Inputssignal clk : std_logic := '0';signal rst : std_logic := '0';signal In_A: std_logic_vector(15 downto 0) := (others => '0');signal In_B : std_logic_vector(15 downto 0) := (others => '0');signal OP : std_logic_vector(3 downto 0) := (others => '0');--Outputssignal Out_Y : std_logic_vector(15 downto 0);signal Flags : std_logic_vector(3 downto 0);-- Clock period definitionsconstant clk_period : time := 10 ns;BEGIN-- Instantiate the Unit Under Test (UUT)uut: alu PORT MAP (clk => clk,rst => rst,In_A => In_A,In_B => In_B,Out_Y => Out_Y

计算机组成原理VHDL语言实现16位ALU实验相关推荐

  1. 计算机组成原理快速加法器与32位ALU设计实验报告(8位可控加减法电路设计、CLA182四位先行进位电路设计、4位快速加法器设计、16位快速加法器设计、32位快速加法器设计)

    实验二 快速加法器与32位ALU设计实验 本次实验,进行了五个实验,分别是8位可控加减法电路设计.CLA182四位先行进位电路设计.4位快速加法器设计.16位快速加法器设计.32位快速加法器设计.这次 ...

  2. 计算机组成原理--基于Logisim的4位并行加法器实验的应用(超详细/设计/实验/作业/练习)

    目录 课程名:计算机组成原理 内容/作用:设计/实验/作业/练习 学习:基于Logisim的4位并行加法器实验 一.前言 二.环境与设备 三.内容 四.结果与分析 课程名:计算机组成原理 内容/作用: ...

  3. 计算机原理74181芯片,利用SN74181芯片构成16位ALU及原理.ppt

    利用SN74181芯片构成16位ALU及原理 (2)利用SN74181芯片构成16位ALU的原理 l)组间串行进位的16位ALU的构成 2)组间并行进位的16位ALU的构成 SN74182芯片:是一个 ...

  4. 字长为16位的计算机_字长为16位表示这台计算机最大能计算一个16位的十进制数...

    字长为16位表示这台计算机最大能计算一个16位的十进制数 答:× 以下为绿松石的鉴定特征是: 答:内凹的"铁线" 绿蓝色 天蓝色 白色细纹 通常酒店为保证类客人保留客房至 答:入住 ...

  5. java语言采用16位颜色标准_华为Java笔试题一

    华为Java笔试题一 D.Servlet 2.下列说法正确的有( ) A. 环境变量可在编译source code时指定 B. 在编译程序时,所能指定的环境变量不包括class path C. jav ...

  6. (萌新的数电学习)用VHDL语言设计4位行波进位加法器

    实验背景: 全加器是实现三位数相加的组合逻辑电路,共有三个输入,两个输出.输入变量中的两个用 X 和 Y 表示,代表两个加数,第三个输入 Z 表示低位产生的进位.两个输出用 S(和)与 C(进位)来表 ...

  7. [计算机组成原理] Booth算法 —— 补码一位乘法

    x * y = z 运算规则: 1.和原码一位乘法不同,补码一位乘法的符号位是参加运算的,且运算结果和所有参加运算的数都是补码形式. 2.乘数 x 取双符号位参与运算,部分积的初始值为0: 乘数 y ...

  8. 计算机组成原理之原码一位乘法过程

    部分积 乘数 说明 0.0000 + ..0.1110 1101 初始条件,部分积为0 乘数为1 加被乘数 0.1110 0.0111 +. 0.0000 0110 右移一位,形成新的部分积,同时乘数 ...

  9. 计算机组成原理cpu数据通路(Verilog HDL虚拟实验)

    数据通路的作用 数据在功能部件之间传送的路径称为数据通路,建立数据通路的任务是由"控制部件"来完成的 内部数据通路:CPU内部的数据传送通路,用于在寄存器之间或寄存器ALU之间传送 ...

最新文章

  1. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
  2. 创业故事:腾讯的创始人们
  3. 【方法杂谈】你真的了解CVPR吗?
  4. IOS项目集成Weex
  5. Python之令人心烦意乱的字符编码与转码
  6. Android传感器编程入门
  7. 【图像处理】——Python+opencv实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(findcontours函数和contourArea函数)
  8. .NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...
  9. Sublime Text 如何设置组合快捷键
  10. 【HDU - 4006】The kth great number (优先队列,求第k大的数)
  11. 在oracle中的日期类型与String类型
  12. json转换成dart类 JSON to Dart
  13. (day 38 - 双指针) 剑指 Offer 52. 两个链表的第一个公共节点
  14. python中使用动量交易策略
  15. 各行各业,各种资源,淘宝售卖的各种资料,全部分享了 !
  16. 文本去重:I-Match算法
  17. NumPy库常见操作总结
  18. 安装虚拟机提示未启动服务器,Hyper-V虚拟机未启动,并触发0x80070057错误
  19. Busiest Computing Nodes (线段树维护区间最小值)
  20. nb移动udp_电信NB物联网平台不仁不义有人来管管吗?

热门文章

  1. (嵌入式)ARM开发环境入门-----一个简单的LED灯闪烁的实现
  2. 软底有软件测试培训吗,【4月3日】一站式线上学习课程——一年级 鼠小弟云课堂开讲啦!...
  3. 二维过渡金属硫化物薄膜
  4. ECA 认证备考指南
  5. 一个简易的弹球小游戏
  6. Spring循环依赖及其解决方式
  7. 计算机组成原理慕课测试-期末考试
  8. 扑克牌打乱发牌(初学一周)
  9. 头歌C++ 第8章 虚函数与多态性
  10. 格式化SD卡、修复烧写系统失败的SD卡