双向总线上的Block RAM

时间:2012-06-13 23:21:10

标签: vhdl xilinx synthesis

我正试图弄清楚如何将Xilinx Spartan 6 FPGA的核心生成Block RAM连接到双向数据总线。我能找到的所有例子都说只是单独使用输入和输出数据端口,但在我的情况下,我被迫将它用作双向数据总线。

我正在使用VHDL。

生成的组件具有以下定义:

COMPONENT ram
    PORT (
       clka  : IN STD_LOGIC;
       wea   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
       addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       dina  : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
    );
END COMPONENT;

实例化如下:

ram1 : ram
  PORT MAP (
    clka => clk,
    wea => r_w,
    addra => addr,
    dina => din,
    douta => dout
  );

有人可以向我显示一个流程块,它会将dinadouta连接到名为inout的{​​{1}}端口吗?

我尝试了以下内容,取得了0%的成功:

data

感谢您的协助!

2 个答案:

答案 0 :(得分:3)

首先,重要的是要了解现代FPGA内部(例如您正在讨论的Xilinx Spartan-6),真正没有任何真正的双向路由。实际双向/三态信号只能用于I / O引脚。可以模拟内部双向/三态信号,但这通常仅用于与传统HDL接口,而不是用于任何新的。

现在,无论是否存在真正的三态,为了将单向dinadouta连接到“双向”data,您需要一些信号来控制当记忆是否开车时。由于我们已经有了短名称,我们只需将其称为“{1}}”即“输出启用”。这个信号需要以有意义的方式由您的设计控制。

鉴于此,您可以将不同方向的两个单向信号加上输出启用方向选择器转换为逻辑双向数据总线,并使用以下并发代码( 一个过程):

oe

答案 1 :(得分:1)

if r_w = "1"区块中,您似乎正在尝试驾驶dout信号,该信号应由端口douta驱动。这可能解释了一个问题(除非temp都是'Z')。

请注意以下事项:我现在没有任何东西可以测试它,所以这一切都是我的头脑。如果它没用,请告诉我!

我不认为同步过程是解决这个问题的最佳方法。我已经有一段时间需要这样做了,但这就是我认为你需要的东西。请注意,它不是一个过程,它在架构中正确。

din <= data when (r_w = '1') else (others => 'Z');
data <= dout when (r_w = '0') else (others => 'Z');

说明:当多个信号源驱动(或分配)信号时,除了其中一个信号之外的所有信号都必须为“Z”。第二行将data设置为由'Z'驱动 - 但实际上“释放它”(从解析器的角度来看)由端口驱动。

如果你确实需要这个同步,这应该是微不足道的 - 但要记住'0''1'不是std_logic唯一可能的情况,所以想一想else块中的others子句或case