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

Приветствую!

5 minutes ago, jenya7 said:

а когда они закончаться? (i * j-1) тактов?

Вы каким алгоритмом сортировку делаете ? Судя по всему пузырьком,  максимальный элемент двигаете в конец массива, так? А какой при этом признак  что массив отсортирован?  Если мне память не изменяет -  за проход по массиву не было ни одной перестановки. 

Ну и то что вы написали работать не будет вообще.   По тому как все циклы  for у вас крутится в одном такте тактовой  :wacko: А надо бы  сделать так чтобы в каждом такте выполнялся только один цикл (сравнение, перестановка). Что то типа такого 

...
when ST_START => 
  cnt_i <= 0;
  cnt_j <= len-1;
  state <= ST_SORT;

when ST_SORT => 
  if (var(i) > var(i+1)) then

    var(i)   <= var(i+1);
    var(i+1) <= var(i);
  end
    
  cnt_i <= cnt_i + 1;

  if (cnt_i == cnt_j) then 
    cnt_i <= 0;
    cnt_j <= cnt_j-1;
  
    if (cnt_j==1) then
      state <= ST_READY;
    end
  end
...

Удачи! Rob.

 

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


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

1 hour ago, RobFPGA said:

Приветствую!

Вы каким алгоритмом сортировку делаете ? Судя по всему пузырьком,  максимальный элемент двигаете в конец массива, так? А какой при этом признак  что массив отсортирован?  Если мне память не изменяет -  за проход по массиву не было ни одной перестановки. 

Ну и то что вы написали работать не будет вообще.   По тому как все циклы  for у вас крутится в одном такте тактовой  :wacko: А надо бы  сделать так чтобы в каждом такте выполнялся только один цикл (сравнение, перестановка). Что то типа такого 

Удачи! Rob.

 

спасибо. попробую.

 

for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт.

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

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


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

28 минут назад, jenya7 сказал:

спасибо. попробую.

 

for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт.

 

На что спорим, что в данном случае Вы не правы ?

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


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

1 час назад, jenya7 сказал:

for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт.

Во, еще один программист на аппаратные грабли наступил :)

Вам уже неоднократно намекнули, что HDL - это не язык программирования! Это - Язык Описания Аппаратуры (и в нем есть параллелизм).

Возьмите самый простой букварь по VHDL, например Peter Ashenden "The VHDL Coockbook" , почитайте, во что превращаются "в железе" те или иные языковые конструкции. Без понимания этого Вы гарантировано будете натыкаться на всякие непонятности.

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


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

Поищите готовые модули на vhdl: 

Bubble sort , Сортировка 3 чисел , Networking sort

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


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

17 hours ago, Skryppy said:

Поищите готовые модули на vhdl: 

Bubble sort , Сортировка 3 чисел , Networking sort

я оттуда и взял бабл сорт.

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


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

Приветствую!

40 minutes ago, jenya7 said:

я оттуда и взял бабл сорт.

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

Удачи! Rob.

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


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

1 hour ago, RobFPGA said:

Приветствую!

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

Удачи! Rob.

месье. жё не манж па си жур. предложите рабочий вариант пожалуйста.

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


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

Spoiler
12 minutes ago, jenya7 said:

месье. жё не манж па си жур. предложите рабочий вариант пожалуйста.

У вас талант к нищенству

 

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


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


------------------------------------------------------------------------------
-- Описание приведено для поиска четырех минимальных чисел. 
-- Легко масштабируется путем увеличения количества модулей sort_list_cell.
-- Значение на входе сохраняется в модуле sort_list_cell, 
-- начиная с которого это значение превосходит значение 
-- регистра dout (условие позиции вставки: cprev = 0 и cout = 1).
-- Остальные модули, у которых din < dout, берут новое значение 
-- регистра dout с выхода предыдущего модуля. 

-- dprev - содержимое регистра предыдущего модуля
-- cprev - значение на входе din больше чем dprev
-- cout  - значение на входе din больше чем dout
-- do0   - максимальное значение
-- do3   - минимальное значение

------------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity sort_list is
    port(clk, en,  rst : in std_logic;
	 din : in std_logic_vector(3 downto 0);
	 insert_out : out std_logic;
	 do0, do1, do2, do3  : out std_logic_vector(3 downto 0));
end sort_list;

architecture archi of sort_list is

component sort_list_cell is
    port(clk, en,  rst : in std_logic;
	 din : in std_logic_vector(3 downto 0);
	 dprev : in std_logic_vector(3 downto 0);
	 cprev : in std_logic;
	 cout : out std_logic;
    dout : out std_logic_vector(3 downto 0));
end component sort_list_cell;

signal reg_cout0, reg_cout1, reg_cout2, reg_cout3: std_logic;
signal reg_do0, reg_do1, reg_do2, reg_do3  : std_logic_vector(3 downto 0);

signal reg_insert  : std_logic;

begin

cell_3 : sort_list_cell 
port map (
 clk     => clk,
 en      => en, 
 rst     => rst,
 din     => din,
 dprev   => reg_do2,
 cprev   => reg_cout2,
 dout    => reg_do3,
 cout    => reg_cout3);
 
 cell_2 : sort_list_cell 
port map (
 clk     => clk,
 en      => en, 
 rst     => rst,
 din     => din,
 dprev   => reg_do1,
 cprev   => reg_cout1,
 dout    => reg_do2,
 cout    => reg_cout2);
 
  cell_1 : sort_list_cell 
port map (
 clk     => clk,
 en      => en, 
 rst     => rst,
 din     => din,
 dprev   => reg_do0, 
 cprev   => reg_cout0,
 dout    => reg_do1,
 cout    => reg_cout1);
 
   cell_0 : sort_list_cell 
port map (
 clk     => clk,
 en      => en, 
 rst     => rst,
 din     => din,
 dprev   => (others => '0'),
 cprev   => '0',
 dout    => reg_do0,
 cout    => reg_cout0);
 
 do0 <= reg_do0; 
 do1 <= reg_do1;
 do2 <= reg_do2;
 do3 <= reg_do3;
 
 reg_insert <= ('0' and reg_cout0) or (reg_cout0 and reg_cout1) or (reg_cout1 and reg_cout2) or (reg_cout2 and reg_cout3); 
 insert_out <= reg_insert;

 end archi;


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity sort_list_cell is
    port(clk, en,  rst : in std_logic;
	 din : in std_logic_vector(3 downto 0);
	 dprev : in std_logic_vector(3 downto 0);
	 cprev : in std_logic;
	 cout : out std_logic;
    dout : out std_logic_vector(3 downto 0));
end sort_list_cell;

architecture archi of sort_list_cell is
   signal reg_dout: std_logic_vector(3 downto 0);
	signal reg_cout: std_logic;
begin

	reg_cout <= '1' WHEN din < reg_dout ELSE '0'; 
	cout <= reg_cout;
	
	process (clk, en, rst)
    begin
	if rst = '1' then
	reg_dout <= (others => '1');
        elsif (clk'event and clk='1') then
			if(en and reg_cout) = '1' then  
				if cprev = '1' then
					reg_dout <= dprev;
					else
					reg_dout <= din;
				end if; 
			end if;
		end if;
	end process;
	dout <= reg_dout;
	
end archi;

я думаю данные для сортировки у вас появляються последовательно, тогда данный вариант должен подойти

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


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

спасибо!

а как оно работает? я должен защелкивать каждый din по insert_out? а do0, do1, do2, do3 это отсортированные значения?

 

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


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

"do0, do1, do2, do3 это отсортированные значения ?"  Да

Я ниже привел тестбенч попробуйте запустить симуляцию и все станет ясно как работет.

Или посмотрите тестбенч - как я подаю сигналы на вход

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


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

1 hour ago, Maverick_ said:

"do0, do1, do2, do3 это отсортированные значения ?"  Да

Я ниже привел тестбенч попробуйте запустить симуляцию и все станет ясно как работет.

Или посмотрите тестбенч - как я подаю сигналы на вход

не. не вижу тест бенч.

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

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


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

LIBRARY ieee;                                               
USE ieee.std_logic_1164.all; 
USE IEEE.numeric_std.ALL;
USE ieee.std_logic_signed.ALL;                               

ENTITY sort_list_vhd_tst IS
END sort_list_vhd_tst;
ARCHITECTURE sort_list_arch OF sort_list_vhd_tst IS
-- constants                                                 
-- signals                                                   
SIGNAL clk : STD_LOGIC;
SIGNAL din : STD_LOGIC_VECTOR(3 DOWNTO 0):= (others => '1');
SIGNAL do0 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL do1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL do2 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL do3 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL en : STD_LOGIC;
SIGNAL insert_out : std_logic;
SIGNAL rst : STD_LOGIC;


COMPONENT sort_list
	PORT (
	clk : IN STD_LOGIC;
	din : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	do0 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
	do1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
	do2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
	do3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
	insert_out : OUT std_logic;
	en : IN STD_LOGIC;
	rst : IN STD_LOGIC
	);
END COMPONENT;
BEGIN
	i1 : sort_list
	PORT MAP (
-- list connections between master ports and signals
	clk => clk,
	din => din,
	do0 => do0,
	do1 => do1,
	do2 => do2,
	do3 => do3,
	en => en,
	insert_out => insert_out,
	rst => rst
	);


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

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

en_gen: process
begin
en <= '0';
wait for 10 ns;
en <= '1';
wait;
end process;

const_gen: process (clk)
begin
if (clk'event and clk='1') then
din <= din + "0001";
end if;
end process;

	
END sort_list_arch;

 

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


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

что то я туплю. у нас то топ ентити sort_list. я же через него загружаю новые значения.

а понял. спасибо.

 

у меня такой вопрос - а как мне сделать скалабилити. я хочу задать d0 - dN.  generate cell_0 - cell_N?

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

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


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

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

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

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

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

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

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

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

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

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