我知道inout参数是什么以及如何使用它们。假设我们有一个inout参数io
并且想要创建一个双向静态RAM,如下面的代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY sram IS
port(
clk : IN std_logic;
wr : IN std_logic;
io : INOUT std_logic;
addr : IN INTEGER RANGE 0 TO 7
);
END sram;
ARCHITECTURE behavioral OF sram IS
TYPE matrix IS ARRAY (0 TO 7) OF std_logic;
SIGNAL mem : matrix;
BEGIN
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
IF wr = '1' THEN
mem(addr) <= io;
END IF;
END IF;
END PROCESS;
io <= mem(addr) WHEN wr = '0' ELSE 'Z';
END behavioral;
我们可以创建一个sram实例并在其上写,如下面的代码:
io <= '1' WHEN wr = '1' ELSE 'Z';
问题:综合工具如何控制多个分配并在多个驱动程序之间进行判断?实现了哪些硬件?
感谢您的评论和回答...
答案 0 :(得分:2)
对于典型的FPGA和ASIC器件,三态功能的实现仅适用于IO,例如在Altera Arria 10 FPGA中:
因此,对于此类器件,内部RAM始终使用专用输入和输出端口实现,因此不使用任何内部三态功能。
即使RAM连接到支持三态的外部IO,内部RAM块通常仍然使用专用的输入和输出端口创建,因此通过输入输出来处理与设备上的三态引脚的连接具有输出使能和三态功能的缓冲器。
如果设备不支持内部设计尝试使用三态功能或多个驱动程序,那么综合工具将生成并出错,通常说同一网络不支持多个驱动程序。
答案 1 :(得分:2)
在Xilinx器件上,原理图类似。
这是原始IOBUF的图像:
绿色部分是三态控制的输出驱动器;蓝色部分是输入驱动程序。完整的IOB(输入/输出块)由几个原语组成:
如何合成?
使用Xilinx XST时,可以在顶层下方使用三态总线(端口方向=输入)。 XST将报告它添加了(虚拟)三态缓冲区。如果总线的每个位的方向具有明显的方向且没有多个驱动器问题,则会对这些缓冲区进行修整。
这在iSim中不起作用。