1、开放式CPU运算器部件实验移位器运算器部件实验 移位器一、实验目的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,
2、如下图逻辑左移03、循环左移ROF(rotation left)、循环右移ROR(rotation right)循环左右移其实是一样的,比如说8位的操作数,左移n(0n8)位和右移n-8位结果是一样的。左移时,移出的最高位移回到最低位;右移时,移出的最低位移回到最高位,如下图循环左移循环右移三、实验步骤1、打开Quartus ,安装ByteBlaster 。2、将子板上的JTAG端口和PC机的并行口用下载电缆连接。打开试验台电源。3、执行ToolsProgrammer 命令,将shifter.sof下载到FPGA中。4、在实验台上通过模式开关选择FPGA-CPU独立调试模式010。四、输入输出
3、规则1、将开关CLKSEL拨到1,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU所需要的时钟使用正单脉冲时钟。2、输入的8位操作数D7D0对应开关SD15SD8。3、移动的位数n(3位数)对应开关SD7SD5。4、方向dir(左移还是右移)对应开关SD4,0代表左移,1代表右移。5、移位类型kind(2位)对应开关SD3SD2,00代表算数移,01代表逻辑移,10代表循环移。6、在按下实验台上的单脉冲按钮后,对操作数移位的结果在灯A7A0上体现。五、实验结果1 对8位数10110100进行移位操作,结果如下表1。表1 第一组数据:10110110操作运算ndirkind移位结果逻辑左
4、移2位01000111011000逻辑右移5位10110111111101算术左移3位0110001011000算术右移4位10010011111011循环左移1位00101001101101循环右移7位111110011011012 对8位数01001101进行移位操作,结果如下表2。表2 第二组数据:01001101操作运算ndirkind移位结果逻辑左移2位01000100110100逻辑右移5位10110111111101算术左移3位01100001101000算术右移4位10010000000100循环左移1位00101010011010循环右移7位111110100110103 对
5、8位数01010101进行移位操作,结果如下表3。表3 第三组数据:01010101操作运算ndirkind移位结果逻辑左移2位01000101010100逻辑右移5位10110111111010算术左移3位01100010101000算术右移4位10010000000101循环左移1位00101010101010循环右移7位11111010101010六、心得体会通过这次实验初步对实验台布局有了大致了解。又重新使用VHDL,在很多细节但很重要的方面摔倒、爬起,比如说信号量赋值是在进程结束后完成,但编程时却忘记这一规则,在进程内就使用了未完成赋值的信号量,结果出错。另外,移位器编写时由于分类较
6、多,只关注了case 的各种情况,而忽略了时钟信号的使用,以至于调试时测试了很久都是在开关拨动时移位就开始了,而不等时钟信号的控制,这些都是粗心大意惹的祸,浪费了很多时间,以后倍加注意。library ieee;use ieee.std_logic_1164.all;entity move isport (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
7、:out std_logic_vector(7 downto 0);end entity;architecture rtl of move isbeginprocess (clk)beginif(clkevent and clk=1)thenif(dir=0)thenif(kind=10)thencase N iswhen 001=light(7 downto 1)=D(6 downto 0);light(0)light(7 downto 2)=D(5 downto 0);light(1)=D(7);light(0)light(7 downto 3)=D(4 downto 0);light(2
8、 downto 0)light(7 downto 4)=D(3 downto 0);light(3 downto 0)for i in 7 downto 5 looplight(i)=D(i-5);end loop;light(4 downto 0)light(7)=D(1); light(6)=D(0);light(5 downto 0)light(7)=D(0); light(6 downto 0)lightfor i in 7 downto 1 looplight(i)=D(i-1);end loop;light(0)for i in 7 downto 2 looplight(i)=D(
9、i-2);end loop;light(1)=0;light(0)for i in 7 downto 3 looplight(i)=D(i-3);end loop;light(2 downto 0)for i in 7 downto 4 looplight(i)=D(i-4);end loop;light(3 downto 0)for i in 7 downto 5 looplight(i)=D(i-5);end loop;for i in 4 downto 0 looplight(i)light(7)=D(1); light(6)=D(0);for i in 5 downto 0 loopl
10、ight(i)light(7)=D(0);for i in 6 downto 0 looplight(i)lightfor i in 0 to 6 looplight(i)=D(i+1);end loop;light(7)for i in 0 to 5 looplight(i)=D(i+2);end loop;light(6)=D(0);light(7)for i in 0 to 4 looplight(i)=D(i+3);end loop;light(5)=D(0);light(6)=D(1);light(7)for i in 0 to 3 looplight(i)=D(i+4);end l
11、oop;light(7 downto 4)for i in 0 to 2 looplight(i)=D(i+5);end loop;light(7 downto 3)light(0)=D(6);light(1)=D(7);light(7 downto 2)light(0)=D(7);light(7 downto 1)lightfor i in 0 to 6 looplight(i)=D(i+1);end loop;light(7)for i in 0 to 5 looplight(i)=D(i+2);end loop;light(6)=D(7);light(7)for i in 0 to 4
12、looplight(i)=D(i+3);end loop;light(5)=D(7);light(6)=D(7);light(7)for i in 0 to 3 looplight(i)=D(i+4);end loop;light(4)=D(7);light(5)=D(7);light(6)=D(7);light(7)for i in 0 to 2 looplight(i)=D(i+5);end loop;for i in 3 to 7 looplight(i)light(0)=D(6);light(1)=D(7);for i in 2 to 7 looplight(i)light(0)=D(
13、7);for i in 1 to 7 looplight(i)lightfor i in 0 to 6 looplight(i)=D(i+1);end loop;light(7)for i in 0 to 5 looplight(i)=D(i+2);end loop;light(6)=0;light(7)for i in 0 to 4 looplight(i)=D(i+3);end loop;light(5)=0;light(6)=0;light(7)for i in 0 to 3 looplight(i)=D(i+4);end loop;light(4)=0;light(5)=0;light(6)=0;light(7)for i in 0 to 2 looplight(i)=D(i+5);end loop;for i in 3 to 7 looplight(i)light(0)=D(6);light(1)=D(7);for i in 2 to 7 looplight(i)light(0)=D(7);for i in 1 to 7 looplight(i)light=D; end case;end if; end if;end if;end process;end rtl;