开放式CPU 运算器部件实验 移位器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运算器部件实验 移位器
一、实验目的
1、理解寄存器、移位器的原理。
2、掌握5种移位器及其用途。
二、实验原理
1、算术左移SAL (shift arithmetical left )、算术右移SAR(shift arithmetical right) 把操作数看成带符号数,对寄存器操作数进行移位,左移时空出的位补0,右移时空出的位补与最高位相同的1或0,如下图
2、逻辑左移SLL (shift logical left )、逻辑右移SLR (shift logical right ) 把操作数看成无符号数,对寄存器操作数进行移位。左移时空出的位补0,右移时空出的位补0,如下图
3、循环左移ROF (rotation left )、循环右移ROR (rotation right )
循环左右移其实是一样的,比如说8位的操作数,左移n (0≤n ≤8)位和右移n-8位结果是一样的。左移时,移出的最高位移回到最低位;右移时,移出的最低位移回到最高位,如下图
三、实验步骤
循环右移
循环左移
算术右移
‘0
0’
逻辑左移
0’
1、打开QuartusⅡ,安装ByteBlaster Ⅱ。
2、将子板上的JTAG端口和PC机的并行口用下载电缆连接。打开试验台电源。
3、执行Tools—Programmer 命令,将shifter.sof下载到FPGA中。
4、在实验台上通过模式开关选择FPGA-CPU独立调试模式010。
四、输入输出规则
1、将开关CLKSEL拨到1,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU 所需要的时钟使用正单脉冲时钟。
2、输入的8位操作数D7~D0对应开关SD15~SD8。
3、移动的位数n(3位数)对应开关SD7~SD5。
4、方向dir(左移还是右移)对应开关SD4,0代表左移,1代表右移。
5、移位类型kind(2位)对应开关SD3~SD2,00代表算数移,01代表逻辑移,10代表循环移。
6、在按下实验台上的单脉冲按钮后,对操作数移位的结果在灯A7~A0上体现。
五、实验结果
1.对8位数10110100进行移位操作,结果如下表1。
表1 第一组数据:10110110
2.对8位数01001101进行移位操作,结果如下表2。
表2 第二组数据:01001101
3.对8位数01010101进行移位操作,结果如下表3。
表3 第三组数据:01010101
六、心得体会
通过这次实验初步对实验台布局有了大致了解。又重新使用VHDL,在很多细节但很重要的方面摔倒、爬起,比如说信号量赋值是在进程结束后完成,但编程时却忘记这一规则,在进程内就使用了未完成赋值的信号量,结果出错。另外,移位器编写时由于分类较多,只关注了case 的各种情况,而忽略了时钟信号的使用,以至于调试时测试了很久都是在开关拨动时移位就开始了,而不等时钟信号的控制,这些都是粗心大意惹的祸,浪费了很多时间,以后倍加注意。
library ieee;
use ieee.std_logic_1164.all;
entity move is
port
(
clk : in std_logic;
D:in std_logic_vector(7 downto 0);
N:in std_logic_vector(2 downto 0);
dir:in std_logic;
kind:in std_logic_vector(1 downto 0);
light:out std_logic_vector(7 downto 0) );
end entity;
architecture rtl of move is
begin
process (clk)
begin
if(clk'event and clk='1')then
if(dir='0')then
if(kind="10")then
case N is
when "001"=>
light(7 downto 1)<=D(6 downto 0);
light(0)<=D(7);
when "010"=>
light(7 downto 2)<=D(5 downto 0);
light(1)<=D(7);
light(0)<=D(6);
when "011"=>
light(7 downto 3)<=D(4 downto 0);
light(2 downto 0)<=D(7 downto 5);
when "100"=>
light(7 downto 4)<=D(3 downto 0);
light(3 downto 0)<=D(7 downto 4);
when "101"=>
for i in 7 downto 5 loop
light(i)<=D(i-5);
end loop;
light(4 downto 0)<=D(7 downto 3);
when "110"=>
light(7)<=D(1);
light(6)<=D(0);
light(5 downto 0)<=D(7 downto 2);
when "111"=>
light(7)<=D(0);
light(6 downto 0)<=D(7 downto 1);
when others=>light<=D;
end case;
elsif(kind="00"or kind="01")then
case N is
when "001"=>
for i in 7 downto 1 loop
light(i)<=D(i-1);
end loop;
light(0)<='0';