2

我正在为我的一类用结构化 VHDL 编写 ROM。该设计采用 6 位地址并通过 6 到 64 二进制解码器运行它。每个解码器输出启用或禁用由三态反相器组成的单个 6 位字线。每个位的字线位输入要么是“1”,要么是“0”。最重要的是,每个字线都写入相同的输出向量。

当我检查 Xilinx 9.2 中的语法时,它很好,但是当我合成时,我得到了这个错误:

ERROR:Xst:528 - Multi-source in Unit <ufm6bit> on signal <N0>
Sources are: 
   Output signal of BUFT instance <rom/word63rom/tri0/Z>
   Output signal of BUFT instance <rom/word62rom/tri0/Z> 
   Output signal of BUFT instance <rom/word...rom/tri0/Z> 
   Output signal of BUFT instance <rom/word00rom/tri0/Z> 

我使用了一个程序来编写解码器 VHDL,因此端口映射太大而无法放在这里(如果需要,可以将其放在 pastebin 上)。字线如下所示:

entity tribuffer6 is
  PORT (
    A : in  std_logic_vector(5 downto 0);
    E : in  std_logic;
    Z : out std_logic_vector(5 downto 0));
end tribuffer6;

它使用的 6 个 tribuffers 如下所示:

entity tribuffer is
  Port ( A : in  std_logic;
         E : in  std_logic;
         Z : out std_logic);
end tribuffer;

architecture Behav of tribuffer is
begin

  z <= not a after 120 ps when e = '1' else
         'Z' after 120 ps;

end Behav;

最后,字线是这样绑起来的:

SIGNAL dataline : std_logic_vector(5 downto 0);

word00rom : tribuffer6 PORT MAP (
                         A=>"000000",
                         Z=>dataline,
                         E=>word00en );
word01rom : tribuffer6 PORT MAP (
                         A=>"000000",
                         Z=>dataline,
                         E=>word01en );

从错误中可以明显看出,VHDL 对在那条线上有多个驱动程序不满意,但是我无法制作 64 个缓冲区向量并将它们链接在一起来阻止检查。64 层深的 OR 树也不实用。我该怎么做才能让 VHDL 能够接受这个?

更新:我应该澄清一些事情。Xilinx 9.2 是课程的必需品,因为它是免费的,而且我的大学很便宜。唯一的基本门(and,or,not,nand,tristate)可以是行为的,其他一切都必须是结构的。这是我用 C 语言生成 VHDL 的 ROM,因为否则会需要大量输入。

4

2 回答 2

1

如果您希望合成它,那么您最好只为 OR-tree 编写代码。

我知道没有(当前)设备会对内部三态感到满意。合成器要么会窒息(就像你的那样),要么将它(或多或少无声地)转换为你的多路复用器树。

看到这个线程:

http://forums.xilinx.com/t5/Spartan-Family-FPGAs/What-is-BUFT-in-this-RTL/td-p/111838

于 2012-10-05T12:31:15.533 回答
-1

由于您使用的是 std_logic_vector 而不是 std_ulogic_vector,因此多个源驱动“数据线”信号是合法的。它是有效的 VHDL,应该可以在仿真中正常工作。我想这足以让任务获得批准。

FPGA 通常没有内部三态缓冲器。也就是说,在您尝试合成的 FPGA 中没有值“Z”的概念。(但是,它们通常在引脚上有三态缓冲器,因此可以将输出引脚驱动到“Z”。)这就是您的综合失败的原因。如果您可以访问 ASIC 的综合工具(例如 Synopsys 设计编译器),您可以尝试使用它,这很可能会奏效。

另请注意,对于 FPGA 和 ASIC,显式延迟(等待、之后)是不可综合的。

于 2012-10-05T09:22:07.320 回答