我有一个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;
答案 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实例本身以外的任何东西。