我试图在VHDL中使用矩阵,这是我到目前为止所做的:
type MAT is array ( 7 downto 0 ) of bit_vector( 9 downto 0);
signal MAT_WORD:MAT:= (others=>X"00");
signal BREAKCODe :NATURAL:=0;
for I in 9 downto 0 loop
if(MAT_WORD(I) = x"88") then
BREAKCODE <= I;
end if ;
end loop;
............
我得到的错误是:
Implicit array operator "=" always returns FALSE (left length 10 is not equal to right length 8
任何想法如何使用循环或矩阵作为一个8列和10行?
答案 0 :(得分:1)
我认为你混淆了维度。您定义了一个包含8个元素(7 downto 0)
的矩阵,其中每个元素都存储一个10位向量(9 downto 0)
。
在for循环中,您只能遍历元素并针对10位向量检查每个元素。例如:
process(MAT_WORD)
begin
BREAK_CODE <= 0; -- move initialization here or the following
-- must be encapsulated into a clocked process
for i in 7 downto 0 loop -- order may be important
if MAT_WORD(i) = "0010001000" then -- x"88" with two '0' prepended
BREAK_CODE <= i;
end if;
end loop;
end process;
同样在MAT_WORD
的初始化中,您必须分配10位向量,例如
signal MAT_WORD:MAT:= (others=> "0000000000");
或更通用:
signal MAT_WORD:MAT:= (others=> (others => '0'));
答案 1 :(得分:1)
到目前为止,您收到的答案提供了点点滴滴,部分原因是您的代码不是Minimal, Complete, and Verifiable example。
标准版本问题有一个全面的答案,否则Matthew Sainsbury的答案是适用于-2008兼容的模拟器和综合工具。在IEEE Std 1076-2008,15.8位字符串文字中,添加了一个整数值的选项长度前缀,允许在基数X为0的情况下填充结果位串,其长度大于下一位提供的值字符串文字值。
代替-2008工具,您可以使用连接(这是在-2008中按长度“拉伸”位字符串文字的方式)或在有限数量的情况下使用others
选项进行聚合(并且没有这些案例存在于下面的例子中:
entity engine is
end entity;
architecture foo of engine is
type MAT is array ( 9 downto 0 ) of bit_vector( 9 downto 0);
signal MAT_WORD: MAT := (others => ( others => '0'));
signal BREAKCODE: NATURAL := 0;
begin
MAT_WORD(5) <= "00" & x"88";
SCAN:
process(MAT_WORD)
begin
BREAKCODE <= 0; -- when no "0010001000" occurs, clear BREAKCODE
for I in MAT_WORD'range loop
if MAT_WORD(I) = "00" & x"88" then
BREAKCODE <= I;
end if;
end loop;
end process;
NARK:
process (BREAKCODE)
begin
if BREAKCODE > 0 then
report "MAT_WORD(" & integer'image(BREAKCODE) &
") = ""00"" & x""88""";
end if;
end process;
end architecture;
以上代码分析,阐述和运行:
ghdl -a engine.vhdl
ghdl -e引擎
ghdl -r引擎
engine.vhdl:27:13:@ 0ms :(报告说明):MAT_WORD(5)=“00”&amp; x“88”
您可以看到它报告并发信号分配写入的位置。
请注意,您的代码中还有一个错误,即您在循环语句中声明I
的范围,其范围9 downto 0
超出了类型MAT
的范围。这已通过使用更正MAT
的范围进行了更正。 (循环常量I
已被修改为使用声明对象的范围,允许您在一个位置更改矩阵的大小。)
您还可以使用不完整的类型声明:
type MAT is array (natural range <>) of bit_vector (9 downto 0);
并在对象声明中指定范围:
signal MAT_WORD: MAT (9 downto 0) := (others => (others => '0'));
在类型声明中修复范围似乎更合适。
答案 2 :(得分:0)
这不是数据宽度问题吗? MAT_WORD(I)
是10位宽,对吗? x"88"
是0x88
的十六进制常量,是一个八位常数。
尝试
if (MAT_WORD(I) = 10x"88")
我不是VHDL用户,对不起,如果这是完全错误的
编辑:修改后的代码,用于添加新的10x"88"
语法
答案 3 :(得分:0)
正如Brian所说,您需要与10位值进行比较,因为您的矩阵由10位bit_vector
的数组组成。
您要比较的十六进制文字x"88"
只有8位长,因此错误。
请尝试使用if(MAT_WORD(I) = "10001000")
- "10001000"
作为x"88"
的二进制表示形式。
如果你可以使用VHDL 2000,你有另一种选择 - 使用一个大小的文字,例如10x"088"
。
此外,当9 downto 0
数组定义为MAT_WORD
时,您正在循环7 downto 0
...