基于VHDL移位寄存器程序设计

基于VHDL移位寄存器程序设计

实验目的

(1) 掌握中规模4位移位寄存器逻辑功能及使用方法。

(2) 学会用VHDL语言设计4位移位寄存器。

实验原理

移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。既能左移又能右移的称为双向移位寄存器,只需要改变左、右移位的控制信号便可实现双向移位要求。根据移位寄存器存取信息的方式不同分为:串入串出、串入并出、并入串出、并入并出四种形式。该实验设计的是串行输入并行输出的左移位寄存器,由顶层文件模块及D触发器模块组成。

实验内容

(1) 用VHDL编写移位寄存器源程序。

(2) 将源程序进行综合、优化及功能仿真。

(3)软件说明:ModelSimSetup-13.1.0.162,QuartusSetup-13.1.0.162。

建立工程:

第一步:打开Quartus软件。

第二步:点击New Project Wizard -> next.

第三步:选择工程文件的存放位置,输入工程名 -> next -> next。

第四步:在family栏选择芯片型号-Cyclone IV E,在Name栏选择EP4CE115F29C7,选择完之后点击next。(如果不进行硬件调试时,此处默认即可)

第五步:检查工程有没有建错,点击完成。如下图:
在这里插入图片描述

程序设计:

全加器顶层文件设计:

   --文件名:shift_req.vhd 应与工程名保持一致:
  library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity shift_req is
    Port( a : in std_logic;
           clk : in std_logic;
           b: out std_logic_vector(4 downto 0));
end shift_req;
architecture gen_shift of shift_req is
signal z:std_logic_vector(0 to 4);
component dff   --D触发器元件声明
   port (d,clk:in std_logic;
         q:out std_logic);
end component;
begin
--	--方法一
--	z(0)<=a; b<=z(4);
--	q1:for i in 0 to 3 generate
--		dffx : dff port map(z(i),clk,z(i+1));
--	end generate;
	--方法二
dff0: dff port map(a,clk,z(0));   --元件例化语句
dff1: dff port map(z(0),clk,z(1));
dff2: dff port map(z(1),clk,z(2));
dff3: dff port map(z(2),clk,z(3));
dff4: dff port map(z(3),clk,z(4));
b<=z;
end gen_shift;

D触发器元件进行实例化:

 --文件名:dff.vhl
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity dff is
        Port ( d : in std_logic;
             clk : in std_logic;
             q : out std_logic);
    end dff;
    architecture Behavioral of dff is
    signal q_temp:std_logic;
    begin
     process(clk)
     begin
       if(clk'event and clk='1')then
           q_temp<=d;
       end if;
     end process;
     q<=q_temp;
    end Behavioral;

文件仿真(这里采用modelsim仿真波形):

  1. 选择File-> New -> Verification/Debugging Files ->University Program VWF。
    在这里插入图片描述
    2.打开测试文件。(右键点击添加端口,对输入信号初始化,赋值。)
    在这里插入图片描述
    3.仿真结果:

在这里插入图片描述
逻辑电路图:

显示编译成功后,选择菜单栏 Tools –>Netlist Viewers –>RTL Viewer 显示逻辑电路图
在这里插入图片描述

  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
双向移位寄存器可以实现数据在寄存器中向左或向右移位的功能。以下是一种基于VHDL语言实现双向移位寄存器设计思路: 1. 首先定义双向移位寄存器的输入输出端口。包括数据输入端口Din、数据输出端口Dout、向左移位控制端口LS、向右移位控制端口RS,以及时钟端口CLK。 ``` entity BiShiftReg is port( Din, Dout: in std_logic_vector(7 downto 0); LS, RS, CLK: in std_logic; Q: out std_logic_vector(7 downto 0) ); end entity BiShiftReg; ``` 2. 定义一个内部信号变量ShiftReg,用于存储寄存器中的数据。同时定义一个计数器变量Count,用于记录当前寄存器中数据的位置。 ``` architecture Behavioral of BiShiftReg is signal ShiftReg: std_logic_vector(7 downto 0); signal Count: integer range 0 to 7 := 0; begin ``` 3. 在时钟上升沿时,判断移位控制信号LS和RS的状态,更新Count变量。如果LS为'1',则Count减1,表示寄存器中的数据向左移位;如果RS为'1',则Count加1,表示寄存器中的数据向右移位。 ``` process(CLK) begin if rising_edge(CLK) then if LS = '1' then Count <= Count - 1; elsif RS = '1' then Count <= Count + 1; end if; ``` 4. 根据Count变量的值,将输入数据Din赋值给ShiftReg中对应的位置。同时,将ShiftReg中对应位置的数据赋值给输出端口Dout。 ``` ShiftReg(Count) <= Din; Q <= ShiftReg(Count); end if; end process; end architecture; ``` 以上就是一个简单的双向移位寄存器VHDL设计。需要注意的是,此处实现的是循环移位,即当寄存器中的数据向左或向右移位时,最左端或最右端的数据将会重新出现在另一端。如果需要实现非循环移位,需要对Count变量进行额外的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泸州月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值