图2-2A 带进位控制的ALU
三.实验步骤
(1)根据电路图2-2A和波形图B,首先使键5(T4)和键7(CN)=0;键8(M)和键3(A0_B1)=1;连续按键6,使产生9个脉冲,这时数码管8显示9(作加法运算);再用键2,键1输入加数9DH(数码管4/3显示9D);
(2)按键3=0,再用键2,键1输入被加数E5H(数码管4、3、2、1分别显示加数和被加数);再将键8(M)置0,使ALU作算术运算,这时可以从数码管6,5上看到9DH+E5H=82H(低8位和);
(3)先将键7(CN)置为1(允许锁存ALU的进位),再用键5(T4)产生一个正脉冲,就能将进位锁入D触发器中:数码管7将显示1,表示加法有进位,并被锁;同时可以看到此进位被累加,使数码管6,5=83H。
四.实验所用VHDL的代码
1.生成ALU181元件的VHDL代码 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ALU181 IS PORT (
S : IN STD_LOGIC_VECTOR(3 DOWNTO 0 );
6
A : IN STD_LOGIC_VECTOR(7 DOWNTO 0); B : IN STD_LOGIC_VECTOR(7 DOWNTO 0); F : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); M : IN STD_LOGIC; CN : IN STD_LOGIC;
CO : OUT STD_LOGIC ); END ALU181;
ARCHITECTURE behave OF ALU181 IS
SIGNAL A9 : STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL B9 : STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL F9 : STD_LOGIC_VECTOR(8 DOWNTO 0); BEGIN
A9 <= '0' & A ; B9 <= '0' & B ; PROCESS(M,CN,A9,B9) BEGIN
CASE S IS WHEN \=> IF M='0' THEN F9<=A9 + CN ; ELSE F9<=NOT A9; END IF;
WHEN \ IF M='0' THEN F9<=(A9 or B9) + CN ; ELSE F9<=NOT(A9 OR B9); END IF;
WHEN \ IF M='0' THEN F9<=(A9 or (NOT B9))+ CN ; ELSE F9<=(NOT A9) AND B9; END IF;
WHEN \ IF M='0' THEN F9<= \ ; ELSE F9<=\ END IF;
WHEN \=> IF M='0' THEN F9<=A9+(A9 AND NOT B9)+ CN ; ELSE F9<=NOT (A9 AND B9); END IF;
WHEN \=> IF M='0' THEN F9<=(A9 or B9)+(A9 AND NOT B9)+CN ; ELSE F9<=NOT B9; END IF;
WHEN \ IF M='0' THEN F9<=(A9 - B9) - CN ; ELSE F9<=A9 XOR B9; END IF;
WHEN \ IF M='0' THEN F9<=(A9 or (NOT B9)) - CN ; ELSE F9<=A9 and (NOT B9); END IF;
WHEN \=> IF M='0' THEN F9<=A9 + (A9 AND B9)+CN ; ELSE F9<=(NOT A9)and B9; END IF;
WHEN \ IF M='0' THEN F9<=A9 + B9 + CN ; ELSE F9<=NOT(A9 XOR B9); END IF;
WHEN \=> IF M='0' THEN F9<=(A9 or(NOT B9))+(A9 AND B9)+CN ; ELSE F9<=B9; END IF;
WHEN \=> IF M='0' THEN F9<=(A9 AND B9)- CN ; ELSE F9<=A9 AND B9; END IF;
WHEN \ IF M='0' THEN F9<=(A9 + A9) + CN ; ELSE F9<= \ END IF;
WHEN \ IF M='0' THEN F9<=(A9 or B9) + A9 + CN ; ELSE F9<=A9 OR (NOT B9); END IF;
7
WHEN \ IF M='0' THEN F9<=((A9 or (NOT B9)) +A9) + CN ; ELSE F9<=A9 OR B9; END IF;
WHEN \ IF M='0' THEN F9<=A9 - CN ; ELSE F9<=A9 ; END IF;
WHEN OTHERS => F9<= \ END CASE; END PROCESS;
F<= F9(7 DOWNTO 0) ; CO <= F9(8) ;end behave;
五.实验报告
(1)实验原理。 (2)绘制相应的时序波形图。 (3)实验结果分析、讨论。
实验(八) 程序计数器PC与地址寄存器AR实验
一.实验目的
1.掌握地址单元的工作原理。
2.掌握的两种工作方式,加1计数和重装计数器初值的实现方法;
3.掌握地址寄存其从程序计数器获得数据和从内部总线获得数据的实现方法。
二.实验原理
地址单元主要由三部分组成:地址寄存器和多路开关。
程序计数器PC用以指出下一条指令在主存中的存放地址,CPU正是根据PC的内容去存取指令的。因程序中指令是顺序执行的,所以PC有自增功能。程序计数器提供下一条程序指令的地址,如电路图4-2-1所示,在T4时钟脉冲的作用下具有自动加1的功能;在LDPC信号的作用下可以预置计数器的初值(如子程序调用或中断相应等)。当LDPC为高电平时,计数器装入data[ ]端输入的数据。aclr是计数器的清0端,高电平有效(高电平清零);aclr为低电平时,允许计数器正常计数。
图4-2-1程序计数器原理图
地址寄存器AR(74273)锁存访问内存SRAM的地址。273中的地址来自两个渠道。一是程序计数器PC的输出,通常是下一条指令的地址;二是来自于内部数据总线的数据,通常是被访问操作数的地址。
为了实现对两路输入数据的切换,在FPGA的内部通过总线多路开关BUSMUX进行选择。LDAR与多路选择器的sel相连,当LDAR为低电平,选择程序计数器的输出;当LDAR为高电平时,选择内部数据总线的数据。
8
图4-2-2 程序计数器工作波形
三.实验步骤
1.按照 图4-2-1程序计数器原理图编辑、输入电路,实验台选择NO.0工作模式。对输入原理图进行编译、引脚锁定、并下载到实验台。示例工程文件是PC_unit.bdf。硬件实验验证(与仿真波形图4-2-2比较!)。实验说明:
(1)下载pc_unit.sof ; (2)用模式键选模式“0”,再按一次右侧的复位键;
(3)键2和键1可输入8位总线数据B[7..0](此值显示于发光管D1~D8和数码管2/1);CLR(键5)按2次(0?1?0),产生一正脉冲,高电平清零;LDAR(键6)=0时,BUSMUX输出程序计数器PC的值;LDAR=1时,BUSMUX输出B[7..0]总线数据。LDPC(键7):程序计数器PC预置控制端,当LDPC=1时,将B[7..0]总线数据装入程序计数器PC;当LDPC=0时,程序计数器PC处于计数自动工作状态,对T4进行计数;T4(键8):程序计数器PC的计数时钟CLK,键8按动两次产生一个计数脉冲。
2.通过B[7..0]设置程序计数器的预加载数据。当LDPC=0时,观察程序计数器自动加1的功能;当LDPC=1时,观察程序计数器加载输出情况,示例操作:
1、所有键置0,键2/1输入A5;按键5?PC计数器清0(0?1?0); 2、连续按动键8,可以从数码8/7上看到AR的输出,即PC值;
3、按键6?’1’,选通直接输出总线上的数据A5作为PC值,按键8,产生一个脉冲上升沿,即可看到AR(显示在数码8/7)的输出为A5;
4、使键6=0,仍选通PC计数器输出,这时键2/1输入86,按键7产生一个上升脉冲(0?1?0),即用LDPC将86加载进PC计数器;
5、连续按动键8,可以发现AR的输出在86上累加输出:86、87、88等。
四.实验报告
(1)实验原理。 (2)绘制相应的时序波形图。 (3)实验结果分析、讨论。
9