我有一个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;
RAM中存在哪些输入和输出可能会根据您打算如何使用它而有所不同。如果RAM真的存在于FPGA芯片本身上,那么一个例子就是你想在一个Xilinx Block RAM库组件上使用一个简单的单端口RAM。
从代码中可以看出,sdram是在FPGA顶层实现的(RAM包含在fpga芯片中),看来RAM的输入/输出也应该是顶层的输入/输出。如果sdram在FPGA之外(因此超出FPGA的最高级别),它将被颠倒过来
通常,RAM往往是至少需要的顺序元素:
- 时钟(通常为1位宽信号)
- 一个地址(往往是log2(n)位宽,其中n是RAM数组的大小。所以如果数组有64个元素,你需要至少6位才能解决所有问题。相同的地址信号可能是用于读取和写入,或者您可能有2个单独的地址信号。)
- 写使能(最简单的可能是1位信号。最典型的用法是将该信号置位1个时钟周期,以更新地址信号当前地址的数据)
-data(宽度会有所不同,并且往往在FPGA上灵活/可配置。如果你想在每个RAM条目中存储16位数据应该是完全有效的。这可以是单个信号或2个单独的信号用于读取和写数据)。
只要进出RAM的信号向量至少具有这些基本功能,看起来你应该至少可以使用它作为一个简单的RAM。请注意,在代码中,sdram_ *信号既未声明也未连接到sdram实例本身以外的任何其他信号。