运算器实验
一、 实验设计方案
实验框图
实验原理
运算器能对计算机中的数据进行算术和逻辑运算,其基本部分为算术逻辑运算单元、通用寄存器组、输入数据选择电路、输出数据控制电路。
通过SW_BUS总线数据开关来控制数据的输入,复合运算的中间结果存至两片74374(三态输出八位寄存器),每次参与运算的两个数值通过总线传至DR1,DR2,即两片74273来传至运算器
74181,再通过ALU_BUS显示运算结果,将结果传经数据总线传至通用寄存器。
运算器VHDL 代码 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity exp_r_alu is port( clk :in std_logic; sw_bus,r4_bus,r5_bus,alu_bus :in std_logic; lddr1,lddr2,ldr4,ldr5:in std_logic; m,cn :in std_logic; s :in std_logic_vector(3 downto 0); k:in std_logic_vector(7 downto 0); d:inout std_logic_vector(7 downto 0)); end exp_r_alu;
architecture rtl of exp_r_alu is
signal dr1,dr2,r4,r5,aluout,bus_reg:std_logic_vector(7 downto 0); signal sel:std_logic_vector(5 downto 0); begin
ldreg:process(clk,lddr1,lddr2,ldr4,ldr5,bus_reg)
begin if clk'event and clk='1' then if lddr1='1' then dr1
ALU:process(m,cn,s,dr1,dr2,sel,aluout) begin selaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluout
when "011010" =>aluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluoutaluout
bus_reg
d'Z'); end rtl;
下载实验原理图
二、 功能验证
波形图
操作步骤
下载仿真图
数据记录
仿真结论
仿真结果表明该实验成功实现运算器运算功能
三、 硬件验证
芯片分配:FLEX10K-EPF10K20TI144-4
管脚分配:
硬件验证结论:
考虑实验板上输入输出资源限制,必须采用计数器模块产生输入原始数据,并且充分利用数码管资源直观显示数据。数据输入部分用两个十六进制的计数器级联而成,以便减少输入开关的占用,同时设计一个数码管扫描电路(模2计数器+二选一多路选择器+七段译码器),方便使用数码管显示两位十六进制数。机器依次存入两个数据,进行运算,显示运算结果。实验过程中要设置好时钟频率,如果不注意,显示的结果若直接输入到通用寄存器中后,产生错误。
四、 实验日志
实验问题
Q1. 在下载的仿真图中,没有出现d~result
A1. 将运算器的输出端错误的设置成output ,而不是bidir
Q2. 在下载的仿真图中,七段译码器一味计数,与d~result结果不符 A2. 错误的将二选一多路选择器的输入端用k[7..0],应该使用d[7..0]
Q3. 两个计数器的输出信号为并列关系
A3. 应该将低位计数器的进位信号作为高位计数器的时钟信号
思考题
Q1. 存入DR1、DR2的数据如何在总线显示? A1. 控制信号为“010000”,输出DR1;
控制信号为“1x1010”,输出DR2。
Q2. 复合运算时,ALU 运算出的中间结果为什么不能直接存入DR1或DR2?
A2. 由于ALU 会立即执行当前运算,所以在进行复合运算时,直接存入DR1或DR2
中,运算器会将当前结果作为操作数运算,可能产生错误。
Q3. 计算机中的负数如何表示?
A3. 计算机用这个数字的补码来表示,即取反加1。
Q4. 74181的功能表中运算“+”与“加”的区别是什么?
A4. “+”是逻辑运算的或运算,“加”是算术运算的加法运算。
Q5. exp_r_alu.vhd中并置运算符“&”主要作用是什么?
A5. exp_r_alu.vhd中并置运算符“&”主要作用是用于位和位矢量的连接,从而实现了
直接连接从而形成数组。
Q6. exp_s_alu.vhd代码中为什么要调用ieee.std_logic_unsigned库?
A6. std_logic_unsigned对std_logic和std_logic_vector数据类型的各种运算符定义了重
载函数以及转换函数,此实验要用到std_logic_vector数据类型数据的运算。
Q7. VHDL语言中可以如何表示十六进制格式数据? A7. 在十六进制格式数据前面加上0x 来表示。.
实验总结 本次试验,开始没有运用到16进制的加法计数器,所以在下载中造成了一系列的困难。同时能够根据学仿真结果更改自己的实验原理图,从而不断更正。下载的步骤让自己重新回顾了计数器以及数码管扫描电路的相关知识,以及LPM 定制的相关操作步骤,而且在数据传递过程中,能够注意到各控制开关操作的具体顺序。实验思路还比较清晰,为接下来更庞大的实验打下基础。