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

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

library ieee;
use ieee.std_logic_1164.all;

package array_type is
    type sort_array is array (0 to 5) of std_logic_vector(17 downto 0);
end package;



library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.array_type.all;

entity SORT is
generic 
(
  NBIT  : integer := 18
  --LENTH : integer := 6
);
port 
(
    CLK      : in  std_logic;
    RST      : in  std_logic;
  
    START    : in  std_logic;
    LENTH    : in  std_logic_vector(7 downto 0);
    READY    : out std_logic;
	 
	 IN_ARRAY : in sort_array;
	 OUT_ARRAY : out sort_array;
    MID      : out std_logic_vector(NBIT-1 downto 0)
);
end SORT;

architecture rtl of SORT is

type SortStateType is (ST_IDLE, ST_SORT);
signal SortState : SortStateType := ST_IDLE;

signal temp_buff : std_logic_vector(NBIT-1 downto 0);

signal start1 : std_logic;
signal start2 : std_logic;
signal start3 : std_logic;
signal var_in_array : sort_array;
--signal var_out_array : sort_array;

begin

OUT_ARRAY <= var_in_array;

process(CLK)
begin

    if (rising_edge(CLK)) then
	 
	    case SortState is
		  
            when ST_IDLE =>
	 
               if (START = '1') then
                   READY <= '0';
                   var_in_array <= IN_ARRAY;
                   SortState <= ST_SORT;
               end if;
					  
					 
            when ST_SORT =>
				    
                for j in sort_array'LEFT to sort_array'RIGHT - 1 loop 
		  
                    for i in sort_array'LEFT to sort_array'RIGHT - 1 - j loop
				 
                        if unsigned(var_in_array(i)) > unsigned(var_in_array(i + 1)) then
                            temp_buff <= var_in_array(i);
                            var_in_array(i) <= var_in_array(i + 1);
                            var_in_array(i + 1) <= temp_buff;
                        end if;
				 
                   end loop;
				 
               end loop;
					 
               READY <= '1';
					 
              SortState <= ST_IDLE;
		  
        end case;
		  
	 end if;	  

end process;

end rtl;

Есть подозрение что  READY <= '1'; выставиться на первой итерации. Это так?

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

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


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

Пора бы уже научиться пользоваться симулятором. Ответ на Ваш вопрос находится за 1 минуту симуляции. Вы уже не первый день работаете с ПЛИС. Почему Вы ещё не освоили базовые навыки работы с симулятором ? Странно...

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


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

1 hour ago, Flip-fl0p said:

Пора бы уже научиться пользоваться симулятором. Ответ на Ваш вопрос находится за 1 минуту симуляции. Вы уже не первый день работаете с ПЛИС. Почему Вы ещё не освоили базовые навыки работы с симулятором ? Странно...

вопрос как раз возник после симуляции.

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


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

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

вопрос как раз возник после симуляции.

Вам что симуляция показала ?

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


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

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

Есть подозрение что  READY <= '1'; выставиться на первой итерации. Это так?

А где у вс тут итерации? Тут всё выполняется за один такт. Страшно даже представить, как это синтезтруется.

И таки да. Когда вы перешли в состояние ST_SORT, выставляется READY.

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


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

1 hour ago, andrew_b said:

А где у вс тут итерации? Тут всё выполняется за один такт. Страшно даже представить, как это синтезтруется.

И таки да. Когда вы перешли в состояние ST_SORT, выставляется READY.

а как мне перейти в другой стейт? по какому условию? типа какой то счетчик и когда он равен (i * (j-1) ) ?

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

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


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

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

 

Мне кажется Вы немного лукавите. Это очень похоже не на симуляцию, а на  логический анализатор signal tap. Поправьте меня если я ошибаюсь.

Вы пишите 

            when ST_SORT =>
				    
                for j in sort_array'LEFT to sort_array'RIGHT - 1 loop 
		  
                    for i in sort_array'LEFT to sort_array'RIGHT - 1 - j loop
				 
                        if unsigned(var_in_array(i)) > unsigned(var_in_array(i + 1)) then
                            temp_buff <= var_in_array(i);
                            var_in_array(i) <= var_in_array(i + 1);
                            var_in_array(i + 1) <= temp_buff;
                        end if;
				 
                   end loop;
				 
               end loop;
					 
               READY <= '1';

В состоянии ST_SORT выставить сигнал READY = 1. Ну и построить некую комбинационную схему (ужасающую комбинационную схему...)

а

Цитата

как мне перейти в другой стейт? по какому условию? типа какой то счетчик и когlа он равен (i * (j-1) ) ?

Что значит перейти в другое состояние. У Вашего автомата их всего 2 !

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


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

1 hour ago, Flip-fl0p said:

Мне кажется Вы немного лукавите. Это очень похоже не на симуляцию, а на  логический анализатор signal tap. Поправьте меня если я ошибаюсь.

Вы пишите 


            when ST_SORT =>
				    
                for j in sort_array'LEFT to sort_array'RIGHT - 1 loop 
		  
                    for i in sort_array'LEFT to sort_array'RIGHT - 1 - j loop
				 
                        if unsigned(var_in_array(i)) > unsigned(var_in_array(i + 1)) then
                            temp_buff <= var_in_array(i);
                            var_in_array(i) <= var_in_array(i + 1);
                            var_in_array(i + 1) <= temp_buff;
                        end if;
				 
                   end loop;
				 
               end loop;
					 
               READY <= '1';

В состоянии ST_SORT выставить сигнал READY = 1. Ну и построить некую комбинационную схему (ужасающую комбинационную схему...)

а

Что значит перейти в другое состояние. У Вашего автомата их всего 2 !

да. но мне придется остаться в  ST_SORT чтоб отработать два  for - loop а потом перейти в стейт где я выставлю READY.

 

 

 

возможно моя версия ужасна. может есть лучший алгоритм сортировки?

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

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


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

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

да. но мне придется остаться в  ST_SORT чтоб отработать два  for - loop а потом перейти в стейт где я выставлю READY.

 

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

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


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

1 hour ago, Flip-fl0p said:

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

да я уже разобрался. поэтому и спрашиваю по какому условию перейти в следующий стейт, назовем его ST_READY.

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


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

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

да я уже разобрался. поэтому и спрашиваю по какому условию перейти в следующий стейт, назовем его ST_READY.

Переходите тогда, когда закончатся все переходные процессы в Вашей комбинационной схеме. 

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


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

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

да я уже разобрался. поэтому и спрашиваю по какому условию перейти в следующий стейт, назовем его ST_READY.

В VHDL цикл for это не количество тактов, это количество оборудования. 

На вскидку, тяжело сказать, что будет делать такая схема. 

А сигнал READY, да установится сразу. 

 

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


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

1 hour ago, Flip-fl0p said:

Переходите тогда, когда закончатся все переходные процессы в Вашей комбинационной схеме. 

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

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


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

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

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

Откуда я могу это знать ? Запустите временной анализатор и посмотрите. Вы вообще читали, что Вам люди пишут. Вы пытались понять, что Вам люди пишут ? Вы вообще имеете хоть малейшее представление во что синтезируется Ваш код на HDL ? 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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