2013-06-05 3 views
-1

Я пытаюсь создать 32-битный двоичный серийный сумматор в VHDL, используя структурное описание. Сумматор должен использовать полный сумматор и d-защелку. Как я вижу это:Двоичный серийный сумматор - VHDL

Полный сумматор:

architecture Behavioral of FullAdder is 
begin 

s <= (x xor y) xor cin; 
cout <= (x and y) or (y and cin) or (x and cin); 
end Behavioral; 

D-защелкой:

architecture Behavioral of dLatch is 
begin 
state: process(clk) 
begin 
    if(clk'event and clk = '1') then 
     q <= d; 
    end if; 
end process; 
end Behavioral; 

Последовательный сумматор:

add: process (clk) 
    variable count : integer range 0 to 31; 
     variable aux : STD_LOGIC; 
     variable aux2 : STD_LOGIC; 
    begin 
     if(clk'event and clk = '1') then 
     fa: FullAdder port map(x(count), y(count), aux, s(count), aux2); 
        dl: dLatch port map(clock, aux2, aux); 
     count := count + 1; 
    end if; 
    end process; 

Однако, как представляется, не Работа. Также был бы самый простой способ конвейерного последовательного сумматора?

+0

Немного трудно проверить без деклараций сущности, поскольку вы использовали позиционное отображение сигналов в порты. Я рекомендую использовать именованное сопоставление портов (pinname => signal_name). Вы создали симуляцию? Если этого не сделать. Если у вас есть, используйте его, чтобы объяснить нам, что означает «это не работает» означает - что вы ожидали увидеть? Что вы на самом деле видели? –

ответ

0

«Кажется, это не работает» довольно общий, но одна проблема, которую я вижу, заключается в том, что вы пытаетесь создать экземпляр компонента fa: FullAdder в процессе. Подумайте о том, что означает компонентный экземпляр в аппаратном обеспечении, и вы поймете, что нет смысла создавать экземпляр модуля на методе raise_edge clk ...

Переместить экземпляр процесса из процесса, и он должен по крайней мере удалить синтаксис вы должны видеть ошибку («Незаконное последовательное утверждение» в ModelSim).

0

Для конвейерной обработки последовательного сумматора наилучшим способом является подключение сумматоров и d триггеров один за другим. Таким образом, у вас будет бит первого первого сумматора, который будет вводить триггер. Результатом этого триггера станет cin следующего сумматора и так далее. Однако будьте осторожны, потому что вам также придется конвейерно сжимать каждый сумматор, а также каждый бит ввода, по существу, помещая несколько d-триггеров подряд, чтобы скопировать их через различные этапы конвейера.

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