2017-01-04 14 views
0

Мне нужно сделать арифметическую логическую единицу в VHDL для pic16f684. Таким образом, инструкции для ALU можно найти в техническом описании pic16f684.Сделать арифметическую логическую единицу в vhdl

Инструкции мне нужно сделать следующие:

These are the instructions

Это мой код до сих пор, но я получаю, что вполне логично, ошибка, что std_logic_vector не может иметь характер в векторе, но я не знаю, как это сделать другим способом.

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.all; 
USE IEEE.STD_LOGIC_ARITH.all; 
USE IEEE.STD_LOGIC_UNSIGNED.all; 

ENTITY AluPIC IS 

    PORT( -- Input Signals  
     Op_code  : in std_logic_vector(6 DOWNTO 0); 
     win, fin  : in std_logic_vector(7 DOWNTO 0); 
     -- Output Signals 
     d,z : out std_logic; 
     ALU_output : out std_logic_vector(7 DOWNTO 0)); 


END AluPIC; 

ARCHITECTURE behavior OF AluPIC IS 
     -- declare signal(s) internal to module here 
SIGNAL temp_output,wout,fout: std_logic_vector(7 DOWNTO 0); 

BEGIN 
    PROCESS (Op_code, win, fin) 
    BEGIN 
     -- Select Arithmetic/Logical Operation 
    CASE Op_Code (6 DOWNTO 0) IS 
     WHEN "000111d" => 
      if d ='0' then 
       wout <= win + fin; 
       temp_output <=wout; 
      else 
       fout <= win + fin; 
       temp_output <= fout; 
      end if; 

     WHEN "000101d" => 
      if d ='0' then 
       wout <= win and fin; 
       temp_output <= wout; 
      else 
       fout <= win and fin; 
       temp_output <= fout; 
      end if; 

     WHEN "000001l" => 
      fout <= fin; 
      fout <= "00000000"; 
      z <= '1'; 
      temp_output <= fout; 

     WHEN "001010d" => 
      fout <= fin+1; 
      if d = '0' then 
       wout <= fout; 
       temp_output <=wout; 
      else 
       fout <= fout; 
       temp_output <=fout; 
      end if; 

     WHEN "001000d" => 
     if d = '0' then 
      wout <= fin; 
      temp_output <= wout; 
      z <= '1'; 
     else 
      fout <= fin; 
      temp_output <= fout; 
      z <= '1'; 
     end if; 

     WHEN "0101bbb" => 
      fout <= fin; 
      temp_output <= fout; 
     WHEN OTHERS => 
      temp_output <= "00000000"; 
    END CASE; 
      -- Select Shift Operation 
    IF Op_Code(0) = '1' THEN 
      -- Shift bits left with zero fill using concatination operator 
      -- can also use VHDL 1076-1993 shift operator such as SLL 
     Alu_output <= temp_output(6 DOWNTO 0) & '0'; 
    ELSE 
     Alu_output <= temp_output; 
    END IF; 
    END PROCESS; 
END behavior; 

Спасибо за ваше время, ребята!

ответ

0

Линии как WHEN "000111d" => или WHEN "0101bbb" => не действительны, потому что ваш case оператор использует std_logic_vector, но "000111d" строка.

Не ясно, что вы пытаетесь достичь с помощью d и b персонажей, но ваши различные when линии должны сравнить с допустимым std_logic_vector правильной длины, например WHEN "0000111" =>.

Рассматривая образ вашего op-кода, он отображает таблицу с строками, содержащими операции, например «ADDWF». В этих операциях только самые важные 6 бит, кажется, выбирают операцию, причем младший значащий бит обозначается b или d. Этот младший бит фактически является параметром для операции, а не частью кода операции. В таблице не показано, какой эффект имеет действие d, но вы, похоже, все это сделали. Использование ADDWF в качестве примера, я хотел бы изменить свой код так:

CASE Op_Code (6 DOWNTO 1) IS 
    WHEN "000111" => 
    if Op_Code(0) ='0' then 
     wout <= win + fin; 
     temp_output <=wout; 
    else 
     fout <= win + fin; 
     temp_output <= fout; 
    end if; 
    -- ... 
end case; 

«BSF» операция является исключением, так как он использует младшие 3 бита в качестве параметра. Вы можете написать это либо с помощью оператора выбора соответствия, или путем перечисления всех возможностей в одном случае:

Matching случай, требующий VHDL2008:

CASE? Op_Code (6 DOWNTO 1) IS 
    WHEN "0101--" => 
    -- Set a bit based on `op_code (2 downto 0)` 
end case?; 

Список всех возможностей:

CASE Op_Code (6 DOWNTO 1) IS 
    WHEN "010100" | "010101" | "010110" | "010111" => 
    -- Set a bit based on `op_code (2 downto 0)` 
end case; 
+0

Ye так это было ясно, но как я могу решить это по-другому? Потому что, если вы посмотрите на инструкции, используется 01bb и как я могу поместить эти инструкции в std_logic_vector? – Faalhaaz

+0

Вы должны более подробно ознакомиться с руководствами по ПОС, чтобы понять, что они означают 'bb' или' d', и внести соответствующие изменения. –

+0

ok @Faalhaaz Я думаю, что понял вопрос, посмотри мое редактирование. –