GreySush 0 19 ноября, 2007 Опубликовано 19 ноября, 2007 · Жалоба Пытался спроектировать таймер (отсчитываются N входных сигналов-> на выход подаётся выходной сигнал ) Столкнулся со следующими проблемами: 1) Если не обнулить значение SIG выходного порта, то на временной диаграмме в результате симуляции будет постоянное значение 1. Действительно ли это необходимо делать для всех выходных сигналов? LIBRARY ieee; USE ieee.std_logic_1164.all; -- Entity Declaration ENTITY blok IS -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; SIG : OUT STD_LOGIC ); -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END blok; -- Architecture Body ARCHITECTURE blok_architecture OF blok IS signal COUNT: integer:=0; BEGIN process(CLK, RESET) begin if RESET = '1' then COUNT <= 0; elsif (CLK'event and CLK='1') then if (COUNT >=3) then COUNT <= 0; SIG <='1'; else COUNT <= COUNT + 1; SIG <='0'; -- если не выполнять это действие, на выходе SIG будет постоянная '1' end if; end if; end process; END blok_architecture; 2) При создании Waveform, для генерации значения сигнала использую инструмент Count Value? При попытке задать время окончания End time больше 2ps, получаю предупреждение "Insert legal end time". Чем это может быть вызвано, и как можно исправить? Проект для устройства MAX3000A/ EPM3064ALC44-4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 19 ноября, 2007 Опубликовано 19 ноября, 2007 · Жалоба как то оно у вас всё намучено странно - попробуйте вот так (элементарный пример) ---------------------------------------------------- library ieee ; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ---------------------------------------------------- entity counter is generic(n: natural :=2); port( clock: in std_logic; clear: in std_logic; count: in std_logic; Q: out std_logic_vector(n-1 downto 0) ); end counter; ---------------------------------------------------- architecture behv of counter is signal Pre_Q: std_logic_vector(n-1 downto 0); begin -- behavior describe the counter process(clock, count, clear,Pre_Q) begin if clear = '1' then Pre_Q <= Pre_Q - Pre_Q; elsif (clock='1' and clock'event) then if count = '1' then Pre_Q <= Pre_Q + 1; end if; end if; end process; -- concurrent assignment statement Q <= Pre_Q; end behv; ----------------------------------------------------- Это по ходу тупо бинарный счётчик - но если посмотреть в квартусе как конвертить в графические юниты а потом с них строить как в максе - чтоб долго не думать - быстренько счётчик - то можно кое чего добиться. Кстати хочу заметить что при компилировании приведённого фрагмента количество занимаемых ячеек 2 штуки , а у вашего фрагмента - 33 - да есчё икакой то лпм-коунтер как под объект типа вылазит... странно.. Хотя меня тож всё же интересует как начинаюсчего - что же это такое Info: Found 1 design units, including 1 entities, in source file ../../70/quartus/libraries/megafunctions/lpm_counter.tdf Info: Found entity 1: lpm_counter Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 17 19 ноября, 2007 Опубликовано 19 ноября, 2007 · Жалоба 1) Если не обнулить значение SIG выходного порта, то на временной диаграмме в результате симуляции будет постоянное значение 1. Действительно ли это необходимо делать для всех выходных сигналов? А в честь чего ему быть равным '0', если вы нигде его в '0' не устанавливали, а устанавливали только в '1'? Положим, компилятор сгенерирует такой код, что SIG будет равно '0' при начальном включении. Однако когда счетчик досчитает до COUNT >=3 он обязан его установить в '1', и после этого в '0' он никем никогда не установится. Вот компилятор подумал-подумал, и решил: "А нафига этот сигнал иметь в '0' при начальном включении, ведь этого никто не требовал? Поставлю-ка я его навсегда в '1', чего зря бомбить" LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; -- Entity Declaration ENTITY blok IS -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; SIG : OUT STD_LOGIC ); -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END blok; -- Architecture Body ARCHITECTURE blok_architecture OF blok IS signal COUNT : unsigned(1 downto 0); BEGIN process(CLK, RESET) begin if RESET = '1' then COUNT <= (others => '0'); SIG <='0'; -- при сбросе '0' elsif rising_edge(CLK) then SIG <='0'; -- по умолчанию '0' COUNT <= COUNT + 1; if (to_integer(COUNT) = 3) then COUNT <= (others => '0'); SIG <='1'; -- установить в '1' на один такт end if; end if; end process; END blok_architecture; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GreySush 0 20 ноября, 2007 Опубликовано 20 ноября, 2007 · Жалоба Спасибо всем ответившим за толковые советы. :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться