gpt4 book ai didi

vhdl - 双向总线上的 Block RAM

转载 作者:行者123 更新时间:2023-12-04 18:19:15 28 4
gpt4 key购买 nike

我花了很长时间试图弄清楚如何将 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
);

谁能给我看一个可以连接 dina的进程 block 和 doutainout名为 data 的端口?

我尝试了以下方法,成功率为 0%:
process(clk)
begin
if rising_edge(clk) then
if r_w = "1" then
-- Write
din <= data;
dout <= temp;
else
-- Read
din <= (others => 'Z');
data <= dout;
end if;
end if;
end process;

谢谢您的帮助!

最佳答案

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

现在,无论是否存在真正的三态,为了连接单向dinadouta到“双向”data ,您需要一些信号来控制内存何时驱动。由于我们已经有了短名称,我们就叫它 oe用于“输出使能”。这个信号需要由您的设计以一种有意义的方式控制。

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

dina <= data;
data <= douta when oe = '1' else (others => 'Z');

关于vhdl - 双向总线上的 Block RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024722/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com