开放式CPU 运算器部件实验 移位器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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';

相关文档
最新文档