kostage 0 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба Подскажите, пожалуйста, почему этот простой счетчик, считающий туда-сюда, симулируется на MAX7000s, а на Stratix, к примеру, не работает? Quartus 8.1 Web Edition LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE IEEE.std_logic_unsigned.all; ENTITY lpm_counter0 IS PORT ( clk : IN STD_LOGIC; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END lpm_counter0; ARCHITECTURE SYN OF lpm_counter0 IS SIGNAL summ : STD_LOGIC_VECTOR (3 DOWNTO 0); signal equal : STD_LOGIC; signal updown : STD_LOGIC; begin q <= summ; equal <= '1' when summ = "1111" or summ = "0000" else '0'; updown <= not updown when rising_edge(equal); process(clk) begin if rising_edge(clk) and updown = '0' then summ <= summ + "0001"; elsif rising_edge(clk) and updown = '1' then summ <= summ - "0001"; end if; end process; END SYN; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба Так это - того, тут же ошибка в кодировании: process(clk) begin if rising_edge(clk) and updown = '0' then summ <= summ + "0001"; elsif rising_edge(clk) and updown = '1' then summ <= summ - "0001"; end if; end process; Попробуйте так: process(clk) begin if rising_edge(clk) then if updown = '0' then summ <= summ + "0001"; else -- updown = '1' summ <= summ - "0001"; end if; end if; end process; Почитайте более детально, что такое Rising_edge и 'Event. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostage 0 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба Да, сспасибо, так правильнее несомненно. Но ничего не изменилось, при задании MAX7000 оно симулируется, а на других девайсах нет. Наверное дело в каких-то настройках проекта на древних плисах симулируется, а на более поздних я пытаюсь просто скомпилировать и симулировать этот же проект, и он не работает. Гугл не помогает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба 2 kostage updown <= not updown when rising_edge(equal); асинхра однако, может в этом проблема ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostage 0 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба да, в ней в самой, я уж заметил, пронаблюдав поведение асинхронных промежуточных сигналов. Там есть пульсы, которые образуются в переклюючениях счетчика. Проверку суммы надо делать синхронной. Хороший урок так-то лучше LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE IEEE.std_logic_unsigned.all; ENTITY lpm_counter0 IS PORT ( clk : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); equal : inout STD_LOGIC; updown :inout STD_LOGIC ); END lpm_counter0; ARCHITECTURE SYN OF lpm_counter0 IS SIGNAL summ : STD_LOGIC_VECTOR (3 DOWNTO 0); begin q <= summ; equal <= '1' when summ = "1111" or summ = "0000" else '0'; process(clk) begin if falling_edge(clk) then if summ = "0000" or summ = "1111" then updown <= not updown; end if; end if; end process; process(clk) begin if rising_edge(clk) then if updown = '0' then summ <= summ + "0001"; else -- updown = '1' summ <= summ - "0001"; end if; end if; end process; END SYN; Электронихх способствует просветлению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 21 сентября, 2012 Опубликовано 21 сентября, 2012 · Жалоба Электронихх способствует просветлению Вообще во всех софтовых инструментах есть шаблоны. Изобретать велосипед неплохо, но прежде чем выкладывать опусы в форуме проще посмотреть шаблоны... Где они находятся я написал в "Кратком Курсе"... Это у меня на сайте, в статьях. Ну и есть лабораторные работы по курсам повышения квалификации, у Альтеры точно выложено... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostage 0 21 сентября, 2012 Опубликовано 21 сентября, 2012 (изменено) · Жалоба Спасибо! Да и еще надо контролировать вместе с суммой и направление счета process(clk) begin if falling_edge(clk) then if summ = "0000" and updown = '0' then updown <= not updown; elsif summ = "1111" and updown = '1' then updown <= not updown; end if; end if; end process; Изменено 21 сентября, 2012 пользователем kostage Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться