4-битный ALU с использованием VHDL, показывающий ошибку: нет объявлений функций для операторов "+" ("-", "*" и "/") - PullRequest
0 голосов
/ 10 сентября 2018

Когда я компилирую этот код, используя ghdl, он выдает ошибки.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity alu is

 generic ( constant N: natural := 1 );     

       port( a,b : in std_logic_vector(3 downto 0);
             sel : in std_logic_vector(3 downto 0);
             y : out std_logic_vector(3 downto 0);
             x: out std_logic_vector(7 downto 0);
             cout : out std_logic);
end alu;


architecture behavioral of alu is
signal rslt : std_logic_vector(3 downto 0);
signal tmp :  std_logic_vector(4 downto 0);
begin


process(a,b,sel)


begin

case sel is

        when "0000"=>

         rslt<= a + b;        -- Line 33
         when "0001"=>
         rslt<= a - b;        -- Line 35
          when "0010"=>
          x<= (unsigned(a)) * (unsigned(b)); -- Line 37
          when "0011"=>
          x<=(unsigned(a)) / (unsigned(b));   -- Line 39
          when "0100"=>
         rslt<=std_logic_vector(unsigned(a) sll N);
          when "0101"=>
         rslt<=std_logic_vector(unsigned(a) srl N);
         when "0110"=>
         rslt<=std_logic_vector(unsigned(a) rol N);
          when "0111"=>
         rslt<=std_logic_vector(unsigned(a) ror N);
          when "1000"=>
         rslt<= a and b;
          when "1001"=>
         rslt<= a or b;
           when "1010"=>
         rslt<= a xor b;
           when "1011"=>
         rslt<= a xnor b;
           when "1100"=>
         rslt<= a nand b;
           when "1101"=>
         rslt<= a nor b;
            when "1110"=>
               if (a > b) then
                     rslt<= "0001";
                else
                    rslt<="0000";
                end if;
          when "1111"=>
               if (a = b)then
                    rslt<="0001";
               else
                    rslt<="0000";
               end if;
          when others=> 
                 rslt<= "0000";
       end case;
   end process;

y<=rslt;
tmp<= ('0' & a) + ('0' & b);     -- Line 78
cout<=tmp(4);
end behavioral;

ghdl -a alu.vhdl
alu.vhdl: 33: 19: ошибка: нет объявлений функций для оператора "+"
alu.vhdl: 35: 19: ошибка: нет объявлений функций для оператора "-"
alu.vhdl: 37: 29: ошибка: нет объявлений функций для оператора "*"
alu.vhdl: 39: 28: ошибка: нет объявлений функций для оператора "/"
alu.vhdl: 78: 17: ошибка: нет объявлений функций для оператора "+"

При использовании арифметики без знака, как я могу сделать эти операторы доступными?

1 Ответ

0 голосов
/ 11 сентября 2018

Добро пожаловать в Stackoverflow. Вы, очевидно, не очень знакомы с типизированными языками. VHDL - это типизированный язык, в котором переменные, сигналы, константы имеют тип, например bit, integer, std_logic_vector(3 downto 0) или unsigned(3 downto 0). И эти типы определяют, что можно сделать, а что нет.

  1. По умолчанию вы не можете добавить два std_logic_vector(3 downto 0) и получить результат, который также равен std_logic_vector(3 downto 0). Это то, что вы пытаетесь сделать с rslt<= a + b;. Компилятор просто говорит вам, что такого оператора "+" не видно.
  2. То же самое для rslt<= a - b; с оператором "-".
  3. x<= (unsigned(a)) * (unsigned(b)); немного лучше, потому что вы не пытались умножить два std_logic_vector(3 downto 0). Вы конвертировали их в unsigned(3 downto 0). Хороший выбор, потому что пакет ieee.numeric_std перегружает оператор "*" для типов unsigned(...). К сожалению, вы пытаетесь присвоить результат std_logic_vector(7 downto 0), в то время как оператор ieee.numeric_std."*" возвращает unsigned(7 downto 0). Итак, и здесь компилятор снова жалуется, что не находит подходящего оператора "*". Примечание: скобки не нужны. Вы могли бы просто написать unsigned(a) * unsigned(b).
  4. Остальные ошибки оставлены необъясненными в качестве упражнения.

Я предлагаю вам еще раз прочитать книгу VHDL и понять, какие это типы, какие операции определены по умолчанию для типов std_logic_vector(...) и unsigned(...) и какие дополнительные операции определены для тех же типов двумя пакетами, которые вы объявить (ieee.std_logic_1164 и ieee.numeric_std).

...