如何在VHDL中翻转向量中的位

时间:2014-05-28 23:35:36

标签: rotation vhdl

我有VHDL的问题,我想旋转信号Checked1并将其保存在自身:

Checked1<=to_stdlogicvector(to_bitvector(Checked1) ROR 1);

我得到全零,而不是0100-> 0010 我知道我不能使用相同的信号,但我必须在循环中更改Checked1。

我如何使用它?

整个代码在这里:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.numeric_std.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Stall_control is
Port ( EP : in  STD_LOGIC_VECTOR (7 downto 0);
SP : in  STD_LOGIC_VECTOR (7 downto 0);
Comp : in  STD_LOGIC_VECTOR (7 downto 0);
Position : out STD_LOGIC_VECTOR  (7 downto 0));
end Stall_control;

architecture Behavioral of Stall_control is

type state is (LOOP_STATE, END_STATE);

signal FSM_state: state;

signal Check: STD_LOGIC_VECTOR  (7 downto 0);
signal Checked: STD_LOGIC_VECTOR  (7 downto 0);
signal Checked1: STD_LOGIC_VECTOR  (7 downto 0):="00000000";

signal flag: STD_LOGIC:='0';
begin
Checked<= EP;
process(EP, SP, Comp, Check, CheckED, CheckED1, FLAG)
begin


Position<= "11111111";

    case FSM_state is

        when LOOP_STATE=>
            if((Checked AND Comp)="00000000") OR ((Checked1 AND Comp)="00000000") then
                Checked1<=to_stdlogicvector(to_bitvector(Checked1) ROR 1);

                --Checked<=Checked1;

                --Checked1(7 downto 0)<=Checked1(0)&Checked1(7 downto 1);

                flag<='0';

                if(CheckED1/= SP) then
                    FSM_state<=LOOP_STATE;
                else
                    FSM_state<=END_STATE;
                end if;

            else
                flag<='1';
                FSM_state<=END_STATE;
            end if;

        when END_STATE=>
            if flag='1' then
                    Position<= Checked1;
            else
                    --Position<= Checked1;
                    Position<= "11111111";
            end if;
    end case;

end process;

end Behavioral;

1 个答案:

答案 0 :(得分:1)

除了所有&#39; 0之外,你永远不会将任何东西分配给checked1。

case fsm_state is

    when loop_state =>
        if (checked  and comp) = "00000000" or 
           (checked1 and comp) = "00000000" then

            checked1 <= to_stdlogicvector(to_bitvector(checked1) ror 1);

            flag<='0';

            if checked /= sp then
                fsm_state<=loop_state;
            else
                fsm_state<=end_state;
            end if;

        else
                flag<='1';
            fsm_state<=end_state;
        end if;

checked1的默认值为(其他=&gt;&#39; 0&#39;)(全为零)并且仅旋转1.当然它将全部为零。

  

- ror运算符返回一个由R索引位置向右旋转的值。也就是说,如果R为0或者L为空数组,则返回   值为L.否则,基本旋转操作用a替换L.   值是右参数的连接结果   L的最左边(L&#39;长度 - 1)元素,左边的参数是   L(L&#39;右)。如果R为正,则重复该基本旋转操作   R次形成结果。如果R为负数,则返回值为   表达式L rol -R。

的值

听起来你想要check1的其他默认值。

您不需要ROR运算符,您可以使用串联:

checked1 <= checked1(0) & checked1 (7 downto 1);

(因为你的ROR算子R值是常数并且在checked1的长度内)。

在您的上下文子句中,现在没有一个注释掉包:

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.std_logic_arith.all;
-- use ieee.numeric_std.all;
-- use ieee.std_logic_unsigned.all;

不是三者之一,组合可能存在潜在冲突。

并且填充过程灵敏度列表的方式,您已经创建了振荡,在过程中分配的任何信号也在灵敏度列表中将导致过程恢复下一个模拟循环。放一个&#39; 1&#39;在checked1的默认值和旋转的某处,它将导致checkd1上的事件(值的更改),从而导致连续调用该进程。