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

ПЛИС Cyclone-II с градацией -8

Можно ли синтезировать задержки таким способом:

Цитата
...
signal a:std_logic;
signal b:std_logic;
...
b<=a or a; -- 8NS Delay

b<=(a or a) or a; --16NS delay


или синтезатор оптимизирует и обрежет?

как правильнее? (PLL и внешнююсинхронизацию не предлагать)
Laptop
Цитата(%-) @ Nov 30 2009, 03:14) *
нужно сформировать из исходного сигнала - сигнал с некой задержкой 10 - 30 нс

ПЛИС Cyclone-II с градацией -8

Можно ли синтезировать задержки таким способом:



или синтезатор оптимизирует и обрежет?

как правильнее? (PLL и внешнююсинхронизацию не предлагать)

По синтаксису языка это всего лишь комментарий. Задержки в VHDL описываются другим способом и работают только при симуляции. Есть вариант собрать из ячеек в явном виде, но никто не гарантирует параметров.
%-)
Цитата(Laptop @ Nov 30 2009, 05:52) *
По синтаксису языка это всего лишь комментарий. Задержки в VHDL описываются другим способом и работают только при симуляции. Есть вариант собрать из ячеек в явном виде, но никто не гарантирует параметров.


a<=b after 20ns; -не годится так как это немного другое...

а как можно собрать из ячеек в явном виде ? (vhdl)
Shtirlits
Для таких больших задержек я знаю лишь одно решение - сдвиговый регистр тактируемый подходящей частотой.
%-)
Цитата(Shtirlits @ Nov 30 2009, 06:55) *
Для таких больших задержек я знаю лишь одно решение - сдвиговый регистр тактируемый подходящей частотой.


а как на нескольких вентилях сделать? и сколько наносекунд на каждый вентиль? ПЛИС указал в первом сообщении.

например c<= a and b; - сколько задержка?

и неужели нельзя несколько последовательно вентилей поставить? как это сделать?

квартус всё упрощает - выкидывая вентили
Dima_G
Цитата(%-) @ Nov 30 2009, 06:14) *
квартус всё упрощает - выкидывая вентили


И правильно делает. Дизайн схемы должен быть синхронный, и все "линии заержки" - это от лукавого.
Shtirlits
атрибут syn_keep описан в quartus hand book

задержка на LE определяется с трудом, так как зависит от:
- speed grade
- температуры
- напряжения питания
- разводки

скажите, а с какой точностью нужна задержка?
%-)
Цитата(Shtirlits @ Nov 30 2009, 07:41) *
атрибут syn_keep описан в quartus hand book

задержка на LE определяется с трудом, так как зависит от:
- speed grade
- температуры
- напряжения питания
- разводки

скажите, а с какой точностью нужна задержка?


точность +/-5нс.

есть стробы записи !WE, нужно получить ещё один с запаздыванием, чтобы адрес обновить.

вмешиваюсь в работу SRAM по записи - адрес выставляет плис, а данные с управлением - от процессора.

и это д.б. на 50 МГц
des00
Цитата(%-) @ Nov 29 2009, 22:18) *
точность +/-5нс.

есть стробы записи !WE, нужно получить ещё один с запаздыванием, чтобы адрес обновить.

вмешиваюсь в работу SRAM по записи - адрес выставляет плис, а данные с управлением - от процессора.

и это д.б. на 50 МГц


нцатый раз советую, сделайте синхронный дизайн !!!
%-)
Цитата(des00 @ Nov 30 2009, 07:40) *
нцатый раз советую, сделайте синхронный дизайн !!!


вы хотите сказать что ПЛИС на задержкой 8нс справится с клоком 133 МГц ?

а вот мне хочется асинхронный - и буду его долбить!

сформировал простейший пример:

Код
library ieee;
use ieee.std_logic_1164.all;

entity fl is port
(
Port_WE:in std_logic;
SRAM0_WE:out std_logic;
SRAM1_WE:out std_logic
);
end;

architecture fl_arch of fl is

signal BUF:std_logic;
attribute syn_keep:integer;
attribute syn_keep of BUF:signal is 1;

begin
SRAM0_WE<=Port_WE;

BUF<=Port_WE;
SRAM1_WE<=BUF;

end fl_arch;


вот что кажет симулятор и РТЛ:

в целом доволен, можно определить задержку и каскадировать буферы, если надо.

устройство проектируется для работы в "тепличных условиях" 20градусов +/-10
Dima_G
Цитата(%-) @ Nov 30 2009, 08:06) *
а вот мне хочется асинхронный - и буду его долбить!
. . .
в целом доволен, можно определить задержку и каскадировать буферы, если надо.


Дело Ваше. Но рекомендую заранее купить шаманский бубен - при дальнейшем усложнении проекта будут вылезать такие чудесные грабли, что без шаманства не обойтись.

Видел тоску в глазах разработчика, описавшего HDLC в схемном вводе и асинхронном дизайне (точнее, он предпологал, что клок, проходящий через несколько блоков комбинационной логики остается синхронным клоком smile.gif )
Сий HDLC контроллер загадочнейшим образом глючил-с. Попытка вывести тестовые сигналы на определенные пины ФПГА (те тупо - wire с какой-то точки) творила чудеса - глюки частично пропадали. Пропадали настолько, что их было тяжело поймать, но при долгой работе - вылезали.
Кое-как через пару месяцев мучений сделали более или менее рабочую сборку и зафиксировали ее как read-only smile.gif
Сейчас, на предложение "чуть-чуть кое-что изменить" разработчик издает нечеловеческий рев и накрывает грудью проект.

Вы идете к тому же
Shtirlits
Сделать асинхронный дизайн гарантирующий правильную работу во всем диапазоне условий трудно.
Оно заработает у вас на столе, но может глючить при на первый взгляд незаметных изменениях условий.
Инструменты заточены именно под синхронные схемы.

Не понимаю, почему такая тема возникает при работе с микросхемой с 2 и более PLL на борту.

Я бы сделал второй клок.

PS: к счастью, большинство работодателей будет интересовать только ваш диплом
%-)
можете оставаться при своих "синхронных" мнениях, но существуют теже чипы видеоконтроллеров с АСИНХРОННЫМ интерфейсом, которые могут манипулировать с адресом своей SRAM ПОСЛЕ каждой записи по асинхронной шине.
и вовсе без синхронности и на частотах до 100 мгц включительно.

теже видеоконтроллеры от Epson.

неужели ПЛИС такие убогие, что это не реализуемо на асинхронке? А?
SM
Цитата(%-) @ Nov 30 2009, 08:53) *
неужели ПЛИС такие убогие, что это не реализуемо на асинхронке? А?

Реализуемо, но не на таком уровне, как Ваши вопросы. Нужно четко понимать структуру конкретной ПЛИС, и оперировать на уровне логических ячеек и путей разводки. А не на уровне языковых конструкций.
Dima_G
Цитата(%-) @ Nov 30 2009, 09:53) *
можете оставаться при своих "синхронных" мнениях, но существуют теже чипы видеоконтроллеров с АСИНХРОННЫМ интерфейсом, которые могут манипулировать с адресом своей SRAM ПОСЛЕ каждой записи по асинхронной шине.
неужели ПЛИС такие убогие, что это не реализуемо на асинхронке? А?


Не путайте FPGA и ASIC!
SM
Цитата(Dima_G @ Nov 30 2009, 08:56) *
Не путайте FPGA и ASIC!

Они оба подчиняются одним и тем же правилам. И зависимости времянок от температуры/питания/процесса около-те-же. (только не думайте, что я советую идти асинхронным путем, просто нет ничего невозможного, особенно если констрейнить вплоть до физического расположения ячеек).
Boris_TS
Цитата(des00 @ Nov 30 2009, 07:40) *
нцатый раз советую, сделайте синхронный дизайн !!!
Слушай умного человека, внимательно слушай.

Цитата(%-) @ Nov 30 2009, 08:06) *
вы хотите сказать что ПЛИС на задержкой 8нс справится с клоком 133 МГц ?
В большинстве случаев умным людям хватит и 66 МГц. Разве свет клином сошелся только на одном из двух фронтов тактовых импульсов ?

Цитата(%-) @ Nov 30 2009, 08:06) *
а вот мне хочется асинхронный - и буду его долбить!

Да, да ! Долбись головой об стену ! Только когда прийдёт другая партия ПЛИС, немного измениться питание (из-за другой серии источников питания) не удивляйся почему задержки резко изменились.
des00
Цитата(%-) @ Nov 29 2009, 23:53) *
можете оставаться при своих "синхронных" мнениях, но существуют теже чипы видеоконтроллеров с АСИНХРОННЫМ интерфейсом, которые могут манипулировать с адресом своей SRAM ПОСЛЕ каждой записи по асинхронной шине. и вовсе без синхронности и на частотах до 100 мгц включительно.


Какое отношение имеет асинхронный интерфейс к синхронному дизайну? Не мешайте все в одну кучу.

Цитата
неужели ПЛИС такие убогие, что это не реализуемо на асинхронке? А?


реализуемо но не с вашим уровнем владения цифровой схемотехникой и ПЛИС а частности. Без обид, это констатация факта %)
SM
Цитата(%-) @ Nov 30 2009, 08:06) *
вы хотите сказать что ПЛИС на задержкой 8нс справится с клоком 133 МГц ?

И кто же это Вас так жестоко дезинформировал? Неужели собственные догадки на тему восьмерки в маркировке микрухи?
%-)
уговорили.
буду на синхронке делать.

есть CLKOUT - выход с процессора, к нему привязаны все времянки остальных сигналов:

we - строб записи
a - адрес
d - данные
cs - выбор чипа

времянка на рисунке ниже.

Tsetup=2clk
Thold =1 clk
Twrite=2 clk
Ttransition=1 clk

Помогите пожалуйста кодом - как можно сделать синхронно!
sazh
Цитата(%-) @ Nov 30 2009, 08:06) *
в целом доволен, можно определить задержку и каскадировать буферы, если надо.


Хоззяин - барин.
Код
module lcell_xor
(
input  in_strob,
output out_a,
output out_b
);

wire   out_lcell[5:0];

lcell     lcell_a  (
                   .in         (in_strob),
                   .out        (out_lcell[0])
                   );

genvar i;
    generate for (i = 1; i <= 5; i = i + 1)
        begin : block
lcell    lcell_b  (
                   .in         (out_lcell[i-1]),
                   .out        (out_lcell[i])
                   );    
        end
    endgenerate

assign out_a = out_lcell[1] ^ out_lcell[5];
assign out_b = (out_lcell[2] != out_lcell[4]);

endmodule
%-)
Цитата(SM @ Nov 30 2009, 09:30) *
И кто же это Вас так жестоко дезинформировал? Неужели собственные догадки на тему восьмерки в маркировке микрухи?


кстати, а что означает восьмёрка в конце? задержка от одного входного пина на другой выходной пин?

помогите плиз с синхронным интерфейсом (времянки в предыдущем мойм сообщении)
CLKOUT=133 мгц
Shtirlits
Времянки видно, но я решительно не понимаю, в чем затруднение?
SM
Цитата(%-) @ Nov 30 2009, 09:43) *
кстати, а что означает восьмёрка в конце?

А ничего не означает. Так, условный попугай, происхождение которого известно разве что разработчикам кристалла.

Цитата(%-) @ Nov 30 2009, 09:43) *
помогите плиз с синхронным интерфейсом (времянки в предыдущем мойм сообщении)

А что помогать-то? Нарисуйте схему на бумажке из триггеров и логики, и опишите потом на удобном вам языке.
%-)
Цитата(Shtirlits @ Nov 30 2009, 10:48) *
Времянки видно, но я решительно не понимаю, в чем затруднение?


как привязать остальные сигналы к CLOCKOUT ?

завести счётчик CLKOUT? и в зависимости от его значения ловить данные и адрес?

P.S. никогда не нарезал сигналы по клоку.

Люди!
Покажите как это делается!!!
des00
Цитата(%-) @ Nov 30 2009, 01:08) *
как привязать остальные сигналы к CLOCKOUT ?
Покажите как это делается!!!


в ваших предыдущих темах вам несколько раз рассказывали как это делается. поднимите старые темы.

если на картинке все что вам нужно, то я бы сделал как то так

Код
wire clk = clkout_from_pll_in_zero_buffer_mode;

always_ff @(posedge clk) begin
  // IO register latch
  a_reg   <= a;
  d_reg   <= d;
  nrd_reg <= nrd;
  nwr_reg <= nwr;
  ncs_reg <= ncs;
  //
  write   <= ~nwr_reg & ~write & ~ncs_reg;
end

always_ff @(posedge clk) begin
  if (write) begin
    case (a_reg)
      // bla-bla-bla
    endcase
  end
end


PS. Write access достаточно одного такта.
%-)
Цитата(des00 @ Nov 30 2009, 11:23) *
в ваших предыдущих темах вам несколько раз рассказывали как это делается. поднимите старые темы.

если на картинке все что вам нужно, то я бы сделал как то так

Код
wire clk = clkout_from_pll_in_zero_buffer_mode;

always_ff @(posedge clk) begin
  // IO register latch
  a_reg   <= a;
  d_reg   <= d;
  nrd_reg <= nrd;
  nwr_reg <= nwr;
  ncs_reg <= ncs;
  //
  write   <= ~nwr_reg & ~write & ~ncs_reg;
end

always_ff @(posedge clk) begin
  if (write) begin
    case (a_reg)
      // bla-bla-bla
    endcase
  end
end


PS. Write access достаточно одного такта.


огромное спасибо smile.gif

у вас CLK берется с PLL плис, но процессор имеет свой CLKOUT - можно ли на него зацепиться через входной пин плис?

в какой момент можно изменить адрес у памяти? во время Transition Time?

можно ли CLKOUT(133МГц) взять с платы проводом длиной 15 см , присоединив резисторы по 33 ом к процессору и входной ноге плис?
Shtirlits
"конечный автомат" реализованный любым способом, чем нагляднее - тем меньше места ошибке.
Ниже не самый лучший вариант, но для примера сгодится.
Сигналы ready и AD_out совпадают с точностью до полярности. Так получается, что автомат готов именно тогда, когда не пишет в память.
Код
    type state_t is (
        st_idle,
        st_setup_1,
        st_setup_2,
        st_write_1,
        st_write_2,
        st_hold
    );
    
    signal state : state_t;

          
    
begin

    RD <= '0';

    
    process(reset, clk)
    begin
        if (reset='1') then
            state <= st_idle;
            CS_out <= '1';
            AD_out <= '0';
            nWE_out <= '1';
            ready <= '0';
        elsif rising_edge(clk) then
            AD_out <= '1';
            ready <= '0';
            CS_out <= '1';
            case state is
                when st_idle =>
                    if cmd_write='1' then
                        state <= st_setup_1;
                    else
                        AD_out <= '0';
                        ready <= '1';
                    end if;
                when st_setup_1 =>
                    state <= st_setup_2;
                when st_setup_2 =>
                    state <= st_write_1;
                when st_write_1 =>
                    CS_out <= '0';
                    state <= st_write_2;
                when st_write_2 =>
                    CS_out <= '0';
                    state <= st_hold;
                when st_hold =>
                    ready <= '1';
                    state <= st_idle;
            end case;
        end if;
    end process;
SM
Цитата(%-) @ Nov 30 2009, 10:30) *
можно ли CLKOUT(133МГц) взять с платы проводом длиной 15 см , присоединив резисторы по 33 ом к процессору и входной ноге плис?

К ноге ПЛИС не надо резистора, только у источника сигнала.
des00
Цитата(%-) @ Nov 30 2009, 01:30) *
у вас CLK берется с PLL плис, но процессор имеет свой CLKOUT - можно ли на него зацепиться через входной пин плис?


не просто с PLL, а с PLL в режиме компенсации задержек IO буфера, у альтеры этот режим называется ZeroDelayBuffer. У ксайлов Source Synchronus Mode. На вход этой PLL и подаете CLKOUT с проца. ИМХО так будет лучше всего. В противном случае (если PLL использовать нельзя) нужно будет учитывать задержку клока до триггеров в IO буфере.

Либо делать систему с нарезкой сигнала на собственной тактовой частоте от локального генератора. Тогда логику формирования сигнала записи надо будет поменять (относительно моего примера).

Цитата
в какой момент можно изменить адрес у памяти? во время Transition Time?


не совсем понимаю что у вас "память", если это плис которую проц видит как память, то проц может менять адрес в каждой новой транзакции. Если фпга транслирует то что приняла от проца к своей памяти, то ИМХО после завершения доступа к этой памяти.
SM
Цитата(des00 @ Nov 30 2009, 10:55) *
нужно будет учитывать задержку клока до триггеров в IO буфере.

А для этого в каждом IO-буфере есть спец-элемент задержки. Так что не вижу никаких проблем. Как раз ZeroDelay тут скорее всего лишний, так как потенциально возникнет некий гемор с тем, что задержка в IO буфере будет больше, чем в клокодреве.
des00
Цитата(SM @ Nov 30 2009, 02:16) *
А для этого в каждом IO-буфере есть спец-элемент задержки. Так что не вижу никаких проблем. Как раз ZeroDelay тут скорее всего лишний, так как потенциально возникнет некий гемор с тем, что задержка в IO буфере будет больше, чем в клокодреве.


альтера рекомендует именно этот режим PLL для выравнивания клоков и данных в source synchronus интерфейсах. Делал именно так на хилых, правда для техасовского EMIFа на 133МГц интерфейс работал нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.