Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: парочка
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
essev
Всем привет.
У меня есть парочка дилетантских вопросов:

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
Цитата(essev @ Jan 11 2011, 09:16) *
Как я понимаю приведенный ниже пример описания триггера инициализирует его '1' только при моделировании?

Нет, в FPGA это может работать, потому что триггеры в FPGA могут быть инициализированы прошивкой.

Цитата(essev @ Jan 11 2011, 09:16) *
2) Приведенный выше код Precision Synthesys синтезирует как Д-триггер с en клока равным всегда '1', а также синтезирует мультиплексор. Почему так?

Потому что триггер с enable устроен именно так, а вынос мультиплексора наружу теоретически может повлечь объединение его с предыдущим уровнем логики. Однако, это все интересно только для ASIC, и почему он так делает для FPGA - сказать затруднительно.
sazh
Цитата(essev @ Jan 11 2011, 09:16) *
1) на выходном порте стоит Д-триггер.
Нужно чтобы при включении питания он был = '1'. Как это можно сделать?
У меня нет внешнего ресета. И даже вполне возможно, что схема некоторое время вообще без синхронизации находится.
Но надо чтобы выходной триггер порта при включении питания вставал в '1'.
2) Приведенный выше код Precision Synthesys синтезирует как Д-триггер с en клока равным всегда '1', а также синтезирует мультиплексор. Почему так?


Откуда взялся мультиплексор непонятно, ибо в описания сплошные синтаксические ошибки.
Посмотрите у xilinx документ xst.pdf и синтезируйте.
А чтоб устанавливался в 1, то по логике - по асинхронному ресету он в 1 должен устанавливаться.
if (reset = '1') then
q <= '0'; -- q <= '1';
essev
ПЛИСина = ЦПЛД МАХ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;

Цитата(DmitryR @ Jan 11 2011, 09:39) *
Нет, в FPGA это может работать, потому что триггеры в FPGA могут быть инициализированы прошивкой.


Потому что триггер с enable устроен именно так, а вынос мультиплексора наружу теоретически может повлечь объединение его с предыдущим уровнем логики. Однако, это все интересно только для ASIC, и почему он так делает для FPGA - сказать затруднительно.



Так,а почему вход CE просто к '1' подтянут. Почему синтезатор его не пользует или рисует почему зря sm.gif
sazh
Цитата(essev @ Jan 11 2011, 13:37) *
ПЛИСина = ЦПЛД МАХ2
if (reset = '1') then
Q <= '0';


Про сторонний синтезатор сказать ничего не могу.
Да и чем он лучше квартусовского.
В квартусе однозначно получите требуемое на Вашем семействе:
если проект переименуете отлично от имени примитива,
присваивание 1 сделаете в разделе инициализации (ввести в проект сигнал)
essev

Получил долгожданный простой триггер sm.gif


Но инициализация не катит (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
инвертор на вход инвертор на выход и все решено, если не доверяете установки с прошивки
essev
погуглил еще немного sm.gif

вот, что пишут про инициализацию в

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
[quote name='essev' date='Jan 15 2011, 22:45' post='868723']
Synthesis compilers ignore initial
values.
А квартус позволяет это делать.
В стороннем синтезаторе, как уже сказано инверсия по данным как на входе таки на выходе.
Сколько упорства - а результат то где?
essev
к сожалению, не было времени снова сесть за проект - вот добрался чуток sm.gif
id_gene
По включению в альтере все тригеры в "0".
Изменяется это для конкретных областей проекта в assignment editor -> logic options -> power-up level, а на деле квартус ставит инверторы, как было сказано выше.
Посик по хелпу квартуса
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.