Перейти к содержанию
    

Проектирование быстрого умножения Бута на VHDL

Доброго времени суток!

Спроектировал в среде Quartus на языке VHDL алгоритм быстрого умножения Бута.

Входы: 2 однобайтовых регистра, числа без знака;

Выход: 1 двухбайтовый регистр, без знака.

Алгоритм на VHDL работает, проверку произвожу в ModelSim. Код алгоритма:

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.numeric_std.all;

-- Описание точек входа и выхода ПЛИС (описание интерфейса) 
entity but_element is
port( -- Конфигурация портов ввода-вывода
	input_1: in std_logic_vector (7 downto 0);  -- Множимое
	input_2: in std_logic_vector (7 downto 0);  -- Множитель
	output: out std_logic_vector (15 downto 0)  -- Произведение		
	);
end but_element;
-- Конце описания интерфейса ПЛИС

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.numeric_std.all;

-- Описание точек входа и выхода умножителя (описание интерфейса) 
-- operand_1 - Множимое - целое беззнаковое число размерностью 1 байт
-- operand_2 - Множитель - целое беззнаковое число размерностью 1 байт
-- result - Произведение - целое беззнаковое число размерностью 2 байта
entity but is
port( -- Конфигурация портов ввода-вывода
	operand_1: in std_logic_vector (7 downto 0);  -- Множимое
	operand_2: in std_logic_vector (7 downto 0);  -- Множитель
	result: out std_logic_vector (15 downto 0)  -- Произведение
	);
end but;
-- Конце описания интерфейса умножителя

-- Описание архитектуры элементов, входящих в умножитель
architecture but_model of but is 

begin		
-- Описание параллельного процесса 
process (operand_1, operand_2)

variable R1: std_logic_vector (7 downto 0); -- Внутренняя переменная "Множимое"
variable R2: std_logic_vector (7 downto 0); -- Внутренняя переменная "Множитель"
variable R3: std_logic_vector (7 downto 0); -- Регистр со старшими разрядами проиведения
variable C1: std_logic;
variable C2: std_logic;
variable Reg: std_logic_vector (17 downto 0); -- Общий сдвиговый регистр на 18 разрядов
variable counter: integer range 0 to 16; -- Счетчик

begin	
	-- Обнуление и инициализация всех переменных
	C1 := '0';
	C2 := '0';
	R1 := operand_1;
	R2 := operand_2;
	R3 := "00000000";
	Reg := R3&R2&C1&C2;
	counter := 9;

	while counter > 0 loop
		Reg(16 downto 0) := Reg(17 downto 1); -- арифметический сдвиг вправо на 1 разряд
		if Reg(1) = '0' then -- Проверка C2 = 0
			if Reg(0) = '1' then -- Проверка С1 = 1
				-- Сложение R3 + R1
				Reg(17 downto 10) := Reg(17 downto 10) + R1;
			end if;
		elsif Reg(0) = '0' then
				-- Вычитание R3 - R1
				Reg(17 downto 10) := Reg(17 downto 10) - R1;
		end if;
		-- Счетчик
		counter := counter - 1;
	end loop;
	-- Запись результата в выходной регистр
	result <= Reg(17 downto 2);

end process;
-- Конец описания параллельного процесса
end but_model;
-- Конец описания архитектуры

architecture plis of but_element is -- архитектура всего устройства
  component but  -- умножитель как компонент
    port (
		operand_1: in std_logic_vector (7 downto 0);  -- Множимое
		operand_2: in std_logic_vector (7 downto 0);  -- Множитель
		result: out std_logic_vector (15 downto 0)  -- Произведение
    );
  end component;

begin
   mb: but -- описание работы умножителя
   port map (operand_1=>input_1,operand_2=>input_2,result=>output);
end plis;

 

Проблема заключается в том, что функциональная схема, которую генерирует Quartus получается очень сложной и запутанной, из нее не понятно ничего,

привожу скриншот схемы:

Скриншот функциональной схемы quartus

 

т.е. на схеме разбросаны сумматоры и какие-то двухбитные регистры..

ОДно из требования к этой курсовой работе - это функциональная схема должна быть проще.

Я впервые работаю с Quartus, и впервые пишу на VHDL,

Возможно я делаю что-то принципиально не правильно?

 

Сейчас пытаюсь переопределить внутренние переменные, переделать variable в signal:

 

signal R1: std_logic_vector (7 downto 0); -- Внутренняя переменная "Множимое"
signal R2: std_logic_vector (7 downto 0); -- Внутренняя переменная "Множитель"
signal R3: std_logic_vector (7 downto 0); -- Регистр со старшими разрядами проиведения
signal C1: std_logic;
signal C2: std_logic;
signal Reg: std_logic_vector (17 downto 0); -- Общий сдвиговый регистр на 18 разрядов

 

однако при этом программа перестает работать, переменным типа signal не присваиваются значения из входных портов

 

Подскажите, пожалуйста, в каком направлении двигаться для упрощения функциональной схемы, которую генерирует quartus.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Умножитель работает - зачет.

Функциональная схема которую генерит Квартус на хрен никому не нужна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я впервые работаю с Quartus, и впервые пишу на VHDL

И впервые работаете с ПЛИС видимо =)

 

Возможно я делаю что-то принципиально не правильно?

 

А в моделсиме оно работает как тестбенч или как тестируемый модуль? Где сброс? Где тактовый сигнал в конце концов? =)

Изменено пользователем Barktail

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спроектировал в среде Quartus на языке VHDL алгоритм быстрого умножения Бута.

 

 

Проблема заключается в том, что функциональная схема, которую генерирует Quartus получается очень сложной и запутанной, из нее не понятно ничего,

 

ОДно из требования к этой курсовой работе - это функциональная схема должна быть проще.

Я впервые работаю с Quartus, и впервые пишу на VHDL,

Возможно я делаю что-то принципиально не правильно?

 

 

Подскажите, пожалуйста, в каком направлении двигаться для упрощения функциональной схемы, которую генерирует quartus.

 

Тут вот какое дело. Если Вы написали что-то на HDL, скормили симулятору и при этом у симулятора убрали возможность оптимизации, то после компиляции симулятор покажет Вам все Ваши сигналы. А вот если Вы скормили исходники Quartus, да еще разрашили оптимизацию и указали тип микросхемы для проекта, то считайте, что половину сигналов он сожрет. И что-то, например умножитель реализует на аппаратных блоках...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

функциональная схема, которую генерирует Quartus получается очень сложной и запутанной

...

т.е. на схеме разбросаны сумматоры и какие-то двухбитные регистры..

Так всегда. Тут только ручками.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так всегда. Тут только ручками.

Ну, не всегда.

Как вариант - можно скормить исходный RTL какому-нибудь синтезатору - Precision Synthesis или Synplify Pro.

И посмотреть после синтеза RTL Schematic. Не факт, что будет красивее, чем в квартусе, но вероятность этого есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И впервые работаете с ПЛИС видимо =)

Да, и с ПЛИС впервые))

А в моделсиме оно работает как тестбенч или как тестируемый модуль? Где сброс? Где тактовый сигнал в конце концов? =)

В ModelSim запускаю как тестируемый модуль (нажимаю: Tools - Run Simulation Tool - RTL Simulation) и открывается ModelSim...

 

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

Сейчас подключил их, но по прежнему не знаю как использовать.

clk, reset : in bit;

Например, сброс можно реализовать как обнуление всех регистров, (описанием отдельного параллельного process(reset), как я понимаю).

Но как использовать тактирование... В примерах, которые я смотрел, сигнал тактирования использовался непосредственно для подсчета тактов...

а у меня описан блок, который выполняется при изменении одно из операндов

process (operand_1, operand_2)

 

Функциональная схема которую генерит Квартус на хрен никому не нужна.

Согласен) но для сдачи курсача не жить не быть надо схему, которая сама собой должна простая получиться :biggrin:

 

 

 

Тут вот какое дело. Если Вы написали что-то на HDL, скормили симулятору и при этом у симулятора убрали возможность оптимизации, то после компиляции симулятор покажет Вам все Ваши сигналы. А вот если Вы скормили исходники Quartus, да еще разрашили оптимизацию и указали тип микросхемы для проекта, то считайте, что половину сигналов он сожрет. И что-то, например умножитель реализует на аппаратных блоках...

 

Спасибо, буду экспериментировать в этом направлении!

 

Как вариант - можно скормить исходный RTL какому-нибудь синтезатору - Precision Synthesis или Synplify Pro.

И посмотреть после синтеза RTL Schematic. Не факт, что будет красивее, чем в квартусе, но вероятность этого есть.

 

Благодарю за совет, попробую)

 

Спасибо большое за советы, буду работать дальше, по результатам отпишусь))

Изменено пользователем ivan_z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

здесь исходники примеров книги, вроде с тестбенчами

см. раздел " Adders and Multipliers"

 

В книге "Synthesis of Arithmetic Circuits: FPGAs, ASICs and Embedded Systems" найдете описание алгоритма и принцип работы.

 

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

 

как сгенерировать шаблон тестбеча в Quartus и работа с ним + работа с ModelSim

+ привожу пример задания основных тестовых воздействий на VHDL

clock_gen: process
begin
clk <= '0';
wait for 50 ns;
clk <= '1';
wait for 50 ns;
end process;

reset_gen: process
begin
Reset <= '0';
wait for 10 ns;
Reset <= '1';
wait;
end process;

constant_gen: process
begin
wait until clk'event and clk= '1';
constt <= "000000000000";
wait until clk'event and clk= '1';
constt <= "000000010100";
wait; -- если убрать этот wait, то получите - в общем увидите сами :)
end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а у меня описан блок, который выполняется при изменении одно из операндов

process (operand_1, operand_2)

 

Блок в плис никуда не выполняется. Он либо синхронный и тактируется, или асинхронный - и все что написано в нем выполняется параллельно.

 

У Вас блок явно должен быть синхронным. То что в процессе указан список чувствительности, для реальной схемы мало что значит, т.к. используется вроде как только для симулятора. А синтезатору на эту часть кода наплевать.

 

В ModelSim запускаю как тестируемый модуль (нажимаю: Tools - Run Simulation Tool - RTL Simulation) и открывается ModelSim...

 

чтобы тестировать модуль, надо еще тестбенч написать, задать входные воздействия.

Изменено пользователем Barktail

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...