VHDL高效且正确的内存分配

时间:2018-12-20 13:28:59

标签: memory vhdl

我正在尝试在FPGA上生成内存,但是我遇到了一些有关如何处理存储数据的问题。 当我想更新数据时,是否需要使用new_q1信号? (就像我尝试在我的代码中应用(版本1和3))。 有人告诉我我需要一个新的q1信号(我不完全知道为什么),并且我总是应该有一个'else'语句以防止'do n't care'。

版本1是带有新q1信号的版本,但是new_q1没有初始值。版本2是我实际开始使用的版本,但是我收到一条评论,由于某些原因(我不太了解),这不是正确的方法。

版本3是完全可以正常工作的版本,就像我向我解释的那样,但是在我看来,版本太多了,合成器拒绝了我的new_q1结构。

我应该使用哪个版本,有人可以澄清我被告知的内容是正确的,为什么?

版本1:

entity memory is
   port(
    clk : in std_logic;
    reset : in std_logic;
    selector : in std_logic_vector(5 downto 0);
    write : in std_logic;
    value : out std_logic
    );
end memory;


architecture behaviour of memory is
    signal q1, new_q1 : std_logic_vector(63 downto 0);
begin
    process(clk, reset) is
        begin
        if( clk'event AND clk = '1') then
            if(reset = '1') then
                q1 <= (others => '0');
            else
                q1 <= new_q1;
            end if;
        end if;
    end process;
    process(q1) is
        if(write = '1') then
            new_q1(to_integer(unsigned(selector)) <= '1';
        else
            new_q1 <= q1;
        end if;
    end process;
    value <= q1(to_integer(unsigned(selector));
end behaviour;

版本2:

entity memory is
   port(
    clk : in std_logic;
    reset : in std_logic;
    selector : in std_logic_vector(5 downto 0);
    write : in std_logic;
    value : out std_logic
    );
end memory;

architecture behaviour of memory is
    signal q1 : std_logic_vector(63 downto 0);
begin
    process(clk, reset) is
        begin
        if( clk'event AND clk = '1') then
            if(reset = '1') then
                q1 <= (others => '0');
            else
                if(write = '1') then
                    q1(to_integer(unsigned(selector)) <= '1';
                else
                    ....
                end if;
            end if;
        end if;
    end process;

    value <= q1(to_integer(unsigned(selector));
end behaviour;

版本3:

entity memory is
   port(
    clk : in std_logic;
    reset : in std_logic;
    selector : in std_logic_vector(5 downto 0);
    write : in std_logic;
    value : out std_logic
    );
end memory;

architecture behaviour of memory is
    signal q1 : std_logic_vector(63 downto 0);
begin
    process(clk, reset) is
        begin
        if( clk'event AND clk = '1') then
            if(reset = '1') then
                q1 <= (others => '0');
            else
                q1 <= new_q1;   

            end if;
        end if;
    end process;

    process(q1, write) is
        if(write = '1') then
            if(unsigned(selector) < 63) then
                new_q1 <= q1(63 downto to_integer(unsigned(selector))) & '1' & q1(to_integer(unsigned(selector)) downto 0);
            else
                new_q1 <= '1' & q1(to_integer(unsigned(selector)) downto 0);
            end if;
        else
            new_q1 <= q1;
        end if;
    end process;

    value <= q1(to_integer(unsigned(selector));
end behaviour;

1 个答案:

答案 0 :(得分:0)

基于端口列表中提到的一些有关操作的假设,设计可能如下所示。由于尺寸和特殊功能,在FPGA中的实现很可能是使用触发器而不是内部存储器实现的,因此名称memory可能会误导人。

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

entity memory is
  port(
    clk      : in std_logic;
    reset    : in std_logic;  -- Synchronous, assumed to be applied initially
    selector : in std_logic_vector(5 downto 0);
    write    : in std_logic;  -- Write set bit only, synchronous
    value    : out std_logic  -- Read value, asynchronous
    );
end memory;

architecture behaviour of memory is
  signal q1 : std_logic_vector(63 downto 0);
begin

  -- Reset and write set, synchronous
  process (clk) is
  begin
    if (clk'event and clk = '1') then  -- Rising clock
      if (reset = '1') then  -- Reset, synchronous
        q1 <= (others => '0');  -- Clear all bits
      elsif (write = '1') then  -- Write to set for selector bit
        q1(to_integer(unsigned(selector))) <= '1';  -- Set single bit
      end if;
    end if;
  end process;

  -- Read, asynchronous
  value <= q1(to_integer(unsigned(selector)));  -- Read single bit

end behaviour;