essev 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Всем привет. У меня есть парочка дилетантских вопросов: 1) на выходном порте стоит Д-триггер. Нужно чтобы при включении питания он был = '1'. Как это можно сделать? У меня нет внешнего ресета. И даже вполне возможно, что схема некоторое время вообще без синхронизации находится. Но надо чтобы выходной триггер порта при включении питания вставал в '1'. Как я понимаю приведенный ниже пример описания триггера инициализирует его '1' только при моделировании? entity dff is port (rest,clk,d,en: in std_logic; q: out std_logic := '1'; ); end dff; architecture behav of dff is begin if (reset = '1') then q <= '0'; elsif (rising_edge(clk)) then if (en='1') then q<= d; end if; end if; end process; end behav; 2) Приведенный выше код Precision Synthesys синтезирует как Д-триггер с en клока равным всегда '1', а также синтезирует мультиплексор. Почему так? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Как я понимаю приведенный ниже пример описания триггера инициализирует его '1' только при моделировании? Нет, в FPGA это может работать, потому что триггеры в FPGA могут быть инициализированы прошивкой. 2) Приведенный выше код Precision Synthesys синтезирует как Д-триггер с en клока равным всегда '1', а также синтезирует мультиплексор. Почему так? Потому что триггер с enable устроен именно так, а вынос мультиплексора наружу теоретически может повлечь объединение его с предыдущим уровнем логики. Однако, это все интересно только для ASIC, и почему он так делает для FPGA - сказать затруднительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба 1) на выходном порте стоит Д-триггер. Нужно чтобы при включении питания он был = '1'. Как это можно сделать? У меня нет внешнего ресета. И даже вполне возможно, что схема некоторое время вообще без синхронизации находится. Но надо чтобы выходной триггер порта при включении питания вставал в '1'. 2) Приведенный выше код Precision Synthesys синтезирует как Д-триггер с en клока равным всегда '1', а также синтезирует мультиплексор. Почему так? Откуда взялся мультиплексор непонятно, ибо в описания сплошные синтаксические ошибки. Посмотрите у xilinx документ xst.pdf и синтезируйте. А чтоб устанавливался в 1, то по логике - по асинхронному ресету он в 1 должен устанавливаться. if (reset = '1') then q <= '0'; -- q <= '1'; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 11 января, 2011 Опубликовано 11 января, 2011 (изменено) · Жалоба ПЛИСина = ЦПЛД МАХ2 так в том-то и загвоздка, что нужно, чтобы без всяких ресетов и пресетов устанавливался, т.к. их при включении питания может и не быть. То есть нужно чтобы триггеры были уже предустановленными при включении питания. Вот выдержка из даташита на МАХ2 By default, all registers in MAX II devices are set to power-up low. However, this power-up state can be set to high on individual registers during design entry using the Quartus II software. Получается каждому конкретному триггеру можно назначить свое значение при включении. Я так понимаю это в hdl коде можно делать? Или я не прав? Но вот синтезатор не воспринимает инициализацию триггера. LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY dff_new IS PORT( D : IN std_logic; clk : IN std_logic; en : IN std_logic; reset : IN std_logic; Q : OUT std_logic := '1' ); END dff_new ; LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ARCHITECTURE struct OF dff_new IS BEGIN process(reset,clk) begin if (reset = '1') then Q <= '0'; elsif (rising_edge(clk)) then if (en = '1') then Q <= D; end if; end if; end process; END struct; Нет, в FPGA это может работать, потому что триггеры в FPGA могут быть инициализированы прошивкой. Потому что триггер с enable устроен именно так, а вынос мультиплексора наружу теоретически может повлечь объединение его с предыдущим уровнем логики. Однако, это все интересно только для ASIC, и почему он так делает для FPGA - сказать затруднительно. Так,а почему вход CE просто к '1' подтянут. Почему синтезатор его не пользует или рисует почему зря :) Изменено 11 января, 2011 пользователем essev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба ПЛИСина = ЦПЛД МАХ2 if (reset = '1') then Q <= '0'; Про сторонний синтезатор сказать ничего не могу. Да и чем он лучше квартусовского. В квартусе однозначно получите требуемое на Вашем семействе: если проект переименуете отлично от имени примитива, присваивание 1 сделаете в разделе инициализации (ввести в проект сигнал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Получил долгожданный простой триггер :) Но инициализация не катит (Precision Synthesis пишет 0 Initial value for q is ignored for synthesis.) - может в коде че-нить поправить? Привожу код еще раз LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY dff_new IS PORT( clk : IN std_logic; d : IN std_logic; en : IN std_logic; reset : IN std_logic; q : OUT std_logic := '1' ); END dff_new ; -- LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ARCHITECTURE struct OF dff_new IS -- Architecture declarations -- Internal signal declarations BEGIN process(reset,clk) begin if (reset = '1') then q <= '0'; elsif (rising_edge(clk)) then if (en = '1') then q <= d; end if; end if; end process; END struct; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DW0 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба инвертор на вход инвертор на выход и все решено, если не доверяете установки с прошивки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 15 января, 2011 Опубликовано 15 января, 2011 · Жалоба погуглил еще немного :) вот, что пишут про инициализацию в http://courses.engr.illinois.edu/ece385/do...dl_tutorial.pdf "Do not specify initial values in signal declarations. Synthesis compilers ignore initial values. Initial values can be assigned explicitly under a controlling signal (e.g. reset)." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 15 января, 2011 Опубликовано 15 января, 2011 · Жалоба Synthesis compilers ignore initial values. А квартус позволяет это делать. В стороннем синтезаторе, как уже сказано инверсия по данным как на входе таки на выходе. Сколько упорства - а результат то где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 15 января, 2011 Опубликовано 15 января, 2011 · Жалоба к сожалению, не было времени снова сесть за проект - вот добрался чуток :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба По включению в альтере все тригеры в "0". Изменяется это для конкретных областей проекта в assignment editor -> logic options -> power-up level, а на деле квартус ставит инверторы, как было сказано выше. Посик по хелпу квартуса Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться