将逻辑向量移位到位

时间:2014-10-09 09:03:31

标签: if-statement vhdl clock fpga bit-shift

我有一个8位逻辑向量,应该转移到输出。

constant CR:std_logic_vector:(7 downto 0):="11000000";

我正在尝试使用CR的索引和属于指定索引的每个值...

Q<=CR(i);

我通过if语句将i计数为0到7以实现移位。但我对此有些怀疑。我正确的方式吗?或者有更好的方法来做这个,如移动功能。 (当然thiş操作应该与时钟同步,以便能够合成。)

我是VHDL的新手,所以感谢您的回复。

1 个答案:

答案 0 :(得分:1)

不,真的,我对你的问题的评论并不是对你接受答案的征求,对于声誉点我并不是那么难,诚实。

我的意思是潜在的问题回答者很难为你的问题付出任何努力,而且你的声誉也不会增加。

将一个时钟条件置于循环语句中(与生成语句相反,似乎有点尴尬,所以让我们尝试一个单独的计数器:

library ieee;
use ieee.std_logic_1164.all;

entity shft_log_vec is
    port (
        rst:    in  std_logic;
        clk:    in  std_logic;
        Q:      out std_logic
    );
end entity;

architecture foo of shft_log_vec is
    constant CR:       std_logic_vector (7 downto 0) := "11000000";
    signal bit_ctr:  natural range CR'REVERSE_RANGE;  

begin

    Q <= CR(bit_ctr);

INDEX_CTR:
    process (clk, rst)

                           -- uninitialized default value is 0
    begin
        if rst = '1' then  -- will only run after a rst after the first time, use reset
           bit_ctr <= 0;
        elsif bit_ctr < CR'HIGH and rising_edge(clk) then  -- you could add an enable
           bit_ctr <= bit_ctr + 1;  -- integer arithmetic and comparison.
        else
        end if;
        -- because you need clock evaluation  for sequential operation in there, no loop 
        -- statement.  Reverse the bit order by using 'RANGE instead.

    end process;

end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity tb_shft_log_vec is
end entity;

architecture foo of tb_shft_log_vec is
    signal rst: std_logic := '0';
    signal clk: std_logic := '0';
    signal Q:   std_logic;
begin

DUT:
    entity work.shft_log_vec 
        port map (
            rst => rst,
            clk => clk,
            Q  => Q
        );

CLOCK:
    process 
    begin
        wait for 20 ns;
        clk <= not clk;
        if Now > 360 ns then
            wait;
        end if;
    end process;

STIMULUS:
    process
    begin
        wait for 1 ns;
        rst <= '1';
        wait for 20 ns;
        rst <= '0';
        wait;
    end process;

end architecture;

请注意CR的指针是bit_ctr,这是一个约束整数,从0到7然后停止。

如果您希望CR以相反的顺序出现(7先出现),请使用'RANGE'LOW代替'REVERSE_RANGE'HIGH.

当模拟测试平台时,我们看到Q的值在每个时钟上升沿CR(0)CR(7)并且停止等待复位。

tb_shft_log_vec.png (图片是指向全尺寸的链接)

使用重置,这意味着生成器和接收者都知道要采样Q的时钟边缘。根据信号Q的路由距离(跨越时钟树边界),切换到发生器和接收器之间的同步复位共享可能是谨慎的。

请注意评论链接中与上一个问题的答案的相似点和不同点。这种使用属性的方式允许您轻松更改CR的大小。