Операция сравнения VHDL не определена с помощью счетчика циклов - PullRequest
0 голосов
/ 15 марта 2019

Я пытался создать микросхему SRAM в vhdl с произвольным количеством регистров и размером регистров, используя дженерики, и я почти заставил его работать, за исключением части адресации.

Чтобы создать чип SRAM произвольного размера, я начал с создания ячейки SRAM (которую я протестировал, чтобы убедиться, что она работает) со следующей картой портов.

component SRAM_Cell_vhdl
port (
        IN : in std_ulogic;
        Select_Chip : in std_ulogic;
        Write_Enable : in std_ulogic;
        Out1 : out std_ulogic
);

Универсальный чип SRAM имеет следующую карту портов:

port (
    Datain : in std_logic_vector(m-1 downto 0);
    address: in std_logic_vector(n-1 downto 0);
    Chip_Select: in std_logic;
    Output_Enable: in std_logic;
    Write_Enable: in std_logic;
    Out2: out std_logic_vector(m-1 downto 0)
);

Способ, которым я пытаюсь выполнить адресацию, заключается в том, что когда он генерирует SRAM, он проверяет, равен ли счетчик цикла адресу. Если это так, он запишет бит в ячейку SRAM, если нет, то не будет.

  loop1: for I in 0 to n-1 generate
    loop2: for J in 0 to m-1 generate
            SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map
                (Datain(J), Chip_Select and (I = to_integer(unsigned(address))), Write_Enable and Chip_Select, intermediate_out(I, J));
        end generate loop2;
    end generate loop1;

Однако при I = to_integer(unsigned(address))) я получаю сообщение о том, что не может определить определение операции "=". Я думал, что счетчик цикла - это целое число, и при преобразовании адреса в целое число следует сравнивать два целых числа. Другой способ, которым я думал об этом, - использовать оператор if, сравнивающий I и адрес, но я боюсь, что он не сгенерирует все необходимые ячейки SRAM.

Есть ли способ решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Оператор = возвращает логическое значение.Таким образом, выражение

Chip_Select and (I = to_integer(unsigned(address)))

, когда ассоциируется с портом ввода типа std_ulogic, требует версии оператора and с входом типа std_ulogic, входтипа boolean и возвращаемого значения типа std_ulogic.(Этот список типов называется подпись ).Такой версии оператора and не существует.

Существует версия оператора and с двумя входами типа std_ulogic и возвращаемым значением типа std_ulogic.Итак, чтобы использовать это, ваш компилятор пытается найти версию оператора =, которая возвращает std_ulogic.Такой версии не существует.Отсюда ваша ошибка.

Решение этой проблемы не является простым, потому что вам понадобится массив сигналов выбора микросхемы.Итак, вам понадобится что-то вроде этого (поскольку MCVE нет, я не проверял):

loop1: for I in 0 to n-1 generate
  loop2: for J in 0 to m-1 generate
    if Chip_Select = '1' and (I = to_integer(unsigned(address))) then
      CS(I)(J) <= '1';
    else
      CS(I)(J) <= '0';
    end if;
    SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map (Datain(J), CS(I)(J), Write_Enable and Chip_Select, intermediate_out(I, J));
  end generate loop2;
end generate loop1;

, где CS - это какой-то массив std_ulogic.

0 голосов
/ 15 марта 2019

Во-первых, ваш код не MCVE . Было бы более полезно, если бы это было. Я думаю, что нижеприведенная альтернатива должна работать.

loop1: for I in 0 to n-1 generate
  loop2: for J in 0 to m-1 generate

    signal2 <= Write_Enable and Chip_Select;

    check1: if (I = to_integer(unsigned(address))) generate
      signal1 <= Chip_Select and std_ulogic(unsigned(address));      
    end generate check1;

    SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map (Datain(J), signal1 , signal2 , intermediate_out(I, J));

  end generate loop2;
end generate loop1;

Кроме того, я бы предпочел использовать именованную ассоциацию , а не позиционную ассоциацию в port map

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...