如何逐位填充矢量

时间:2016-09-23 17:30:22

标签: vhdl

我有一个名为 RDIBits 的12位向量和一个名为 InUartToUart 的std_logic。我的问题是:每当时钟进入' 1'时,我会收到 InUartToUart 中的一些内容,我想连接我将在 RDIBits 向量。基本上,它是一个串行通信,这就是我每次收到1位的原因。有没有简单的方法来做到这一点?类似于JAVA中的 RDIBits + = InUartToUart

3 个答案:

答案 0 :(得分:1)

我添加了更多内容,例如实体,IO和输出寄存器的计数器。

LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    USE ieee.numeric_std.all;


ENTITY my_uart IS
    PORT(
        clk                    : IN  std_logic;                     -- system clock
        rst                    : IN  std_logic;                     -- reset high active
        ---------------------------------------------
        InUartToUart           : IN  std_logic;
        DataOut                : OUT std_logic_vector(11 downto 0)
   );
END ENTITY;

ARCHITECTURE struct OF my_uart IS
signal RDIBits : std_logic_vector(11 downto 0);
signal counter : integer range 0 to 12;

begin

    calc_proc: process(clk, rst)
    begin
        if (rst = '1') then
            RDIBits <= (others => '0');
            counter <= 0;
        elsif ( rising_edge(clk) ) then
            if (counter < 12) then
                RDIBits <= RDIBits(10 downto 0) & InUartToUart;
                counter <= counter + 1;
            elsif (counter = 12) then
                DataOut <= RDIBits;
                counter <= 0;
            end if;
        end if;
    end process;

END STRUCT;

答案 1 :(得分:1)

我的编码方式略有不同。也许考虑一下。 抱歉格式化,我是这个网站的新手。我还展示了如何初始化变量。

signal RDIBits : std_logic_vector(11 downto 0) := (Others => '0');

...
process(clk)
begin
    if ( rising_edge(clk) ) then
        RDIBits(11 downto 1) <= RDIBits(10 downto 0);
        RDIBits(0) <= InUartToUart;
    end if;
end process;

答案 2 :(得分:0)

这是典型的移位寄存器应用程序。例如:

signal RDIBits : std_logic_vector(11 downto 0);

...

process(clk)
begin
  if ( rising_edge(clk) ) then
    RDIBits <= RDIBits(10 downto 0) & InUartToUart;
  end if;
end process;