我正在为一类我的结构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,因为否则会输入大量的内容。
答案 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。