【问题标题】:How do I assign data to an internal input port如何将数据分配给内部输入端口
【发布时间】:2019-04-12 14:00:34
【问题描述】:

我有一个 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;

【问题讨论】:

    标签: input port vhdl assign


    【解决方案1】:

    RAM 的输入和输出可能因您打算如何使用而有所不同。如果 RAM 确实存在于 FPGA 芯片本身上,例如您想在 Xilinx Block RAM 库组件上使用简单的单端口 RAM。

    从代码中可以看出,sdram 是在 FPGA 的顶层下实例化的(RAM 包含在 fpga 芯片中),看来 RAM 的输入/输出也应该是顶层的输入/输出.如果 sdram 在 FPGA 之外(因此在 FPGA 的顶层之外),它会被反转

    一般来说,RAM 往往是顺序元素,至少需要:

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

    -一个地址(通常是 log2(n) 位宽,其中 n 是 RAM 数组的大小。因此,如果数组有 64 个元素,则至少需要 6 位来寻址所有内容。相同的地址信号可用于读取和写入,或者您可能会有 2 个单独的地址信号。)

    -A 写使能(最简单的可能是 1 位信号。最典型的用途是将该信号置位 1 个时钟周期以更新地址信号当前地址处的数据)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2018-05-30
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多