jenya7 0 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба 23 minutes ago, andrew_b said: Устроит? Если нет, введите промежуточный сигнал и проинициализируйте его. самое начало и OUTPUTS : out std_logic_vector(55 downto 0) := (others => '0') и signal s_outputs : std_logic_vector(55 downto 0):= (others => '0'); а воз и ныне там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба в железе последняя версия работает на ура. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба 26 minutes ago, jenya7 said: в железе последняя версия работает на ура. в железе работает потому что ПЛИС при конфигурации инициализирует регистры. А в коде из первого поста, OUTPUTS это неинициализированный регистр, который в железе инициализировался. Код вашей последней версии приведите. Гложат меня сомнения что код в этом посте синтезатор пропустил. Там конфликт драйверов, синтезатор был обязан ругнуться. Поэтому код нужен) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 февраля, 2022 Опубликовано 7 февраля, 2022 (изменено) · Жалоба 16 minutes ago, des00 said: в железе работает потому что ПЛИС при конфигурации инициализирует регистры. А в коде из первого поста, OUTPUTS это неинициализированный регистр, который в железе инициализировался. Код вашей последней версии приведите. Гложат меня сомнения что код в этом посте синтезатор пропустил. Там конфликт драйверов, синтезатор был обязан ругнуться. Поэтому код нужен) entity OUT_CONTROL is port ( CLK : in std_logic; RST : in std_logic; OUT_MASK : in std_logic_vector(55 downto 0); OUT_ON_OFF : in std_logic_vector(55 downto 0); OUT_TRIG : in std_logic; OUTPUTS : out std_logic_vector(55 downto 0) ); end entity OUT_CONTROL; architecture behavior of OUT_CONTROL is type OutStateType is (ST_IDLE, ST_SET, ST_PREV); signal OutState : OutStateType := ST_IDLE; signal outs : std_logic_vector(55 downto 0) := (others => '0'); signal pev_outs : std_logic_vector(55 downto 0) := (others => '0'); begin OUTPUTS <= outs; process(CLK) begin if (rising_edge(CLK)) then case OutState is when ST_IDLE => if (OUT_TRIG = '1') then OutState <= ST_SET; end if; when ST_SET => for i in 0 to 55 loop if (OUT_MASK(i) = '1') then OUTPUTS(i) <= OUT_ON_OFF(i); else outs(i) <= pev_outs(i); end if; end loop; OutState <= ST_PREV; when ST_PREV => pev_outs <= outs; OutState <= ST_IDLE; when others => OutState <= ST_IDLE; end case; end if; end process; end behavior; и вот результат Изменено 7 февраля, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба эммм, либо VHDL сдал позиции по черному, либо одно из трех. Иначе мне не ясно как может быть синтезирован вот такой вот код OUTPUTS <= outs; process(CLK) begin if (rising_edge(CLK)) then ...... when ST_SET => for i in 0 to 55 loop if (OUT_MASK(i) = '1') then OUTPUTS(i) <= OUT_ON_OFF(i); end loop; ............ end case; end if; end process; К коде возникает конфликт драйверов сигнала OUTPUTS, а синтезатор молчит. В каком ПО это было собрано? Хотя, с учетом того что outs и pev_out у вас висят в воздухе, синтезатор их выкинул и наверное воспользовался функцией разрешения. А чтобы моделировалось, вам надо было в исходный код добавить инициализацию по сигналу сброса. Или да, делать через промежуточный предварительно инициализированный регистр. На верилоге это вот так always_ff @(posedge clk) begin if (rst) begin OutState <= ST_IDLE; OUTPUTS <= '0; end else begin case(OutState) ST_IDLE : OutState <= OUT_TRIG ? ST_SET : ST_IDLE; ST_SET : begin OutState <= ST_IDLE; for (int i = 0; i < 55; i++) begin if (OUT_MASK(i)) begin OUTPUTS(i) <= OUT_ON_OFF(i); end end end endcase end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 февраля, 2022 Опубликовано 7 февраля, 2022 (изменено) · Жалоба 10 minutes ago, des00 said: эммм, либо VHDL сдал позиции по черному, либо одно из трех. Иначе мне не ясно как может быть синтезирован вот такой вот код К коде возникает конфликт драйверов сигнала OUTPUTS, а синтезатор молчит. В каком ПО это было собрано? Хотя, с учетом того что outs и pev_out у вас висят в воздухе, синтезатор их выкинул и наверное воспользовался функцией разрешения. А чтобы моделировалось, вам надо было в исходный код добавить инициализацию по сигналу сброса. Или да, делать через промежуточный предварительно инициализированный регистр. На верилоге это вот так always_ff @(posedge clk) begin if (rst) begin OutState <= ST_IDLE; OUTPUTS <= '0; end else begin case(OutState) ST_IDLE : OutState <= OUT_TRIG ? ST_SET : ST_IDLE; ST_SET : begin OutState <= ST_IDLE; for (int i = 0; i < 55; i++) begin if (OUT_MASK(i)) begin OUTPUTS(i) <= OUT_ON_OFF(i); end end end endcase end end не понял. а чем этот код оличается от моего? у меня вроде всё инициализировано OUTPUTS : out std_logic_vector(55 downto 0) := (others => '0') signal OutState : OutStateType := ST_IDLE; signal outs : std_logic_vector(55 downto 0) := (others => '0'); это в Quartus 21.1 Изменено 7 февраля, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба 1 hour ago, jenya7 said: не понял. а чем этот код оличается от моего? if (rst) begin OutState <= ST_IDLE; OUTPUTS <= '0; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба 19 minutes ago, des00 said: if (rst) begin OutState <= ST_IDLE; OUTPUTS <= '0; end добавил рисет и он конечно же ничего не поменял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 февраля, 2022 Опубликовано 7 февраля, 2022 · Жалоба 1 hour ago, jenya7 said: добавил рисет и он конечно же ничего не поменял. У вас в одном месте OUTPUTS <= outs; А в другом OutState <= ST_IDLE; for (int i = 0; i < 55; i++) begin if (OUT_MASK(i)) begin OUTPUTS(i) <= OUT_ON_OFF(i); end end Вы как бы определитесь с какой переменой работаете как с выходом c outs или OUTPUTS ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 13 hours ago, jenya7 said: добавил рисет и он конечно же ничего не поменял. т.е. вы взяли код из вашего первого поста (именно первого, а не последующий код, который противоречит здравому смыслу), добавили сброс, добавили активацию сброса в тестбенче и у вас все по прежнему? Если вы сделали именно вот так, как описал, прикладывайте файлы. 11 hours ago, RobFPGA said: У вас в одном месте А в другом Вы как бы определитесь с какой переменой работаете как с выходом c outs или OUTPUTS ? более того, эта штука синтезировалась в какутсе и правильно работает в железе. И кто-то тут будет убеждать, что VHDL не допускает говногода (с)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 (изменено) · Жалоба 15 hours ago, RobFPGA said: У вас в одном месте OUTPUTS <= outs; А в другом OutState <= ST_IDLE; for (int i = 0; i < 55; i++) begin if (OUT_MASK(i)) begin OUTPUTS(i) <= OUT_ON_OFF(i); end end Вы как бы определитесь с какой переменой работаете как с выходом c outs или OUTPUTS ? аааа. конечно это ошибка моя. как это скомпилировалось непонятно. теперь всё зелененькое но выход не обновляет состояние (хотя в железе это работает) Изменено 8 февраля, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_su 1 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба В тестбенче задайте signal reset : std_logic := '1'; У Вас же действующий уровень reset высокий? А после wait for 20 ns; снимите reset reset <= '0'; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 10 minutes ago, andrew_su said: В тестбенче задайте signal reset : std_logic := '1'; У Вас же действующий уровень reset высокий? А после wait for 20 ns; снимите reset reset <= '0'; у меня рисет при 1. сделал так reset <= '1'; wait for 20 ns; reset <= '0'; но при втором изменении s_on_off <= X"00000000000003"; s_out_trig <= '1'; wait for 20 ns; s_out_trig <= '0'; выход должен стать 3 а он остался F. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 33 minutes ago, jenya7 said: выход должен стать 3 а он остался F. автомат ваш смотрите, за счет своих двух фаз, он децимирует работу вашего устройства. Это же видно из кода первого вашего поста. Ощущение что вы в слепую разрабатываете и код и тестбенч, не понимая циклограмм описанного вами устройства. Возьмите тетрадку и разрисуйте как оно работает, тогда и будут ответы на все ваши вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 (изменено) · Жалоба 17 minutes ago, des00 said: автомат ваш смотрите, за счет своих двух фаз, он децимирует работу вашего устройства. Это же видно из кода первого вашего поста. Ощущение что вы в слепую разрабатываете и код и тестбенч, не понимая циклограмм описанного вами устройства. Возьмите тетрадку и разрисуйте как оно работает, тогда и будут ответы на все ваши вопросы. вот не понял что не так в автомате. объясните по простому. в Signal Tap всё красиво, всё отрабатывает как надо. Изменено 8 февраля, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться