jenya7 0 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба сделал такой бабл сорт 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; получаю а почему out_val не определен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба Для чего Вам сортировка понадобилась? У Вас же данние приходят последовательно - почему не хотите использовать сортировку которую я Вам дал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба On 9/5/2023 at 10:24 AM, Maverick_ said: Для чего Вам сортировка понадобилась? У Вас же данние приходят последовательно - почему не хотите использовать сортировку которую я Вам дал? ваша сортировка работает но я подумал в данном случае сделать что то простое. каждое приходящее значение засовываю в массив, сортирую и наружу выдаю середину. сортировка понадобилась потому что на некоторых линиях есть флуктуации, то ли наводки, то ли помехи но значение может прыгнуть на какие то нереальные значения. Изменено 5 сентября, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zversky 19 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 2 часа назад, jenya7 сказал: а почему out_val не определен? Не зная VHDL могу спросить: а у вас инициализация всего проходит при старте? Всё обнулено? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба On 9/5/2023 at 12:47 PM, Zversky said: Не зная VHDL могу спросить: а у вас инициализация всего проходит при старте? Всё обнулено? обнулил. не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zversky 19 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 1 час назад, jenya7 сказал: обнулил. не помогло. Покажите + выдайте на времянку всё промежуточное с целью узнать, откуда оно берётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fingertouch 2 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба 18 часов назад, jenya7 сказал: обнулил. не помогло. Аналогично предыдущему оратору не знаю VHDL, но мне кажется, что такая схема никогда не заработает. Вообще непонятно, во что она будет синтезироваться, поскольку у вас цикл for j in 0 to SIZE - 1- i loop выполняется каждый райзинедж клока. В верилоге это вряд ли синтезируемая конструкция, которая в лучшем случае приведёт к конкурентному присвоению выходной переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба Поддерживаю предыдущего оратора. Если развернуть циклы 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, а только после окончания процесса. Поэтому, то как симулятор в итоге поймёт этот код, неясно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба On 9/6/2023 at 3:11 PM, ZwergNase said: Причем кол-во таких последовательных присваиваний строго говоря неизвестно, т.к. оно зависит от содержимого in_buffer. Ошибку компиляции это не вызывает т.к. внутри process присваивания будут последовательны , но раз in_buffer это signal, а не variable, то все присваивания in_buffer будет происходить не сразу, как у temp, а только после окончания процесса. Поэтому, то как симулятор в итоге поймёт этот код, неясно. это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба Никуда индекс по клоку не продвигается... 32 minutes ago, jenya7 said: это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба 52 minutes ago, jenya7 said: это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. мое описание не пробовали симулировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба 5 hours ago, jenya7 said: это с чего бы? присваивание произойдет на следующем клоке а не по окончанию процесса. и индекс в loop продвигается на каждый клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 сентября, 2023 Опубликовано 10 сентября, 2023 · Жалоба On 9/7/2023 at 8:36 AM, Maverick_ said: мое описание не пробовали симулировать? да. симулируется корректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться