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

在结构VHDL ROM中,如何使多个字线驱动输出?,vhdl,xilinx,synthesis,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:

我正在用结构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> 
它使用的6个tribuffers如下所示:

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;
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层深的树也不切实际。我要做什么才能使VHDL与此兼容

更新:
我应该澄清几件事。Xilinx 9.2是这门课的必备品,因为它是免费的,而且我的大学学费便宜。唯一的基本门(and,or,not,nand,tristate)可以是行为的,其他一切都必须是结构性的。我用C语言为它生成了VHDL,因为如果不是这样的话,那将需要大量的输入。

因为你使用的是std_逻辑向量而不是std_逻辑向量,所以多个源驱动“数据线”信号是合法的。它是有效的VHDL,在仿真中应该可以很好地工作。我想这足以让任务获得批准

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


还请注意,无论是FPGA还是ASIC,显式延迟(等待、之后)都是不可合成的。

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

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


还请注意,显式延迟(wait-for,after)是不可合成的,无论是FPGA还是ASIC。

如果希望合成此延迟,那么最好只编写OR树的代码

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

请参阅此线程:


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

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

请参阅此线程:


看起来您实际上是在用多个信号源驱动某种内部信号,但是,它存在于生成的代码中。你说你的解码器是用程序生成的:为什么?我相信您可以使用generate语句或类似的语句来实现这一点,而且有符号和无符号的包也非常有用:请尝试类似于word_enable“0”的方法;word_enable(conv_integer(adr))您是否正在尝试合成三态缓冲区的模型?尝试从您的型号中删除120ps之后的
。您的目标设备是什么?Xilinx 9.2-那太老了!我应该澄清几件事。Xilinx 9.2是这门课的必备品,因为它是免费的,而且我的大学学费便宜。唯一的基本门(and,or,not,nand,tristate)可以是行为的,其他一切都必须是结构性的。这是我用C语言为其生成VHDL的ROM,因为如果不是这样的话,需要大量的输入。看起来你实际上是在用多个源驱动某种内部信号,但是,它在你生成的代码中。你说你的解码器是用程序生成的:为什么?我相信您可以使用generate语句或类似的语句来实现这一点,而且有符号和无符号的包也非常有用:请尝试类似于word_enable“0”的方法;word_enable(conv_integer(adr))您是否正在尝试合成三态缓冲区的模型?尝试从您的型号中删除120ps之后的
。您的目标设备是什么?Xilinx 9.2-那太老了!我应该澄清几件事。Xilinx 9.2是这门课的必备品,因为它是免费的,而且我的大学学费便宜。唯一的基本门(and,or,not,nand,tristate)可以是行为的,其他一切都必须是结构性的。这是我用C语言为其生成VHDL的ROM,因为如果不是这样的话,将需要大量的输入。内部三态缓冲区将自动解析为xilinx和altera tools中具有默认设置的多路复用结构…你说得对!很抱歉,这似乎确实有效。我想这终究是有可能合成的。可能是延迟导致了错误。显然,在应该合成的代码中不应该出现定时约束,但除此之外,我会冒险猜测在静态分析中识别多个源信号,也就是说,无论如何都不涉及定时。我很确定问题出在地址解码器上,我也很确定应该可以将其简化为一些非常小且可调试的东西。。