ivan_z 0 17 апреля, 2016 Опубликовано 17 апреля, 2016 · Жалоба Доброго времени суток! Спроектировал в среде 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
litv 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Умножитель работает - зачет. Функциональная схема которую генерит Квартус на хрен никому не нужна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 (изменено) · Жалоба Я впервые работаю с Quartus, и впервые пишу на VHDL И впервые работаете с ПЛИС видимо =) Возможно я делаю что-то принципиально не правильно? А в моделсиме оно работает как тестбенч или как тестируемый модуль? Где сброс? Где тактовый сигнал в конце концов? =) Изменено 18 апреля, 2016 пользователем Barktail Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Спроектировал в среде Quartus на языке VHDL алгоритм быстрого умножения Бута. Проблема заключается в том, что функциональная схема, которую генерирует Quartus получается очень сложной и запутанной, из нее не понятно ничего, ОДно из требования к этой курсовой работе - это функциональная схема должна быть проще. Я впервые работаю с Quartus, и впервые пишу на VHDL, Возможно я делаю что-то принципиально не правильно? Подскажите, пожалуйста, в каком направлении двигаться для упрощения функциональной схемы, которую генерирует quartus. Тут вот какое дело. Если Вы написали что-то на HDL, скормили симулятору и при этом у симулятора убрали возможность оптимизации, то после компиляции симулятор покажет Вам все Ваши сигналы. А вот если Вы скормили исходники Quartus, да еще разрашили оптимизацию и указали тип микросхемы для проекта, то считайте, что половину сигналов он сожрет. И что-то, например умножитель реализует на аппаратных блоках... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба функциональная схема, которую генерирует Quartus получается очень сложной и запутанной ... т.е. на схеме разбросаны сумматоры и какие-то двухбитные регистры.. Так всегда. Тут только ручками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Так всегда. Тут только ручками. Ну, не всегда. Как вариант - можно скормить исходный RTL какому-нибудь синтезатору - Precision Synthesis или Synplify Pro. И посмотреть после синтеза RTL Schematic. Не факт, что будет красивее, чем в квартусе, но вероятность этого есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan_z 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 (изменено) · Жалоба И впервые работаете с ПЛИС видимо =) Да, и с ПЛИС впервые)) А в моделсиме оно работает как тестбенч или как тестируемый модуль? Где сброс? Где тактовый сигнал в конце концов? =) В ModelSim запускаю как тестируемый модуль (нажимаю: Tools - Run Simulation Tool - RTL Simulation) и открывается ModelSim... Думал насчет сигналов тактирования и сброса, но не сообразил, как я их могу в своем алгоритме задействовать, поэтому не установил. Сейчас подключил их, но по прежнему не знаю как использовать. clk, reset : in bit; Например, сброс можно реализовать как обнуление всех регистров, (описанием отдельного параллельного process(reset), как я понимаю). Но как использовать тактирование... В примерах, которые я смотрел, сигнал тактирования использовался непосредственно для подсчета тактов... а у меня описан блок, который выполняется при изменении одно из операндов process (operand_1, operand_2) Функциональная схема которую генерит Квартус на хрен никому не нужна. Согласен) но для сдачи курсача не жить не быть надо схему, которая сама собой должна простая получиться Тут вот какое дело. Если Вы написали что-то на HDL, скормили симулятору и при этом у симулятора убрали возможность оптимизации, то после компиляции симулятор покажет Вам все Ваши сигналы. А вот если Вы скормили исходники Quartus, да еще разрашили оптимизацию и указали тип микросхемы для проекта, то считайте, что половину сигналов он сожрет. И что-то, например умножитель реализует на аппаратных блоках... Спасибо, буду экспериментировать в этом направлении! Как вариант - можно скормить исходный RTL какому-нибудь синтезатору - Precision Synthesis или Synplify Pro. И посмотреть после синтеза RTL Schematic. Не факт, что будет красивее, чем в квартусе, но вероятность этого есть. Благодарю за совет, попробую) Спасибо большое за советы, буду работать дальше, по результатам отпишусь)) Изменено 18 апреля, 2016 пользователем ivan_z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба здесь исходники примеров книги, вроде с тестбенчами см. раздел " 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 (изменено) · Жалоба а у меня описан блок, который выполняется при изменении одно из операндов process (operand_1, operand_2) Блок в плис никуда не выполняется. Он либо синхронный и тактируется, или асинхронный - и все что написано в нем выполняется параллельно. У Вас блок явно должен быть синхронным. То что в процессе указан список чувствительности, для реальной схемы мало что значит, т.к. используется вроде как только для симулятора. А синтезатору на эту часть кода наплевать. В ModelSim запускаю как тестируемый модуль (нажимаю: Tools - Run Simulation Tool - RTL Simulation) и открывается ModelSim... чтобы тестировать модуль, надо еще тестбенч написать, задать входные воздействия. Изменено 19 апреля, 2016 пользователем Barktail Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться