VHDL右移位寄存器问题

VHDL右移位寄存器问题,vhdl,shift,Vhdl,Shift,我是个新手,我正试图用VHDL实现除数元件的移位寄存器。移位寄存器必须接受15位输入,并在每个时钟周期将其向右移位,同时在最高有效位上链接“0”。 一、 我写了这段代码 -------右移---------------------------------- > library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; > > entity shift_right is port( in_s

我是个新手,我正试图用VHDL实现除数元件的移位寄存器。移位寄存器必须接受15位输入,并在每个时钟周期将其向右移位,同时在最高有效位上链接“0”。 一、 我写了这段代码


-------右移----------------------------------

>  library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all;
> 
> entity shift_right is port(   in_shift_right: in std_logic_vector(14
> downto 0);
>       clk_shift_right, rst_shift_right : in std_logic;
>       out_shift_right : out std_logic_vector (14 downto 0) ); end shift_right;
> 
> architecture behavioral of shift_right is begin  
> process(clk_shift_right, rst_shift_right, in_shift_right )   variable
> tmp : std_logic_vector(14 downto 0);    begin
>     if rising_edge (clk_shift_right) then     elsif rst_shift_right = '1' then  
>       tmp := (others => '0');
>     elsif rising_edge(clk_shift_right) then 
>       tmp:='0'&in_shift_right(14 downto 1);
>           end if;
>            out_shift_right<=tmp;   end process;    end behavioral;
图书馆IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用ieee.numeric_std.all; > >实体shift\u right是端口(在shift\u right中:在std\u逻辑\u向量中(14 >降到0); >时钟向右移位、rst向右移位:在标准逻辑中; >out_shift_right:out标准逻辑向量(14向下到0);右移结束; > >右移开始了 >进程(clk\U shift\U right、rst\U shift\U right、in\U shift\U right)变量 >tmp:std_逻辑_向量(14到0);开始 >如果上升沿(clk\U shift\U right),则elsif rst\U shift\U right='1',则 >tmp:=(其他=>'0'); >elsif上升沿(时钟向右移动)然后 >tmp:='0'&向右移动(14向下移动到1); >如果结束; >向外移动,向右移动 >案例模式为 >--西索 >当“00”=> >温度(6至0)温度(7)出口 >--国家知识产权局 >当“01”=> >温度(6至0)温度(7)撅嘴 >--皮波 >当“10”=> >临时撅嘴 > >当其他人=> >无效; > >终例; > >如果结束; > >结束过程; > >结束行为; 它实际上按照我的要求工作,但是,正如你从波形中看到的,它只在“case”上选择的模式为“01”时工作,但只有在“10”模式之后才工作。 我也不明白为什么它只能在时钟周期延迟后工作,我在图中突出显示了这一点:


非常感谢任何能帮助我的人

如果你整理代码的缩进,我想你会立即发现一些问题。例如,考虑一下这段代码将做什么:

if rising_edge (clk_shift_right) then

elsif rst_shift_right = '1' then  
    tmp := (others => '0');
elsif rising_edge(clk_shift_right) then
    ...
最终的
elsif
的内容永远无法访问

第二个注释是,您已将
rst
置于灵敏度列表中的\u shift\u right
。您想要同步重置还是异步重置?如果是同步的,则不需要在灵敏度列表中显示rst。无论哪种方式,我都不认为有任何理由将
放在灵敏度列表中的\u shift\u right

第三点意见是,使用
变量
tmp
)可能令人担忧。您的用法完全有效,语法正确,但在这种情况下似乎是一个非常奇怪的选择。如果这是一个深思熟虑的风格选择,那没关系。但是,如果您不理解
信号
变量
之间的区别,那么我建议您花一点时间。记住,这不是软件;您正在描述硬件

第四条评论是,你的作业
tmp:='0'&向右移动(14向下移动到1)
始终在右移位中使用输入
的上14位
。这显然不是你想做的(你想保持右移)。试着想想需要什么样的硬件来实现这一点

您已经包含了ieee.numeric\u std
库,因此实际上有一个可以直接使用的
shift\u right
函数。您没有确切地描述希望块执行的操作,但我猜是这样的(假设异步重置):

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体右移位器为
一般的(
数据位:正:=15
);
港口(
clk:标准逻辑中;
rst:标准逻辑中;
--输入
in_valid:标准_逻辑中;
in_数据:in-std_逻辑_向量(数据_位-1向下至0);
--控制
shift_enable:在标准_逻辑中;
--输出
输出数据:输出标准逻辑向量(数据位-1到0)
);
右端移相器;
右移位器的结构rtl为
信号数据:无符号(数据位-1降到0);
开始
过程(时钟、rst)
开始
如果rst='1',则
--重置
数据“0”);
elsif上升沿(clk)则
如果in_valid='1',则
--加载新输入

数据你的代码非常混乱。我想如果你只是整理一下凹痕,你会立即发现一些问题。
if rising_edge (clk_shift_right) then

elsif rst_shift_right = '1' then  
    tmp := (others => '0');
elsif rising_edge(clk_shift_right) then
    ...
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity right_shifter is
generic (
    DATA_BITS       : positive := 15
);
port (
    clk             : in std_logic;
    rst             : in std_logic;
    -- Input
    in_valid        : in std_logic;
    in_data         : in std_logic_vector(DATA_BITS-1 downto 0);
    -- Control
    shift_enable    : in std_logic;
    -- Output
    out_data        : out std_logic_vector(DATA_BITS-1 downto 0)
);
end right_shifter;

architecture rtl of right_shifter is

    signal data     : unsigned(DATA_BITS-1 downto 0);

begin

    process(clk, rst)
    begin
        if rst = '1' then
            -- Reset
            data <= (others => '0');
        elsif rising_edge(clk) then
            if in_valid = '1' then
                -- Load new input
                data <= unsigned(in_data);
            elsif shift_enable = '1' then
                -- Shift right
                data <= shift_right(data, 1);
            end if;
        end if;
    end process;
    out_data <= std_logic_vector(data);

end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity right_shifter is
generic (
    DATA_BITS       : positive := 15
);
port (
    clk             : in std_logic;
    rst             : in std_logic;
    -- Input
    in_valid        : in std_logic;
    in_data         : in std_logic_vector(DATA_BITS-1 downto 0);
    -- Control
    shift_enable    : in std_logic;
    -- Output
    out_data        : out std_logic_vector(DATA_BITS-1 downto 0)
);
end right_shifter;

architecture rtl of right_shifter is

    signal data     : unsigned(DATA_BITS-1 downto 0);

begin

    process(clk)
    begin
        if rising_edge(clk) then
            if rst = '1' then
                -- Reset
                data <= (others => '0');
            elsif in_valid = '1' then
                -- Load new input
                data <= unsigned(in_data);
            elsif shift_enable = '1' then
                -- Shift right
                data <= shift_right(data, 1);
            end if;
        end if;
    end process;
    out_data <= std_logic_vector(data);

end rtl;