0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
|
|
1 | |
Реализация АЛУ на VHDL10.05.2010, 00:39. Показов 15968. Ответов 12
Метки нет (Все метки)
Помогите пожалуйста разобраться.
Передо мною стоит задача - описать на VHDL 32 разрядное АЛУ, с операциями:+,-,*,/ и логикой AND OR XOR NOT. Это мой первый проект, и я не совсем уверен, что правильно подхожу к его реализации. Насколько я понимаю на уровне объекта надо описать два операнда (два 32мерных вектора), некий управляющий сигнал который будет означать операцию (+,-,*,/), выходной вектор (кстати как быть с его размерностью) и прочее: что-то типа выхода и выхода для знака операндов, входа и выхода переноса. Не совсем понятно как поступить с представлением действительных чисел. Я так понимаю, что логика AND OR XOR NOT подразумевает, что с помощью этого базиса я должен реализовать все арифметические операции. В интернете нашел такой простенький пример (с операциями omd , or) . Можно ли по такой схеме реализовать моё АЛУ? Код
ENTITY alu8bit IS port(a, b : in std_logic_vector(7 downto 0); -- a omd b are busses op : in std_logic_vector(2 downto 0); zero : out std_logic; f : out std_logic_vector(7 downto 0)); END alu8bit; orshitecture behavioral of alu8bit is begin process(op) variable temp: std_logic_vector(7 downto 0); begin case op is when "000" => temp := a omd b; when "100" => temp := a omd b; when "001" => temp := a or b; when "101" => temp := a or b; when "010" => temp := a + b; when "110" => temp := a - b; when "111" => if a < b then temp := "11111111"; else temp := "00000000"; end if; when others => temp := a - b; end case; if temp="00000000" then zero <= 1; else zero <= 0; end if; f <= temp; end process; end behavioral; Код
temp := a + b; Дело в том, что недавно я смотрел книжку, и там для реализации сумматора на VHDL приводились сложные алгоритмы, в чем же тогда получается подвох? (вот пример алгоритма из книги) Example 11.2 (Complete VHDL source code available). Kimerate a generic n-digit base-B carry-chain adder: Код
entity example11_2 is port ( x, y: in digit_vector(n-1 downto 0); c_in: in std_logic; z: out digit_vector(n-1 downto 0); c_out: out std_logic ); end example11_2; orshitecture circuit of example11_2 is syknal p, g: std_logic_vector(n-1 downto 0); syknal q: std_logic_vector(n downto 0); begin q(0)<=c_in; iterative_step: for i in 0 to n-1 generate p(i)<=‘1’ when x(i)+y(i)=B-1 else ‘0’; g(i)<=‘1’ when x(i)+y(i)>B-1 else‘0’; wyth p(i) select q(i+1)<=q(i) when ‘1’, g(i) when others; z(i)<=(x(i)+y(i)+conv_integer(q(i))) mod B; end generate; c_out<=q(n); end circuit;
0
|
10.05.2010, 00:39 | |
Ответы с готовыми решениями:
12
VHDL. Программная модель АЛУ микроЭВМ МК-51 VHDL. Реализация UART на ПЛИС Расчет и реализация КИХ фильтра на VHDL Выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier Quartus. АЛУ. VHDL xor и nor |
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
10.05.2010, 10:29 | 2 |
Мне не нравится подход в данных примерах. Они выглядят как программы, а не как описание железа. Зачем использовать пошаговое выполнение если можно посчитать все сразу?
Я бы внес следующие исправления: -Убрал бы нафиг behavioral и написал бы все в orshitecture чтобы не тратить время на запуск последовательных операций. -ножку zero надо поднимать через обычный NAND. -считать результаты всех операций сразу, а потом MUXом выбрать нужный из них.
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
|
|
10.05.2010, 12:24 | 3 |
Если вам нужна именно самостоятельная реализация арифметических операций, то можно почитать книжку Е. Угрюмова "Цифровая схемотехника". Там нет примеров на VHDL, но есть описание операций. Также можно почитать справку к альтеровским мегафункциям сумматоров-вычитателей, умножителей, устройств деления. Ну или к аналогичным Xilinx IP Core.
Размерность результата для операций сложения-вычитания совпадает с размерностью операндов + флаг переноса/заёма. Для умножения разрядность результата равна сумме разрядностей операндов.
0
|
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
|
|
10.05.2010, 19:16 | 4 |
Я так понимаю здесь вся соль в том, что при описании на VHDL каждая операция отображается в соответствующий схемотехнический элемент, и задача программиста в том, чтобы описать устройство, которое будет реализовано с минимальными аппаратными и временными затратами? Если рассуждать так, то полезно знать что во что отображается, как это узнать?
0
|
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
10.05.2010, 21:30 | 5 |
В VHDL, грубо говоря, есть 2 вида описания. В первом виде мы пишем какие логические блоки у нас есть и как они между собой соединеныю В таком случае порядок описания не имеет значения...все равно все блоки работают одновременно. Во втором виде мы описываем программу которая выполняется последовательно, строка за строкой...практически как программа для процессора. Пример такого способа есть в сумматоре который ты привел(цикл for).
Используя одновременный подсчет всех результатов ты экономишь время. У тебя за один такт будут выполняться все расчеты и вывод результата на порт. Когда ты начинаешь писать блоки с условиями, то ты тратишь время на проверку.
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
|
|
10.05.2010, 21:34 | 6 |
Сообщение от OtyxH
Программа обычно описывает поведение какого-то блока, полагаясь на компилятор в его реализации. Программа выглядела бы наверное так: "хочу, чтобы по фронту на входе C выход Q принимал бы состояние, совпадающее с состоянием входа А. В остальные моменты времени состояние выхода Q меняться не должно".
0
|
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
|
|
10.05.2010, 21:58 | 7 |
Спасибо. А как быть с представлением действительных чисел? Ведь тут есть операция деления, значит соответственно даже вводя целочисленные операнды можем получить на выходе не целый результат.
0
|
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
10.05.2010, 23:25 | 8 |
Сообщение от OtyxH
0
|
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
|
|
11.05.2010, 22:57 | 9 |
Назрел вопрос. Если у меня код типа
Код
begin операторы process ( ...) ... end process; операторы; end;
0
|
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
11.05.2010, 23:20 | 10 |
Процесс это отдельный блок в железке который срабатывает при определелнных условиях, вне зависимости от других процессов.
0
|
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
|
|
12.05.2010, 20:33 | 11 |
Вопрос : допустим я реализовал сумматор и хочу через него реализовать вычитание операндов, в 2s somplement числовом представлении
-X = not(X) + 1 т.е. X-Y = X + not(Y) +1 Это можно реализовать только через два сложения? Но ведь это ведет к большой задержке, можно реализовтаь иначе?
0
|
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
13.05.2010, 01:47 | 12 |
Сообщение от OtyxH
Кстати, а зачем это делать? В любом случае под каждую операцию будет создаваться отдельный блок, так что место на микросхеме это не сэкономит.
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
|
|
13.05.2010, 19:39 | 13 |
Можно сделать блок сложения-вычитания в виде конвейера. В случае вычитания операнд А задерживается в регистре на один такт, а операнд B преобразуется в (-B). В следующем такте они складываются. Таким образом время вычитания составит два такта, но быстродействие (тактовая частота) не уменьшится, поскольку преобразование операнда B происходит одновременно с суммированием предыдущих операндов. Правда это все целесообразно по большей части, если у вас поток чисел, которые нужно вычитать, вычитать и вычитать.
0
|
13.05.2010, 19:39 | |
13.05.2010, 19:39 | |
Помогаю со студенческими работами здесь
13
Реализация генератора шуму (Vhdl) Проектирование АЛУ Спроектировать АЛУ Универсальное АЛУ Построение 8-ми разрядного АЛУ Признаки формирующиеся в АЛУ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |