如何将数据分配给内部输入端口

时间:2019-04-12 14:00:34

标签: input port vhdl assign

我有一个FPGA试图将值读/写到同一芯片上的SDRAM。 sdram看到的是IN,顶级看到的是OUT,否则为。 SDRAM“路径”被实例化并带到顶层。这些路径没有方向。但是,我知道顶层读写sdram。我尝试了所示代码的变体并进行了编译。下面的代码是将两个值传递到SDRAM并读取第三个值的示例。我已经为路径指定了方向。我的逻辑是否正确,因为它发送两个值并接收第三个值?

使用IEEE.STD_LOGIC_UNSIGNED.ALL; -请参阅使用VHDL进行电路设计的第36页

port(
    -- ---------------------------------------------------------------------
    -- Global signals ------------------------------------------------------

    CLK   : in std_logic;
    RESET : in std_logic;

      A       : out std_logic_vector(15 downto 0);
      B       : out std_logic_vector(15 downto 0);
      C       : in  std_logic_vector(15 downto 0);

最终实体sigma_k_top;

function_top的架构rtl是

signal cntr     : std_logic_vector(31 downto 0);
signal sig_A    : std_logic_vector(15 downto 0);
signal sig_B        : std_logic_vector(15 downto 0);
signal sig_C        : std_logic_vector(15 downto 0);

开始

sdram_inst : entity work.sdram

port map (
    CLK               => sdram_CLK_in, --CLK shared by all
    A                 => sdram_A_in, -- Write to sdram
    B                 => sdram_B_in,--  Write to sdram
    C                 => sdram_C_out, --Read from sdram
);

 transfer: process(CLK)
 begin
    IF rising_edge(CLK) then
        cntr <= cntr + 1;
        if cntr = 1000 then -- 
            sig_A  <= "1000000000000000";
            sig_B  <= "1000000000000000";
        end if;             

        if cntr = 1001 then
            if  C(0) = '1' then
                sig_A  <= sig_A - 1; -- Writing 
                sig_B  <= sig_B + 1; -- Writing
                xfer   <= C ;        -- Reading 
            end if;
        end if;
        if cntr > 2000 then
            cntr <= (others => '0');
        end if;

    END IF;

 end process;

-- -------------------------------------------------------------------------
-- Top-level ports ---------------------------------------------------------


 TEST_LED(7 downto 0)   <= xfer(7 downto 0); -- Making some sdram output visible
 A <= sig_A; -- Sending value to sdram
 B <= sig_B; -- Sending value to sdram

结束架构rtl;

1 个答案:

答案 0 :(得分:0)

RAM上存在哪些输入和输出,取决于您打算如何使用它。如果RAM确实存在于FPGA芯片本身上,则可能是您想在Xilinx Block RAM库组件上使用简单的单端口RAM。

从代码中可以看出,sdram被实例化在FPGA的顶层之下(RAM包含在fpga芯片中),似乎RAM的输入/输出也应该是顶层的输入/输出。如果该sdram在FPGA外部(从而在FPGA的顶层之外),则将相反。

通常,RAM通常是至少需要以下内容的顺序元素:

-一个时钟(通常为1位宽的信号)

-地址(通常为log2(n)位宽,其中n是RAM阵列的大小。因此,如果该阵列具有64个元素,则至少需要6位来寻址所有内容。同一地址信号既可以用于读写,也可以有两个单独的地址信号。)

-写使能(最简单的方式是1位信号。最典型的用途是在1个时钟周期内置位该信号,以更新地址信号当前地址上的数据)

-data(宽度可能会有所不同,并且在FPGA上往往是灵活的/可配置的。如果要在每个RAM条目中存储16位数据,这些数据应该是完全有效的。这可以是单个信号或2个单独的信号)用于读取和写入数据。

只要进出RAM的信号向量至少具有这些基本功能,看来您应该至少可以将其用作简单的RAM。请注意,在您的代码中,sdram_ *信号既未声明,也未连接到sdram实例本身以外的任何东西。