在VHDL中使用矩阵

时间:2015-11-10 11:06:09

标签: vhdl

我试图在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行?

4 个答案:

答案 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 ...