Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/86: Рейтинг темы: голосов - 86, средняя оценка - 4.99
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86

[VHDL] Реализация 32-разрядного АЛУ

10.05.2010, 00:39. Показов 16251. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобраться.
Передо мною стоит задача - описать на VHDL 32 разрядное АЛУ, с операциями:+,-,*,/ и логикой AND OR XOR NOT. Это мой первый проект, и я не совсем уверен, что правильно подхожу к его реализации. Насколько я понимаю на уровне объекта надо описать два операнда (два 32мерных вектора), некий управляющий сигнал который будет означать операцию (+,-,*,/), выходной вектор (кстати как быть с его размерностью) и прочее: что-то типа выхода и выхода для знака операндов, входа и выхода переноса. Не совсем понятно как поступить с представлением действительных чисел.
Я так понимаю, что логика AND OR XOR NOT подразумевает, что с помощью этого базиса я должен реализовать все арифметические операции. В интернете нашел такой простенький пример (с операциями omd , or) . Можно ли по такой схеме реализовать моё АЛУ?

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
Но тут тоже не все ясно. Вот в этой строчке
Code
1
temp := a + b;
он просто складывает два двоичных числа, для меня это не совсем понятно.
Дело в том, что недавно я смотрел книжку, и там для реализации сумматора на VHDL приводились сложные алгоритмы, в чем же тогда получается подвох? (вот пример алгоритма из книги)

Example 11.2 (Complete VHDL source code available). Kimerate a generic
n-digit base-B carry-chain adder:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2010, 00:39
Ответы с готовыми решениями:

Схема 4-разрядного АЛУ
Люди, помогите, пожалуйста, построить схему 4-разрядного АЛУ. Вообще не представляю, как он должен выглядеть

Построение 8-ми разрядного АЛУ
Требуется построить 8-ми разрядное АЛУ, выполняющее операции сложения и вычитания операндов в двоичном доп. (не суть важно, можно и прямом...

[VHDL] Программная модель АЛУ микроЭВМ МК-51
Котаны хелп! Сижу на экзамене, ничего не понимаю Приведите результаты работы модуля арифтически-логического устройства выполняющего...

12
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
10.05.2010, 10:29
Мне не нравится подход в данных примерах. Они выглядят как программы, а не как описание железа. Зачем использовать пошаговое выполнение если можно посчитать все сразу?
Я бы внес следующие исправления:
-Убрал бы нафиг behavioral и написал бы все в orshitecture чтобы не тратить время на запуск последовательных операций.
-ножку zero надо поднимать через обычный NAND.
-считать результаты всех операций сразу, а потом MUXом выбрать нужный из них.
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
10.05.2010, 12:24
Если вам нужна именно самостоятельная реализация арифметических операций, то можно почитать книжку Е. Угрюмова "Цифровая схемотехника". Там нет примеров на VHDL, но есть описание операций. Также можно почитать справку к альтеровским мегафункциям сумматоров-вычитателей, умножителей, устройств деления. Ну или к аналогичным Xilinx IP Core.

Размерность результата для операций сложения-вычитания совпадает с размерностью операндов + флаг переноса/заёма. Для умножения разрядность результата равна сумме разрядностей операндов.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
10.05.2010, 19:16
Я так понимаю здесь вся соль в том, что при описании на VHDL каждая операция отображается в соответствующий схемотехнический элемент, и задача программиста в том, чтобы описать устройство, которое будет реализовано с минимальными аппаратными и временными затратами? Если рассуждать так, то полезно знать что во что отображается, как это узнать?
Размерность результата для операций сложения-вычитания совпадает с размерностью операндов + флаг переноса/заёма. Для умножения разрядность результата равна сумме разрядностей операндов.
Что для каждой операции разные выходы делать?
Они выглядят как программы, а не как описание железа.
А как выглядит описание железа?
считать результаты всех операций сразу, а потом MUXом выбрать нужный из них.
А если мне надо только одну операцию выполнить зачем считать все сразу?
-Убрал бы нафиг behavioral и написал бы все в orshitecture чтобы не тратить время на запуск последовательных операций.
Я думал, что behavioral это название архитектуры, разве не так? Если так то смысл не совсем понятен. Поясните пожалуйста.
0
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
10.05.2010, 21:30
В VHDL, грубо говоря, есть 2 вида описания. В первом виде мы пишем какие логические блоки у нас есть и как они между собой соединеныю В таком случае порядок описания не имеет значения...все равно все блоки работают одновременно. Во втором виде мы описываем программу которая выполняется последовательно, строка за строкой...практически как программа для процессора. Пример такого способа есть в сумматоре который ты привел(цикл for).
Используя одновременный подсчет всех результатов ты экономишь время. У тебя за один такт будут выполняться все расчеты и вывод результата на порт. Когда ты начинаешь писать блоки с условиями, то ты тратишь время на проверку.
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
10.05.2010, 21:34
Цитата Сообщение от OtyxH
...при описании на VHDL каждая операция отображается в соответствующий схемотехнический элемент... Если рассуждать так, то полезно знать что во что отображается, как это узнать?
VHDL придумали, чтобы сделать описание аппаратуры более формальным, но наглядность от этого пострадала. Описание внутренних связей в виде текста вызывает аналогии с языками программирования процессоров, а это совсем другая степь. Начинать лучше с графических схем. Например, сначала нужно узнать как строится сумматор на логических элементах (как там И, ИЛИ, триггеры между собой соединяются, что в итоге операнды в результат превращаются), а потом уже понять, что строка c <= a + b превратится в кристалле именно в такую вот уже изученную конструкцию. Как на VHDL дать понять компилятору, какое именно устройство вы от него хотите, обычно пишут в desykn guides, которые можно найти на сайтах производителей.

Что для каждой операции разные выходы делать?
Для пользователя вашего черного ящика (ну или АЛУ) выход может быть один. В зависимости от вида операции он только будет иметь разный смысл. Но внутри черного ящика, как вам тут писали будет несколько различных устройств, выходы которых будут подключаться к внешнему выходу при необходимости. Но устройства эти в любом случае нужно реализовать все, так как суммирование, умножение и деление - операции очень разные по реализации.

А как выглядит описание железа?
Железо описывается так: "хочу, чтобы был синхронный D-триггер с прямым динамическим управление. К его информационному входу хочу чтоб подключался внешний вход А, а к входу синхронизации - внешний вход С. Неинвертирующий выход триггера хочу, чтоб подключался к внешнему выводу Q". Описана структура.
Программа обычно описывает поведение какого-то блока, полагаясь на компилятор в его реализации. Программа выглядела бы наверное так: "хочу, чтобы по фронту на входе C выход Q принимал бы состояние, совпадающее с состоянием входа А. В остальные моменты времени состояние выхода Q меняться не должно".
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
10.05.2010, 21:58
Спасибо. А как быть с представлением действительных чисел? Ведь тут есть операция деления, значит соответственно даже вводя целочисленные операнды можем получить на выходе не целый результат.
0
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
10.05.2010, 23:25
Цитата Сообщение от OtyxH
Спасибо. А как быть с представлением действительных чисел? Ведь тут есть операция деления, значит соответственно даже вводя целочисленные операнды можем получить на выходе не целый результат.
Это уже зависит от задания. Можно выводить только целую часть результата, можно выводить результат с фиксированой точкой, можно с плавающей точкой....тебе скорее всего нужен первый.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
11.05.2010, 22:57
Назрел вопрос. Если у меня код типа
Code
1
2
3
4
5
6
7
begin
операторы
process ( ...)
...
end process;
операторы;
end;
допустим исполняются операторы вне процесса и срабатывает процесс. Он будет исполняться параллельно вместе с этими операторами или какая последовательность выполнения операторов будет?
0
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
11.05.2010, 23:20
Процесс это отдельный блок в железке который срабатывает при определелнных условиях, вне зависимости от других процессов.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 86
12.05.2010, 20:33
Вопрос : допустим я реализовал сумматор и хочу через него реализовать вычитание операндов, в 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
Цитата Сообщение от OtyxH
Вопрос : допустим я реализовал сумматор и хочу через него реализовать вычитание операндов, в 2s somplement числовом представлении
-X = not(X) + 1
т.е.
X-Y = X + not(Y) +1
Это можно реализовать только через два сложения? Но ведь это ведет к большой задержке, можно реализовтаь иначе?
Я не уверен, но думаю что при синтезе две операции будут оптимизированы в одну логическую функцию.
Кстати, а зачем это делать? В любом случае под каждую операцию будет создаваться отдельный блок, так что место на микросхеме это не сэкономит.
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 39
13.05.2010, 19:39
Можно сделать блок сложения-вычитания в виде конвейера. В случае вычитания операнд А задерживается в регистре на один такт, а операнд B преобразуется в (-B). В следующем такте они складываются. Таким образом время вычитания составит два такта, но быстродействие (тактовая частота) не уменьшится, поскольку преобразование операнда B происходит одновременно с суммированием предыдущих операндов. Правда это все целесообразно по большей части, если у вас поток чисел, которые нужно вычитать, вычитать и вычитать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2010, 19:39
Помогаю со студенческими работами здесь

Реализация двоичного 8-разрядного дешифратора (Atmega16)
РЕАЛИЗОВАТЬ ДВОИЧНЫЙ 8 РАЗРЯДНЫЙ ДЕШИФРАТОР 3 ВХОДА 8 ВЫХОДОВ стенд STK500 AVR AMEGA16 ASSEMBLER ,программа вроде бы должна быть...

VHDL. Реализация UART на ПЛИС
Добрый день. Была поставлена задача реализовать передачу данных через UART (com порт) интерфейс rs-232 передачу данных (чисел) с ПК на...

[VHDL] Реализация протокола SPI
Добрый вечер! Это мой первый пост на форуме, поэтому если что не так сильно не бейте))). Пытаюсь реализовать на VHDL работу протокола SPI....

Quartus. АЛУ. VHDL xor и nor
Всем привет, для АЛУ нужен VHDL код операций XOR и NOR. Если у кого есть готовый код для этих операций, выручайте. Облазил пол гугла, но...

[VHDL] Разработать структурную модель n-разрядного регистра
Помогите пожалуйста, никак не могу сделать( Мне бы хоть пример такого задания, решенный, что бы я по разбирался в нем. Используя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru