Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 06:44

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 03:21 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Делилка. Работает, когда процессор делает NOP в цикле. Когда не NOP, откатывается на нулевое состояние. Через 34 такта в выходные регистры сбрасывается частное и остаток. Верифицировано (Spartan-6).
Код:
-- divider

process(clk)
begin
  if rising_edge(clk) then
     case divst is
       when 0 => diva <= ext(Dqb, 64);
                 divb <= Dqa & ext("0", 64 - DATAWIDTH);
                 wdiv <= (others => '0');
                 divst <= 1;
       when 1 to 33 => if cmd = "000000" then
                         if diva >= divb then wdiv <= wdiv(30 downto 0) & '1';
                                            diva <= diva - divb;
                                  else wdiv <= wdiv(30 downto 0) & '0';
                         end if;   
                         divb <= '0' & divb(63 downto 1);
                         divst <= divst + 1;
                         else divst <= 0;
                        end if;
       when 34 => rdiv <= wdiv(31 downto 0); rrem <= diva(31 downto 0); divst <= 0;
       when others => divst <= 0;
     end case;
  end if;
end process; 


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 04:36 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Решил попробовать в Quartusе
После объявления всех входных, внутренних и выходных сигналов:

Код:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
USE WORK.Common_lib.all;

ENTITY TEST_DIV IS

Port(
   clk : in node;
   dqa,dqb : in dword;
   rdiv,rrem : out dword;
   cmd : in std_logic_vector (5 downto 0)

);
 
end TEST_DIV;
 
architecture rtl of TEST_DIV is
   signal divst : integer range 0 to 63;
   signal wdiv : qword; -- std_logic_vector (63 downto 0);
   signal diva,divb : qword; --std_logic_vector (63 downto 0);
begin


process(clk)
begin
  if rising_edge(clk) then
     case divst is
       when 0 => diva <= ext(Dqb, 64);
                 divb <= Dqa & ext("0", 64 - DATAWIDTH);
                 wdiv <= (others => '0');
                 divst <= 1;
       when 1 to 33 => if cmd = "000000" then
                         if diva >= divb then wdiv <= wdiv(30 downto 0) & '1';
                                            diva <= diva - divb;
                                  else wdiv <= wdiv(30 downto 0) & '0';
                         end if;   
                         divb <= '0' & divb(63 downto 1);
                         divst <= divst + 1;
                         else divst <= 0;
                        end if;
       when 34 => rdiv <= wdiv(31 downto 0); rrem <= diva(31 downto 0); divst <= 0;
       when others => divst <= 0;
     end case;
  end if;
end process; 

end;


Quartus выдает:

Цитата:
Error (.....): object "ext" is used but not declared


не совсем понятно, что эта функция делает, чтобы ее в common_lib.vhd внести

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 05:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Доковырял по логике, заменил ext() на то, что показалось правильным,
получилось:

Код:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
USE WORK.Common_lib.all;

ENTITY TEST_DIV IS

Port(
   clk : in node;
   dqa,dqb : in dword;
   rdiv,rrem : out dword;
   cmd : in std_logic_vector (5 downto 0)

);
 
end TEST_DIV;
 
architecture rtl of TEST_DIV is
   signal divst : integer range 0 to 63;
   signal wdiv : dword; -- std_logic_vector (63 downto 0);
   signal diva,divb : qword; --std_logic_vector (63 downto 0);

   constant zero32 : dword := (others => '0');
begin


process(clk)
begin
  if rising_edge(clk) then
     case divst is
       when 0 => diva <= zero32 & dqa;
                 divb <= Dqb & zero32;
                 wdiv <= zero32;
                 divst <= 1;
       when 1 to 33 => if cmd = "000000" then
                         if diva >= divb then wdiv <= wdiv(30 downto 0) & '1';
                                            diva <= diva - divb;
                                  else wdiv <= wdiv(30 downto 0) & '0';
                         end if;   
                         divb <= '0' & divb(63 downto 1);
                         divst <= divst + 1;
                         else divst <= 0;
                        end if;
       when 34 => rdiv <= wdiv(31 downto 0); rrem <= diva(31 downto 0); divst <= 0;
       when others => divst <= 0;
     end case;
  end if;
end process; 

end;


И даже откомпилилось в Quartus...
И даже отсимулировалось...
1000 / 100 = 10 (0)
1000 / 120 = 8 (40)

dqa, dqb в ветке when 0 => поменял местами (чтобы dqb / dqa) получалось. формально - это делать незачем.

На циклоне2 - 98 MHz (409 LCELL)
на циклоне3 - 107 MHz (410 LCELL)

кстати, кажется, что позволять "делилке" работать лучше не только во время NOP-a, но и во время работы большинства других команд, тогда можно делать что-то параллельно работе "делилки" ;) Впрочем, и загрузка результата деления в стек может стать поводом для вставки вайтов во время исполнения. А запускать ее всякий раз, как в стеке поменялись данные, тогда можно продолжать делить, пока что-то делается мимо стека... и потом, при загрузке результата, добить вайтами, если тактов не хватило.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 15:15 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
dqa, dqb в ветке when 0 => поменял местами (чтобы dqb / dqa) получалось. формально - это делать незачем.

Вроде бы так и делалось. Неужели я старую версию забрал?...
WingLion писал(а):
кстати, кажется, что позволять "делилке" работать лучше не только во время NOP-a, но и во время работы большинства других команд, тогда можно делать что-то параллельно работе "делилки" Впрочем, и загрузка результата деления в стек может стать поводом для вставки вайтов во время исполнения. А запускать ее всякий раз, как в стеке поменялись данные, тогда можно продолжать делить, пока что-то делается мимо стека... и потом, при загрузке результата, добить вайтами, если тактов не хватило.

В принципе да, можно. Можно операнды разместить в адресном пространстве, и работать с делилкой через порты ВВ, это тоже вариант. Мне еще было интересно, насколько удобно окажется работать с системными регистрами (сейчас DEPTH, RDEPTH, I, частное, остаток, куча таймеров помещаются на стек через N SYSREG@). Сейчас при увеличении мультиплексируемых шин частота не падает. Но выделять "системный порт" как-то не хочется, а опкодов уже не осталось.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 16:41 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Вроде бы так и делалось. Неужели я старую версию забрал?...


в строчках:
Код:
       when 0 => diva <= ext(Dqb, 64);
                 divb <= Dqa & ext("0", 64 - DATAWIDTH);


кажется, что a и b операнды перепутаны... судя по коду...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 16:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
кажется, что a и b операнды перепутаны... судя по коду...

Да нет, вроде все правильно. Dqa у меня вершина стека, Dqb второе сверху. Второе делится на верхнее. По тексту вроде бы все правильно, тем более что оно в железе работает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Делитель на VHDL
СообщениеДобавлено: Пн янв 02, 2012 17:04 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
А... ну тогда получается - b / a - "нижнее делить на верхнее", а я привел свой вариант к a / b потому оно и показалось перепутанным ;)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB