在结构VHDL ROM中,如何将多个字线驱动输出?

时间:2012-10-04 20:03:10

标签: vhdl xilinx synthesis

我正在为一类我的结构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是该课程的必修课,因为它是免费的,我的大学很便宜。唯一的基本门(和,或者,不是,nand,三态)可以是行为,其他一切都必须是结构性的。我在C中为我生成了VHDL的ROM,因为否则会输入大量的内容。

2 个答案:

答案 0 :(得分:1)

如果您希望综合这个,那么您最好只编写OR树的代码。

我所知道的没有(当前)设备会对内部三态感到满意。合成器会阻塞(如你所见),或者将它(或多或少地静默地)转换为多路复用树给你。

见这个帖子:

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

答案 1 :(得分:-1)

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

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

另请注意,显式延迟(等待,之后)无法合成,无论是FPGA还是ASIC。