2016-03-09 3 views
-1

Мне нужно создать 32-битный ALU с функцией alu и сумматором/Sub, shifter и компаратором. , когда функция alu равна 0001, она переходит в сумматор, , когда функция alu равна 0010, она переходит к sub, , когда функция alu равна 1001, она переходит к логическим сдвигам влево b-alu bits, , когда функция alu равна 1010, это переходит к логическим сдвигам вправо b-alu и так далее.VHDL 32-битный код ALU

У меня уже есть 32-разрядный сумматор/младший и 32-разрядный код переключения.

пакет c31L_pack является

library ieee; 
use ieee.std_logic_1164.all; 

package c31L_pack is 
constant ZERO   : std_logic_vector(31 downto 0) := 
    "00000000000000000000000000000000"; 
constant ONES   : std_logic_vector(31 downto 0) := 
    "11111111111111111111111111111111"; 


constant BW : integer:=32; 
constant SEL3 : integer:=3; 
constant SEL1 : integer:=1; 
constant OP : integer:=16; 
constant reg_field: integer:=6; 
constant immediate_size: integer:=15; 


subtype alu_function_type is std_logic_vector(3 downto 0); 

constant alu_nop      : alu_function_type := "0000"; 
constant alu_add      : alu_function_type := "0001"; 
constant alu_sub      : alu_function_type := "0010"; 
constant alu_comp      : alu_function_type := "0011"; 
constant alu_slt       : alu_function_type := "0100"; 
constant alu_and      : alu_function_type := "0101"; 
constant alu_or        : alu_function_type := "0110"; 
constant alu_not      : alu_function_type := "0111"; 
constant alu_xor      : alu_function_type := "1000"; 
constant alu_shift_logic_left  : alu_function_type := "1001"; 
constant alu_shift_logic_right  : alu_function_type := "1010"; 
constant alu_shift_arith_left  : alu_function_type := "1011"; 
constant alu_shift_arith_right  : alu_function_type := "1100"; 
constant alu_mov  : alu_function_type := "1101"; 

type mux_in_16 is array((OP-1) downto 0) of std_logic_vector(BW-1 downto 0); 
type mux_in_2 is array(1 downto 0) of std_logic_vector(BW-1 downto 0); 
end; 

1 бит:

library ieee; 
use ieee.std_logic_1164.all; 
entity adder1 is 
port(a   : in std_logic; 
    b   : in std_logic; 
    cin  : in std_logic; 
    sum_def : out std_logic; 
    carry_borrow : out std_logic); 
end; 

architecture logic of adder1 is 

begin 

process(a,b,cin) 

begin 

sum_def <=a xor b xor cin; 
carry_borrow<=(a and b) or (a and cin) or (b and cin); 

end process; 
end architecture; --architecture logic 

и 32 бит сумматор/суб

library ieee; 
use ieee.std_logic_1164.all; 
use work.c31L_pack.all; 

entity adder32 is 
port(a3_32 : in std_logic_vector(BW-1 downto 0); 
    b3_32 : in std_logic_vector(BW-1 downto 0); 
     cin : in std_logic; 
     sub : in std_logic; 

     sum_32 : out std_logic_vector(BW-1 downto 0); 
     cout : inout std_logic; 
     ov : out std_logic); 
end; 

architecture logic of adder32 is 

component adder1 
port(a   : in std_logic; 
    b   : in std_logic; 
    cin  : in std_logic; 

    sum_def : out std_logic; 
    carry_borrow : out std_logic); 
end component; 

for add1: adder1 use entity work.adder1(logic); 

signal carry_i :std_logic_vector(BW-2 downto 0):=(others=>'0'); 
signal xor_out :std_logic_vector(BW-1 downto 0):=(others=>'0'); 
signal oz :std_logic; 

begin 


Exclusive_or:for i in BW-1 downto 0 generate 
begin 
xor_out(i)<=b3_32(i) xor sub after 19ns; 
end generate; 


add1: adder1 port map(a=>a3_32(0),b=>xor_out(0),cin=>sub,sum_def=>sum_32(0),carry_borrow=>carry_i(0)); 
add_2_31 : for i in 1 to BW-2 generate 
    add1 :adder1 port map(a=>a3_32(i),b=>xor_out(i),cin=>carry_i(i-1),sum_def=>sum_32(i),carry_borrow=>carry_i(i)); 
end generate; 
add32: adder1 port map(a=>a3_32(BW-1),b=>xor_out(BW-1),cin=>carry_i(BW-2),sum_def=>sum_32(BW-1),carry_borrow=>cout);   

oz<=carry_i(BW-2) xor cout after 19 ns; 
with oz select 
ov <= 'Z' when "1", 
    '0' when "0"; 
end architecture; --architecture logic 

Я пытаюсь получить все результаты после использования, что найти выход код функции, я получил много ошибок, я пытаюсь найти способ решить это. Что мне делать? Спасибо за вашу помощь. Я просто хочу сначала добавить добавление и sub, чтобы я знал, что мне делать.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use work.c31L_pack.all; 

ENTITY alu32 IS 
GENERIC (BW : INTEGER :=32); 
PORT (a_alu32 : in STD_LOGIC_VECTOR (BW -1 downto 0); 
    b_alu32 : in STD_LOGIC_VECTOR (BW -1 downto 0); 
    alu_op : in alu_function_type ; 
    g : out STD_LOGIC ; 
    e : out STD_LOGIC ; 
    l : out STD_LOGIC ; 
    o_alu32 : out STD_LOGIC_VECTOR (BW -1 downto 0); 
    c_alu32 : inout STD_LOGIC ; 
    ov_alu32 : out STD_LOGIC); 
end alu32; 

architecture Behavioral of alu_32 is 

component adder32 
port(a3_32 : in std_logic_vector(BW-1 downto 0);-<std_logic_vector> is not declared. 
b3_32 : in std_logic_vector(BW-1 downto 0);-<std_logic_vector> is not declared. 
    cin : in std_logic;-<std_logic> is not declared. 
    sub : in std_logic;-<std_logic> is not declared. 

    sum_32 : out std_logic_vector(BW-1 downto 0); 
    cout : inout std_logic; 
    ov : out std_logic); 
    end component; 

signal o1:std_logic_vector(BW-1 downto 0); 
signal c1:std_logic; 
signal ov1:std_logic; 
signal o2:std_logic_vector(BW-1 downto 0); 
signal c2:std_logic; 
signal ov2:std_logic; 

begin 
adder32 port map(a3_32=>a_alu32,b3_32=>b_alu32,cin=>"0",sub=>"1",sum_32=>o1,cout=>c1,ov=>ov1); 
adder32 port map(a3_32=>a_alu32,b3_32=>b_alu32,cin=>"0",sub=>"0",sum_32=>o2,cout=>c2,ov=>ov2); 

end Behavioral; 

ошибка массаж: ОШИБКА: HDLCompiler: 374 Строка 37: Entity еще не составлен.

ОШИБКА: HDLCompiler: 69 Строка 40: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 41: не объявлена.

ОШИБКА: HDLCompiler: 69 Линия 42: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 43: не объявлена.

ОШИБКА: HDLCompiler: 69 Линия 45: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 46: не объявлена.

ОШИБКА: HDLCompiler: 69 Линия 47: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 50: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 51: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 52: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 53: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 54: не объявлена.

ОШИБКА: HDLCompiler: 69 Строка 55: не объявлена.

ОШИБКА: HDLCompiler: 806 Строка 58: Синтаксическая ошибка рядом с портом.

ОШИБКА: HDLCompiler: 806 Строка 59: Синтаксическая ошибка около ";".

+0

Ваш код не анализирует как предусмотрено. Выбранное назначение сигнала отсутствует в выборе других или должно быть кондиционировано 'с To_Bit (oz) выбрать ov <= 'Z', когда« 1 »,« 0 », когда« 0 »;» или условное назначение сигнала. Обратите внимание на «1» и «0» вместо «1» и «0». «Z» означает высокий импеданс. Вопросы, связанные с обзором кода, должны быть отправлены в [Обзор кода стека Exchange] (https://codereview.stackexchange.com/questions/tagged/vhdl) (с пометкой vhdl). Что производит и каков должен быть результат? И несмотря на то, что Modelsim разрешает ему пространство - 19ns нарушает правила синтаксиса, используйте 19 нс. – user1155120

+1

Вычитая b из a, использует дополнение двух b (не b и инвертирует LSB). Для сравнения может потребоваться два выхода (равные и больше, равные и меньше или больше и меньше). Вы не показали ничего, что демонстрирует сдвиг, для которого вы выбираете между выводом сумматора и результатом сдвига на основе операции. Показать полный набор операций. – user1155120

+0

@ user1155120 Текущий код не работает и, следовательно, вне темы в Code Review. Однако, как только он работает, OP более чем приветствуется, чтобы прийти и отказаться от его кода для проверки. VHDL не является популярным тегом, поэтому убедитесь, что вопрос выше среднего или он не привлечет большого внимания. – Mast

ответ

0

ALU по определению имеет два входа данных: a и b, ввод кода функции и выход состояния, а также выход результата. Это приведет к определению сущности, как

entity alu is 
generic 
(
    width  : integer 
); 
port 
(
    a   : in std_logic_vector(width - 1 downto 0); 
    b   : in std_logic_vector(width - 1 downto 0); 
    fc   : in fc_t; 
    status  : out sc_t; 
    result  : out std_logic_vector(width downto 0) 
); 

(что выглядит совсем по-другому).

Дополнительно к этому, вы будете нуждаться в двух перечисленных типов для кодирования состояния и код функции:

type fc_t is (fc_add, fc_add, fc_shift, fc_compare); 
type sc_t is (sc_ne, sc_eq, sc_err); 

Я оставляю архитектуру для вас (у вас уже есть большинство из них, вам просто нужно положить это в нужном месте).

Смежные вопросы