Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение данных из CPU в FPGA
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
%-)
сигналы:
ce - выбор ПЛИС (активное 0)
we - запись в ПЛИС (активное 0)
d[7 downto 0] - данные которые надо записать в ПЛИС

как сделать простейшее чтение данных из шины процессора в ПЛИС на vhdl ?

наподобие как запись в SRAM
SFx
а почему шина адреса не используется? все подряд данные собираетесь в плис гнать?
конструкцию модуля определяет не только входной, но и выходной интерфейс.
выходной интерфейс каким планируете ?
какое количество данных будете записывать в плис? как будете эти данные систематизировать?
SM
вот на верилоге. на вхдл сами переводите если очень надо, не люблю монстров. Только тут еще сигнал OE есть, который, наверное, вы забыли.

Код
module simple_reg (d, nce, noe, nwe);
  inout [7:0] d;
  input nce, nwe, noe;

  reg [7:0] rg;

  // latch data from bus by nwe low
  always @*
    if (!nce & !nwe) rg <=  d;

  // read to bus while nce & noe low
  assign d = (nce | noe) ? 8'hzz : rg;

endmodule
%-)
Цитата(SFx @ Nov 23 2009, 10:22) *
а почему шина адреса не используется? все подряд данные собираетесь в плис гнать?


да.

Цитата(SFx @ Nov 23 2009, 10:22) *
конструкцию модуля определяет не только входной, но и выходной интерфейс.
выходной интерфейс каким планируете ?


только запись в ПЛИС.

Цитата(SFx @ Nov 23 2009, 10:22) *
какое количество данных будете записывать в плис? как будете эти данные систематизировать?


нужно передавать байты данных в ПЛИС. один за другим.
ассертить cs в 0 на время всей передачи запрещается - щёлкать 1-0-1 для каждого байта.


Цитата(SM @ Nov 23 2009, 10:39) *
вот на верилоге. на вхдл сами переводите если очень надо, не люблю монстров. Только тут еще сигнал OE есть, который, наверное, вы забыли.

Код
module simple_reg (d, nce, noe, nwe);
  inout [7:0] d;
  input nce, nwe, noe;

  reg [7:0] rg;

  // latch data from bus by nwe low
  always @*
    if (!nce & !nwe) rg <=  d;

  // read to bus while nce & noe low
  assign d = (nce | noe) ? 8'hzz : rg;

endmodule


Перевёл:
Код
process
begin
if ce='0' and we='0' then
  rg<=d;
end if;
end process;

d<=(others => 'Z') when ce=1 or oe=1 else rg;


праильно?

что-то совсем всё просто получается... слыхал что по фронту нужно фиксировать данные, а не по уровню. кому верить?
SM
Цитата(%-) @ Nov 23 2009, 09:57) *
слыхал что по фронту нужно фиксировать данные, а не по уровню. кому верить?


Так расскажите побольше. Может и по фронту нужно у вас. Вы же сказали, "как в SRAM", я подразумевал, что как в асинхронную SRAM. А если по фронту, то еще и тайминги все рассказывайте. А может у вас там еще и к клоку надо все привести. В общем - телепаты в отпуске, каков вопрос, таков ответ.
%-)
Цитата(SM @ Nov 23 2009, 10:04) *
Так расскажите побольше. Может и по фронту нужно у вас. Вы же сказали, "как в SRAM", я подразумевал, что как в асинхронную SRAM. А если по фронту, то еще и тайминги все рассказывайте. А может у вас там еще и к клоку надо все привести. В общем - телепаты в отпуске, каков вопрос, таков ответ.


зря обижаетесь. вашим ответом доволен. просто я сам не знаю какой тайминг подойдет лучше.

Скажу лучше процессор. ADSP BF533. Именно он будет слать данные. Через асинхронный банк

Setup=1 такт, we=1 такт , hold =0 тактов. Частота clk=133.3333 МГц

Не понятно по каким признакам вести запись(фронты или уровни?) sad.gif
Dima_G
Цитата(%-) @ Nov 23 2009, 11:17) *
зря обижаетесь. вашим ответом доволен. просто я сам не знаю какой тайминг подойдет лучше.

Скажу лучше процессор. ADSP BF533. Именно он будет слать данные. Через асинхронный банк

Setup=1 такт, we=1 такт , hold =0 тактов. Частота clk=133.3333 МГц

Не понятно по каким признакам вести запись sad.gif


Лучше привести внешние сигналы к глобальному клоку ФПГА + добавить цепочку триггеров для подавления метастабильности
SM
Вы сначала определитесь, что эти данные с выхода регистра делать будут. Если зажигать светодиоды - это одно, защелка оптимальна будет. А если например поступать в FIFO, или еще куда на дальнейшую обработку, то это второй вопрос. Если на обработку - тогда рассказывайте в чем ее суть, какой длительности импульс we, какой клок в обработчике, привязан ли он к клоку DSP, если привязан, то с какими сетапами-холдами по каким сигналам. У меня нет документации на BF, и мне влом ее качать, чтобы смотреть все это самому.
dvladim
Цитата(%-) @ Nov 23 2009, 11:17) *
Скажу лучше процессор. ADSP BF533. Именно он будет слать данные. Через асинхронный банк
Setup=1 такт, we=1 такт , hold =0 тактов. Частота clk=133.3333 МГц
Не понятно по каким признакам вести запись(фронты или уровни?) sad.gif

Лучще вейвформу приведите.
А то можно и по фронту написать, но подойдет-ли?
Код
always @(negedge we)
  if (!cs)
    rg <= d;
%-)
диаграммы ниже.

отвечаю на вопросы от SM

данные должны помещаться в некий буфер (в простейшем случае- массив)
и ещё должен быть подсчёт байтов

вот такие задачи.

допускается настроить времянку так чтобы: Tsetup=1clk, Twrite=1 clk, Thold =0 clk
вот хочется получить быструю времянку smile.gif
clk=133 мгц
SM
Тогда, наверное, надо работать по CLKOUT (если ПЛИС работает по нему же) там ловить WE, и писать по нему. Предварительно очень внимательно изучив все цифры по времянкам, а именно всякие там tdo, tho, и определившись, успеет ли ПЛИС за такими времянками, и если успеет, какие где будут задержки.

А если ПЛИС работает не по CLKOUT, то нужен будет буфер, работающий асинхронно, и переход из него в тот клок-домен, по которому работает ПЛИС.
dvladim
Цитата(%-) @ Nov 23 2009, 12:37) *
диаграммы ниже.

Надо бы еще соответствие сигналов на времянке сигналам, которые идут в ПЛИС.

Если верно понял идут данные, AWE = we, cs не нашел. Так как AWE всегда делает 101, то проще по его фронту и захватывать и лучше по переднему, тогда для ПЛИС setup = 2 такта, hold = 0 (обконстрейните ПЛИС и посмотрите выполнение времянок). Ну или по заднему фронту, тогда setup = 1, hold = 1. Как в плис ляжет, так и делайте.
А потом через фифо приводите к внутреннему клоку плис.
Shivers
Смотря какие тайминги, и смотря как скорость ПЛИС. Для высоких скоростей работы я бы посоветовал делать полностью синхронный дизайн: работать по CKOUT, на все сигналы двойную синхронизацию, а только потом уже защелки.
Код
module simple_reg (CKOUT, d, nce, noe, nwe);
  inout [7:0] d;
  input nce, nwe, noe,CKOUT;

  reg [7:0] din_1d,din_2d, din, dout;
  reg nce_1d, nwe_1d, noe_1d, nce_2d, nwe_2d, noe_2d;

  // sync
  always @(posedge CLKOUT)
   begin
    nce_1d  <= nce;
    nce_2d  <= nce_1d;
    nwe_1d <= nwe;
    nwe_2d <= nwe_1d;
    noe_1d  <= noe;
    noe_2d  <= noe_1d;
    din_1d[7:0] <= d[7:0];
    din_2d[7:0] <= din_1d[7:0];
   end

//latches
  always @(posedge CLKOUT)
   begin
    if(nwe_2d & ~nwe_1d) din[7:0] <= din_2d[7:0];
    if(.....)  dout[7:0] <= ...
   end

  assign d = (nce | noe) ? 8'hzz : dout;

endmodule

Так получатся наилучшие сетапы, холды и общая fmax. Но будет больше потреблять, займет больше места внутри плис и т.д. В общем, свои + и -
des00
Цитата(Shivers @ Nov 23 2009, 03:46) *
Смотря какие тайминги, и смотря как скорость ПЛИС. Для высоких скоростей работы я бы посоветовал делать полностью синхронный дизайн: работать по CKOUT, на все сигналы двойную синхронизацию, а только потом уже защелки.


при работе на CLKOUT в режиме source-synchronus синхронизаторы вообще не нужны, а при работе на другом асинхронном клоке на все сигналы ставить синхронизаторы, это простите меня бред. К тому же чреватый потенциальными проблемами, данные и адрес хлопать на триггерах не имеет смысла, т.к. это мультицикловые пути и условие по setup/hold легко выполняется протоколом шины.
Shivers
Цитата(des00 @ Nov 23 2009, 13:43) *
при работе на CLKOUT в режиме source-synchronus синхронизаторы вообще не нужны, а при работе на другом асинхронном клоке на все сигналы ставить синхронизаторы, это простите меня бред. К тому же чреватый потенциальными проблемами, данные и адрес хлопать на триггерах не имеет смысла, т.к. это мультицикловые пути и условие по setup/hold легко выполняется протоколом шины.

Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине. В частности, в мостовых схемах асинхронных магистральных интерфейсов без этого никуда - внешний тактовый сигнал и сплошные схемы синхронизации. Опять же оговорюсь, этот кусок кода предназначен для помехоустойчивости, стабильности и хорошей времянки. Минусы емкость, ну и т.д. - писал выше.
des00
Цитата(Shivers @ Nov 23 2009, 06:40) *
Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине. В частности, в мостовых схемах асинхронных магистральных интерфейсов без этого никуда - внешний тактовый сигнал и сплошные схемы синхронизации. Опять же оговорюсь, этот кусок кода предназначен для помехоустойчивости, стабильности и хорошей времянки. Минусы емкость, ну и т.д. - писал выше.


Вы одно с другим путаете. Может быть в асинхронных магистральных интерфейсах вы и правы. Но тут стоит проц, на его шине висит фпга, Шина параллельная, синхронная, работающая в асинхронном режиме (расстояние между процом и фпга не выше ~10см). CLKOUT определяет на шине все. Если посмотрите внимательно на картинку то видно что проц выдерживает и setup/hold самостоятельно. Еще раз при работе от CLKOUT (source-synchronus) синхронизаторы ставить вообще смысла нет, адрес/данные это мултицикл, нужно только вырезать фазу сигнала записи/чтения. А при работе на клоке фпга в асинхронном режиме, ставить синхронизаторы как это делаете вы тоже смысла не имеет, т.к. проц опять же выдерживает setup/hold. Смысла в синхронизаторах на адресе/данных нет.

А насчет времянки повторю еще раз это мультицикловые пути, правильно пропишите констрейны и проблем не будет.
Shivers
Цитата(des00 @ Nov 23 2009, 17:27) *
Вы одно с другим путаете. Может быть в асинхронных магистральных интерфейсах вы и правы. Но тут стоит проц, на его шине висит фпга, Шина параллельная, синхронная, работающая в асинхронном режиме (расстояние между процом и фпга не выше ~10см). CLKOUT определяет на шине все. Если посмотрите внимательно на картинку то видно что проц выдерживает и setup/hold самостоятельно. Еще раз при работе от CLKOUT (source-synchronus) синхронизаторы ставить вообще смысла нет, адрес/данные это мултицикл, нужно только вырезать фазу сигнала записи/чтения. А при работе на клоке фпга в асинхронном режиме, ставить синхронизаторы как это делаете вы тоже смысла не имеет, т.к. проц опять же выдерживает setup/hold. Смысла в синхронизаторах на адресе/данных нет.

А насчет времянки повторю еще раз это мультицикловые пути, правильно пропишите констрейны и проблем не будет.

Я выше написал, что согласен насчет не-нужности двукаскадных схем синхронизаций для УЖЕ синхронного интерфейса. Тем не менее, первый каскад защелок кмк все равно надо ставить, даже если пути - малтисайкл. Точнее не так -
Если исходить из концепции простоты дизайна и нацеливаться на low power asic, то можно сразу ставить защелки с использованием незащелкнутых управляющих сигналов - т.е. делать простой интерфейс "как на россыпи".
Но! Если требуется стабильная и быстродействующая прошивка для ПЛИС, или же мы боремся со снижением нагрузки на цепи в асике, то имеет смысл ставить один(1) каскад d-триггеров на весь входной интерфейс, и уже потом разгребать всю логику внутри. Преимущества уже указаны - снижение нагрузки на цепи. С большой нагрузкой может и мальтисайкл 3 не спасти, а про разброс времянки от_разводки_к_разводке я и вовсе молчу. По крайней мере, отлаживая модель для PCI я добивался большей производительности именно введением дополнительных d-триггеров. Впрочем, в PCI еще и адрес/данные мультиплексированы, немного сложнее ситуация.
Итого, я с самого начала не опровергаю правильность первого кода, просто указал на возможную альтернативу более синхронной реализации, со своими + и - ессно. А картинку смотрел невнимательно, сразу не понял, что интерфейс синхронный, каюсь.
SM
Ну вы бы асики-то не приплетали... Там все на так, как в фпга, и вряд-ли товарищ на них нацелен. Кстати, что касается нагрузки в асиках, тоже все как когда. Бывает лучше триггер на входе посадить, а бывает - дерево буферов раскидать, раз на раз не приходится. Но к фпга это все равно отношения не имеет.
Shivers
Цитата(SM @ Nov 23 2009, 17:55) *
Ну вы бы асики-то не приплетали... Там все на так, как в фпга, и вряд-ли товарищ на них нацелен. Кстати, что касается нагрузки в асиках, тоже все как когда. Бывает лучше триггер на входе посадить, а бывает - дерево буферов раскидать, раз на раз не приходится. Но к фпга это все равно отношения не имеет.

Да в ПЛИС все то же самое, только вариантов влево-право меньше (что хуже, на самом деле). Если забито у цепи 20 нагрузок, то хоть об колено бейся, 21 не получишь(предположим, региональные клоки и пр. заняты). Приходится лишние триггера ставить, где можно. Или представьте, что входная защелка находится прямо в i/o пине и использует в качестве CE (или OE для бидира) внешний же сигнал - это какой route получится? Вот об этом я и писал выше
Да и асик тут очень при чем получается: поскольку, отлаживается он всегда в ПЛИС, а модель писать приходится совсем не с учетом ПЛИСовских фенечек. И проблем решать приходится подчас целых две - чтобы и там и там времянка хорошая была. Тут мое твердое мнение, что модель для асика должна быть прогнана в ПЛИС на 100%, за исключением только лишь заказных блоков. Чем больше мест в коде отличаются дефайнами ПЛИС/асик, тем больше косяков потом может вылезти.
SM
Цитата(Shivers @ Nov 23 2009, 18:04) *
Если забито у цепи 20 нагрузок, то хоть об колено бейся, 21 не получишь(предположим, региональные клоки и пр. заняты).

Да получишь, без проблем. Ценой наносекунды-другой какой-то. Те же буфера деревом. Но к вопросу, уверен, отношения это ничего не имеет. Товарищу данные просто в массив писать. Там одна проволока до входа блока памяти.
dvladim
Цитата(Shivers @ Nov 23 2009, 16:40) *
Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине.

Вот это уж, извините, как раз бред. Для синхронного интерфейса двойная буферизация не нужна, а для асинхронного при таком захвате
Код
    din_1d[7:0] <= d[7:0];
    din_2d[7:0] <= din_1d[7:0];
будет масса проблем.
%-)
вот часть дизайна, которая перехватывает обращение к регистрам управления (cs=0, we=0, a=0).
довольно часто происходят ложные срабатывания регистров - к ним не обращались, а они отрабатывают.

как можно избавиться?
синхронный вариант не предлагать.

Код
process(WE,CS,A)
begin
if CS='0' then
  if falling_edge(WE) then
   if A='0' then
    case D(15 downto 12) is
     --when "0000" =>    
      --R_D:=D(0);
     --when "0001" =>    
      --R_M<=D(1 downto 0);
     when "0010" =>      
      R_P<=D(0);
     when "0011" =>      
      R_X0<=D(8 downto 0);
      X<=D(8 downto 0);
     when "0100" =>      
      R_X1<=D(8 downto 0);
     when "0101" =>      
      R_Y0<=D(7 downto 0);
      Y<=D(7 downto 0);
     when "0110" =>      
      R_Y1<=D(7 downto 0);
     when "0111" =>
      R_C<=D(7 downto 0);
     when others =>null;
    end case;
BSV
Делал интерфейс с Блэкфином на Спартан 3. Использовал синхронный вариант + ARDY. Максимально быструю времянку получить цели не было. Что там на плате было не знаю - ваял удаленно, платы в глаза не видел. Претензий от заказчика не было.

В коде из Вашего крайнего поста не совсем понятно, почему данные защелкиваются по спаду WE (или это инвертированный сигнал AWEn?). Также было бы нелишним занести (if CS='0') then в тело (if falling_edge(WE) then) тогда это будет разрешение записи в регистр, а у Вас в терминах ПЛИС это получается непонятно что (весь код не приведен).

Если асинхронно, я бы делал так
Код
process(AWEn)
begin
  if (AWEn'event and AWEn = '1') then
    if (CS='0' and A='0' and  D(15 downto 12) = "0101") then
      Y<=D(7 downto 0);
    end if;
    ...
  end if;
end process;

Только при желаемых времянках (Tsetup=1clk, Twrite=1 clk, Thold =0 clk) нужно учитывать ИМХО, что например задержки от пинов CS, A, D(15:12) до триггеров должны быть не более 7,5 + (7,5 - 6) + 0,8 ns. Табличка с параметрами:
%-)
Цитата(BSV @ Nov 24 2009, 05:11) *
В коде из Вашего крайнего поста не совсем понятно, почему данные защелкиваются по спаду WE (или это инвертированный сигнал AWEn?). Также было бы нелишним занести (if CS='0') then в тело (if falling_edge(WE) then) тогда это будет разрешение записи в регистр, а у Вас в терминах ПЛИС это получается непонятно что (весь код не приведен).


WE - обычный сигнал стробирования (активный 0)
по фронту WE почему-то некорректно работает - скорее всего из-за того что данные уже недостоверны - нужно увеличивать Hold Time

Цитата(BSV @ Nov 24 2009, 05:11) *
Если асинхронно, я бы делал так
Код
process(AWEn)
begin
  if (AWEn'event and AWEn = '1') then
    if (CS='0' and A='0' and  D(15 downto 12) = "0101") then
      Y<=D(7 downto 0);
    end if;
    ...
  end if;
end process;


как быть если нужно опрашивать несколько регистров? номера регистров задаются в старших 4-х битах, остальные биты - содержимое

Цитата(BSV @ Nov 24 2009, 05:11) *
Только при желаемых времянках (Tsetup=1clk, Twrite=1 clk, Thold =0 clk) нужно учитывать ИМХО, что например задержки от пинов CS, A, D(15:12) до триггеров должны быть не более 7,5 + (7,5 - 6) + 0,8 ns. Табличка с параметрами:


а вот это очень горько sad.gif хотелось бы Tsetup=1clk @133MHz

ещё вопрос.
как быть если нужно с одними и теме же объектами работать по фроту, спаду и уровню? vhdl ругается - пишит что не может имплементировать регистры

вот полный процесс(откомментировал).

процесс должен подсчитывать байты и вычислять адрес видеопамяти. увеличение по Х и У. когда A=1
и записывать в регистры когда A=0:

Код
process(WE)
begin
if falling_edge(WE) then
  --Обработка регистров
  if (CS='0' and A='0' and D(15 downto 12)="0000") then
   R_D<=D(0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0001") then
   R_M<=D(1 downto 0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0010") then
   R_P<=D(0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0011") then
   R_X0<=D(8 downto 0);
   X<=D(8 downto 0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0100") then
   R_X1<=D(8 downto 0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0101") then
   R_Y0<=D(7 downto 0);
   Y<=D(7 downto 0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0110") then
   R_Y1<=D(7 downto 0);
  end if;
  if (CS='0' and A='0' and D(15 downto 12)="0111") then
   R_C<=D(7 downto 0);
  end if;
  if (CS='0' and A='0' and D(15)='1') then
   R_RGB(conv_integer(R_C))<=D(14 downto 0);
  end if;
  --Вычисление адреса в видеопамяти WriteAddress=320*y+x
  if (CS='0' and A='1') then
   WriteAddress<=("101000000"*Y)+X; --вычисление адреса из старых координат
   if X=R_X1 then --новые координаты - X и Y увеличиваются, для следующего адреса
    X<=R_X0;
    if Y=R_Y1 then
     Y<=R_Y0;
    else
     Y<=Y+1;
    end if;
   else
    X<=X+1;
   end if;
  end if;
end if;
end process;


смысл этого процесса в установке прямоугольной области (R_X0,R_Y0,R_X1,R_Y1) на дисплее для того чтобы потом слева-направа сверху-вниз записывать данные

прошу покритиковать или дополнить
des00
Цитата(%-) @ Nov 23 2009, 20:37) *
а вот это очень горько sad.gif хотелось бы Tsetup=1clk @133MHz


делайте sourse-synchronus интерфейс, по другому на 133МГц при ваших времянках вы не получите стабильной работы. Или снижайте частоту интерфейса.
SM
Еще констрейны покажите. Исходника мало.
%-)
Цитата(SM @ Nov 24 2009, 08:55) *
Еще констрейны покажите. Исходника мало.


а что такое констрейны?

только без смеха - впервые слышу это слово...
SM
Цитата(%-) @ Nov 24 2009, 09:44) *
а что такое констрейны?
только без смеха - впервые слышу это слово...


Описание требований по временным ограничениям к схеме, располагаемой внутри ПЛИС. Т.е. в Вашем случае должен быть create_clock для WE, раз по его edge работа, ну и всякие тем set_input_delay для остальных сигналов. Если используется timequest. А классик использовать не желательно.

Без четкого обконстреивания и отчета таймквеста о том, что все уложилось, это не заработает вообще.
SFx
констрейны - это ограничения, которые требуется выполнить синтезатору - мапперу, при компиляции проекта.
они могут быть :
1. по частоте
2. по физическому местоположению цепи/блока/LE на кристалле
3. по задержке распространения сигнала по цепи
%-)
Цитата(SFx @ Nov 24 2009, 10:18) *
констрейны - это ограничения, которые требуется выполнить синтезатору - мапперу, при компиляции проекта.
они могут быть :
1. по частоте
2. по физическому местоположению цепи/блока/LE на кристалле
3. по задержке распространения сигнала по цепи


где в Квартусе это указывается?

пока просто создаю проект. пробовал оптимизацию optimal на speed менять - вышло только хуже sad.gif
SM
Цитата(%-) @ Nov 24 2009, 10:22) *
где в Квартусе это указывается?


Создаете .SDC-файл, добавляете в проект и пишете.
%-)
Цитата(SM @ Nov 24 2009, 11:25) *
Создаете .SDC-файл, добавляете в проект и пишете.


создал, открыл. а дальше что писать?

можете пример подкинуть?
SM
Цитата(%-) @ Nov 24 2009, 11:22) *
создал, открыл. а дальше что писать?

можете пример подкинуть?


А дальше читать описание SDC в квартусе, читать даташит на блекфин, и писать, перенося данные из даташита по сетапам-холдам в вид SDC...
Примеров SDC полно в сети, это стандарт по описанию констрейнов с древнейших времен.
dvladim
Цитата(%-) @ Nov 24 2009, 06:37) *
как быть если нужно с одними и теме же объектами работать по фроту, спаду и уровню? vhdl ругается - пишит что не может имплементировать регистры

Придется использовать разные регистры: одни по переднему фронту, другие по заднему, по уровню - защелки.
%-)
проблема почти полностью решена с помощью буфера между БФ533 и ПЛИС
ложных отрабатываний и порча видеопамяти - не замечены

а теперь вопрос -

нужен ли этот буфер(LCX245) если ПЛИС поставить впритык к ДСП на 4-слойке?

и нужно ли буферизовать (два варианта: с длинными проводами и впритык) : AMS (выбор устройства), AWE(строб записи), A - адресный бит ?

буфер стоит только на линиях данных


сейчас плата с ДСП и ПЛИС соединены 10-см ленточным кабелем

минимально устойчивая времянка такая: tsetup=2 clk, twe=1 clk, thold= 0 clk = 3 clk всего

133/3= 44 МГц - в принципе достаточно

ПЛИС не успевает отработать, если tsetup<2 clk
%-)
Цитата(SM @ Nov 24 2009, 12:24) *
А дальше читать описание SDC в квартусе, читать даташит на блекфин, и писать, перенося данные из даташита по сетапам-холдам в вид SDC...
Примеров SDC полно в сети, это стандарт по описанию констрейнов с древнейших времен.


скачал кук-бук на констрейны и выбрал TimeQuest timing analizer.
создал SDC файл и прикрепил в проект.

подскажите, какие именно констрейны необходимо задать в SDC-файле для работы шины ПЛИС на вход (только запись из Процессора в ПЛИС),

d - данные
nwe -строб запими
nce - выбор ПЛИС
a - адрес

если временные соотношения такие:

a выставляется одновременно с опусканием nce

через 2 clk опускается nwe на время 1 clk

nwe и nce подымаются одновременно

clk=130 МГц

и самое главное - будет ли квартус учитывать эти констрейны при синтезе?

что такое fmax - ? почему когда явно указал через create_clk частоту 50 МГц, анализатор по-прежнему ее делает 35 мгц?
SM
для WE - если он заведен как тактовый сигнал create_clock. Fmax - 1/(мин.длительность.импульса*2)
для остальных set_input_delay относительно того фронта WE, по которому все работает.

учитывать будет.

анализатор ничего не делает, анализатор показывает, что получилось в результате. Если заказали 50, а получили 35 - то значит данный проект физически не может работать в данной ПЛИС на 50.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.