RobFPGA 33 6 апреля, 2020 Опубликовано 6 апреля, 2020 · Жалоба Приветствую! 5 minutes ago, jenya7 said: а когда они закончаться? (i * j-1) тактов? Вы каким алгоритмом сортировку делаете ? Судя по всему пузырьком, максимальный элемент двигаете в конец массива, так? А какой при этом признак что массив отсортирован? Если мне память не изменяет - за проход по массиву не было ни одной перестановки. Ну и то что вы написали работать не будет вообще. По тому как все циклы for у вас крутится в одном такте тактовой А надо бы сделать так чтобы в каждом такте выполнялся только один цикл (сравнение, перестановка). Что то типа такого ... 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 апреля, 2020 Опубликовано 6 апреля, 2020 (изменено) · Жалоба 1 hour ago, RobFPGA said: Приветствую! Вы каким алгоритмом сортировку делаете ? Судя по всему пузырьком, максимальный элемент двигаете в конец массива, так? А какой при этом признак что массив отсортирован? Если мне память не изменяет - за проход по массиву не было ни одной перестановки. Ну и то что вы написали работать не будет вообще. По тому как все циклы for у вас крутится в одном такте тактовой А надо бы сделать так чтобы в каждом такте выполнялся только один цикл (сравнение, перестановка). Что то типа такого Удачи! Rob. спасибо. попробую. for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт. Изменено 6 апреля, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 6 апреля, 2020 Опубликовано 6 апреля, 2020 · Жалоба 28 минут назад, jenya7 сказал: спасибо. попробую. for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт. На что спорим, что в данном случае Вы не правы ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 6 апреля, 2020 Опубликовано 6 апреля, 2020 · Жалоба 1 час назад, jenya7 сказал: for пробежит все циклы за один такт? да не может быть. каждая итерация цикла это такт. Во, еще один программист на аппаратные грабли наступил :) Вам уже неоднократно намекнули, что HDL - это не язык программирования! Это - Язык Описания Аппаратуры (и в нем есть параллелизм). Возьмите самый простой букварь по VHDL, например Peter Ashenden "The VHDL Coockbook" , почитайте, во что превращаются "в железе" те или иные языковые конструкции. Без понимания этого Вы гарантировано будете натыкаться на всякие непонятности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 6 апреля, 2020 Опубликовано 6 апреля, 2020 · Жалоба Поищите готовые модули на vhdl: Bubble sort , Сортировка 3 чисел , Networking sort Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба 17 hours ago, Skryppy said: Поищите готовые модули на vhdl: Bubble sort , Сортировка 3 чисел , Networking sort я оттуда и взял бабл сорт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба Приветствую! 40 minutes ago, jenya7 said: я оттуда и взял бабл сорт. Ну так надо было до конца там статью читать - так как то что вы там взяли не рабоче (о чем там же и пишут). А "пофиксиный" вариант от туда работает за один такт, что хорошо видно на приведенном скриншоте сима . Такое годится для симуляции но ни как для синтеза (хотя бывают же на свете чудаки ). Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба 1 hour ago, RobFPGA said: Приветствую! Ну так надо было до конца там статью читать - так как то что вы там взяли не рабоче (о чем там же и пишут). А "пофиксиный" вариант от туда работает за один такт, что хорошо видно на приведенном скриншоте сима . Такое годится для симуляции но ни как для синтеза (хотя бывают же на свете чудаки ). Удачи! Rob. месье. жё не манж па си жур. предложите рабочий вариант пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба Spoiler 12 minutes ago, jenya7 said: месье. жё не манж па си жур. предложите рабочий вариант пожалуйста. У вас талант к нищенству Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба ------------------------------------------------------------------------------ -- Описание приведено для поиска четырех минимальных чисел. -- Легко масштабируется путем увеличения количества модулей 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; я думаю данные для сортировки у вас появляються последовательно, тогда данный вариант должен подойти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба спасибо! а как оно работает? я должен защелкивать каждый din по insert_out? а do0, do1, do2, do3 это отсортированные значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба "do0, do1, do2, do3 это отсортированные значения ?" Да Я ниже привел тестбенч попробуйте запустить симуляцию и все станет ясно как работет. Или посмотрите тестбенч - как я подаю сигналы на вход Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2020 Опубликовано 7 апреля, 2020 (изменено) · Жалоба 1 hour ago, Maverick_ said: "do0, do1, do2, do3 это отсортированные значения ?" Да Я ниже привел тестбенч попробуйте запустить симуляцию и все станет ясно как работет. Или посмотрите тестбенч - как я подаю сигналы на вход не. не вижу тест бенч. Изменено 7 апреля, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 апреля, 2020 Опубликовано 7 апреля, 2020 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2020 Опубликовано 7 апреля, 2020 (изменено) · Жалоба что то я туплю. у нас то топ ентити sort_list. я же через него загружаю новые значения. а понял. спасибо. у меня такой вопрос - а как мне сделать скалабилити. я хочу задать d0 - dN. generate cell_0 - cell_N? Изменено 7 апреля, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться