Vivado VHDL宽度不匹配-如何修复它? 请考虑这个非常简单的最小可重复代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity test is generic ( LENGTH : integer range 1 to 16 := 5 ); Port ( x : in STD_LOGIC; y : out STD_LOGIC_VECTOR(15 downto 0) ); end test; architecture Behavioral of test is signal a : std_logic_vector (15 downto 0); signal b : std_logic_vector (LENGTH - 1 downto 0); signal i : integer range 0 to LENGTH-1 := 1; begin y <= a; process begin if i = LENGTH then i <= 1; else a <= a(15 downto i + 1) & b(i downto 0); end if; i <= i + 1; end process; end Behavioral;

Vivado VHDL宽度不匹配-如何修复它? 请考虑这个非常简单的最小可重复代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity test is generic ( LENGTH : integer range 1 to 16 := 5 ); Port ( x : in STD_LOGIC; y : out STD_LOGIC_VECTOR(15 downto 0) ); end test; architecture Behavioral of test is signal a : std_logic_vector (15 downto 0); signal b : std_logic_vector (LENGTH - 1 downto 0); signal i : integer range 0 to LENGTH-1 := 1; begin y <= a; process begin if i = LENGTH then i <= 1; else a <= a(15 downto i + 1) & b(i downto 0); end if; i <= i + 1; end process; end Behavioral;,vhdl,vivado,Vhdl,Vivado,我真的不明白为什么。无论如何,整个范围将是15-(i+1)+(i-0)=15。。。0并适合16位的输出——20位的交易是什么 我应该说,如果我使用普通常量而不是I,问题(显然)就会消失,但我仍然不知道发生了什么。对于运行时变量I(根据问题) 您可以使用I的值来生成掩码,并计算(a和MASKA)或(B和MASKB),而不是大箱。这相当于合成工具在没有损坏的情况下生成的多路复用器 对于通用I(在评论中移动球门柱是不公平的!) 这种方法会产生不必要的硬件,任何有能力的综合工具都会对其进行优化 (当然,

我真的不明白为什么。无论如何,整个范围将是
15-(i+1)+(i-0)=15。。。0
并适合16位的
输出
——20位的交易是什么

我应该说,如果我使用普通常量而不是
I
,问题(显然)就会消失,但我仍然不知道发生了什么。

对于运行时变量I(根据问题)

您可以使用I的值来生成掩码,并计算
(a和MASKA)或(B和MASKB)
,而不是大箱。这相当于合成工具在没有损坏的情况下生成的多路复用器

对于通用I(在评论中移动球门柱是不公平的!)

这种方法会产生不必要的硬件,任何有能力的综合工具都会对其进行优化


(当然,这段代码还有其他问题;我认为您删除了时钟,使MCVE的概念有点过分。您应该将其保留为有效的可合成代码)

vivado的可变位切片一直被破坏。你可能需要在i上做一个case语句,并用常量输入每个case。@技巧:哦,那太可惜了,因为实际上
i
是一个泛型,我可能还需要为此指定15个组合。所以这完全是一个维瓦多的问题?你能告诉我这是否可以以不同的方式实现,同时实现相同的功能吗?这不是一个,没有实体声明,没有上下文子句,
i
也不是一个通用常量。在表达式
b(i向下至0)
中,范围为0到15的整数
i
不是
b
的有效索引时,没有12个值。如果
i
使用通用常量,则可以将其范围限制为
b
,并且
a
b
切片的索引将是全局静态的,不会导致合成问题。您的“最小可复制代码”和您的注释“
i
是泛型”是不一致的。@newuser如果
i
确实是泛型的,那么就不会有问题。@newuser您的代码仍然不是MCVE。进程缺少敏感列表或等待语句。答案或注释Brian?@user1155120从一个开始,发展到另一个。我的直觉是,OP基本上知道他在做什么,不需要一个完整的解决方案,但却被一个工具错误弄得偏离了轨道。如果你不同意,请随意投反对票或添加答案。a(15到i+1)总是“U”。缺少一个简单的例子,它不能向未来的读者展示一个实际问题或解决方案。长度是通用的而不是i,没有它,每个切片长度都需要遮罩。IEEE Std 1076.6-2004(RTL合成,撤销,8.3.2.1阵列类型,要求静态离散范围)的历史解决方案将是
对于n=0到长度-1的回路,如果n=i,则a
[Synth 8-690] width mismatch in assignment; target has 16 bits, source has 20 bits