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

Почему не симулируется сортировка

сделал такой бабл сорт

Spoiler
entity ADC_FIFO is
generic
(
    SIZE : integer := 5
);
port
(
    CLK    : in std_logic;
	 
	 VAL_IN  : in std_logic_vector(15 downto 0);
	 AVG_OUT : out std_logic_vector(15 downto 0);
	 
	 TRIG    : in std_logic
	 
);
end ADC_FIFO;

architecture behavior of ADC_FIFO is

type fifo_t is array (SIZE-1 downto 0) of std_logic_vector(15 downto 0);
signal in_buffer : fifo_t;  

signal trig_1 : std_logic;
signal trig_2 : std_logic;
signal trig_3 : std_logic;

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

begin

AVG_OUT <= in_buffer(3);

trig_3 <= not trig_2 and trig_1;

process (CLK)
begin
    if (rising_edge(CLK)) then
        trig_1 <= TRIG;
        trig_2 <= trig_1;
	 end if;	  
end process;


process (CLK)
variable idx : integer range 0 to 7 := 0;
variable temp : std_logic_vector(15 downto 0);
begin

    if (rising_edge(CLK)) then
	 
	     case SortState is
		 
		      when ST_IDLE => 
              if (trig_3 = '1') then
		      
		            in_buffer(idx) <= VAL_IN;    
				      idx := idx + 1;
				      if (idx > SIZE-1) then
				         idx := 0;
				      end if;
				      SortState <= ST_SORT;
               end if;
					
		       when ST_SORT =>
                 
				 for i in 0 to SIZE-1 loop 
                for j in 0 to SIZE - 1- i loop 
                    if unsigned(in_buffer(j)) > unsigned(in_buffer(j + 1)) then
                       temp := in_buffer(j);
                       in_buffer(j) <= in_buffer(j + 1);
                       in_buffer(j + 1) <= temp;
                    end if;
                end loop;
            end loop;

				SortState <= ST_IDLE;
			 
			   when others => 
			     SortState <= ST_IDLE;
				  
	    end case;
		 
	 end if;	  
end process;

 

проверяю

Spoiler
entity sort_tb is
end sort_tb;

architecture behavior of sort_tb is

constant clk_period : time := 40 ns;

signal clock   : std_logic;	
signal in_val  : std_logic_vector(15 downto 0);	
signal out_val : std_logic_vector(15 downto 0);
signal trig    : std_logic := '0';
signal ready   : std_logic;

component ADC_FIFO is
generic
(
    SIZE : integer := 5
);
port
(
    CLK    : in std_logic;
	 
	 TRIG    : in std_logic;
	 VAL_IN  : in std_logic_vector(15 downto 0);
	 AVG_OUT : out std_logic_vector(15 downto 0);
	 
	 READY   : out std_logic 
);
end component;

begin

U_ADC_FIFO : ADC_FIFO 
generic map
(
   SIZE => 5
)
port map
(
    CLK    =>  clock,
	 
	 VAL_IN  => in_val,
	 AVG_OUT => out_val,
	 
	 TRIG    => trig,
	 
	 READY => ready
);


clk_process : process
begin
    clock <= '0';
    wait for clk_period/2;
    clock <= '1';
    wait for clk_period/2;
end process;

process
begin
 
    in_val <= X"2200";
    trig <= '1'; 
    wait for 80 ns;
    trig <= '0';

	 wait for 400 ns;
	 
	 in_val <= X"1100";
    trig <= '1'; 
    wait for 80 ns;
    trig <= '0';

	 wait for 400 ns;
	 
	 in_val <= X"4400";
    trig <= '1'; 
    wait for 80 ns;
    trig <= '0';

	 wait for 400 ns;
	 
	 in_val <= X"3300";
    trig <= '1'; 
    wait for 80 ns;
    trig <= '0';

    wait;
	
	 
end process;

end behavior;

 

получаю

 

image.thumb.png.027e2084adda3ee02b61bc030b664310.png

а почему out_val не определен?

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


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

Для чего Вам сортировка понадобилась?

У Вас же данние приходят последовательно - почему не хотите использовать сортировку которую я Вам дал?

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


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

On 9/5/2023 at 10:24 AM, Maverick_ said:

Для чего Вам сортировка понадобилась?

У Вас же данние приходят последовательно - почему не хотите использовать сортировку которую я Вам дал?

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

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

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

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


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

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

а почему out_val не определен?

Не зная VHDL могу спросить: а у вас инициализация всего проходит при старте? Всё обнулено?

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


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

On 9/5/2023 at 12:47 PM, Zversky said:

Не зная VHDL могу спросить: а у вас инициализация всего проходит при старте? Всё обнулено?

обнулил. не помогло.

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


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

https://github.com/gaab0r/median_filter/blob/master/median_filter.srcs/sources_1/new/sorter.vhd

лучше опишите pipeline схему https://www.ijedr.org/papers/IJEDRCP1401003.pdf   Figure 2: Proposed systolic array of optimized approach

будет єфективнее

может потом поделитесь)))

в дополнение https://www.ripublication.com/ijaer17/ijaerv12n24_289.pdf

можно немного иначе реализовать https://www.researchgate.net/publication/317662545_An_FPGA_Implementation_of_a_Fast_2-Dimensional_Median_Filter    Figure 3: The Hardware architecture of Median Filter 

 

можно так попробоапть

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

package Const_type is
type my_array is array (0 to 16) of std_logic_vector (11 downto 0) ;
end package;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.Const_type.all;

entity proverka is

Port ( 
CLK : in std_logic;
din : in std_logic_vector (11 downto 0) ;
dout : out my_array  );
end proverka;

architecture behavioral of proverka is

begin

process (clk)
variable z : std_logic_vector (11 downto 0) ;
variable x : my_array := (others => "000000000000");
begin
if (CLK'event and CLK ='1') then     
for i in 1 to 16 loop 
	 if ( din > x(i) ) then 
       z := din; 
		 x(i-1) := x(i); 
		 x(i) := z;
    end if;
end loop;
	dout <= x;
end if;
  
end process;

end behavioral;

 

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


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

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

обнулил. не помогло.

Покажите + выдайте на времянку всё промежуточное с целью узнать, откуда оно берётся.

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


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

18 часов назад, jenya7 сказал:

обнулил. не помогло.

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

for j in 0 to SIZE - 1- i loop

выполняется каждый райзинедж клока. В верилоге это вряд ли синтезируемая конструкция, которая в лучшем случае приведёт к конкурентному присвоению выходной переменной.

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


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

Поддерживаю предыдущего оратора.
Если развернуть циклы

for i in 0 to SIZE-1 loop 
                for j in 0 to SIZE - 1- i loop 

то получится, что внутри процесса будет несколько последовательных присваиваний, типа

temp := in_buffer(j);
                       in_buffer(j) <= in_buffer(j + 1);
                       in_buffer(j + 1) <= temp;

Причем кол-во таких последовательных присваиваний строго говоря неизвестно, т.к. оно зависит от содержимого in_buffer. Ошибку компиляции это не вызывает т.к. внутри process присваивания будут последовательны , но раз in_buffer это signal, а не variable, то все присваивания in_buffer будет происходить не сразу, как у temp, а только после окончания процесса. Поэтому, то как симулятор в итоге поймёт этот код, неясно.

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


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

On 9/6/2023 at 3:11 PM, ZwergNase said:

 

Причем кол-во таких последовательных присваиваний строго говоря неизвестно, т.к. оно зависит от содержимого in_buffer. Ошибку компиляции это не вызывает т.к. внутри process присваивания будут последовательны , но раз in_buffer это signal, а не variable, то все присваивания in_buffer будет происходить не сразу, как у temp, а только после окончания процесса. Поэтому, то как симулятор в итоге поймёт этот код, неясно.

это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. 

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


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

Никуда индекс по клоку не продвигается...

32 minutes ago, jenya7 said:

это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. 

 

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


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

52 minutes ago, jenya7 said:

это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. 

мое описание не пробовали симулировать?

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


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

5 hours ago, jenya7 said:

это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. 

 

image.pngimage.thumb.png.a24ddc34f8579ac63aeb6163fb29ba54.png

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


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

On 9/7/2023 at 8:36 AM, Maverick_ said:

мое описание не пробовали симулировать?

да. симулируется корректно.

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


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

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

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

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

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

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

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

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

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

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