реклама на сайте
подробности

 
 
> Асинхронная запись данных в ПЛИС, глючит иногда
penauch
сообщение Nov 2 2009, 23:40
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 12-10-09
Пользователь №: 52 902



требуется считывать данные из шины в ПЛИС (запись в регистры аппаратуры-ПЛИС)

CS - выбор кристалла ПЛИС (активный 0)
WE - разрешение записи (активный 0)
D0..D7 - данные
A0 - адрес (при обращении к регистрам должен быть 1, иначе увеличение адреса памяти (прикручена к ПЛИС))

написал такое:

Код
process(CS,WE,A0)
begin
if CS='0' then -- если CS=0 активен
  if rising_edge(WE) then --если пришёл фронт WE данные должны защёлкнуться
   if A0='1' then --если регистры
    Register(7 downto 0)<=D(7 downto 0);
   else -- если не регистры
    VRAM_Address<=VRAM_Address+1; -- увеличиваем адрес памяти    
   end if;
  end if;
end if;
end process;


Оно работает, но иногда глючит...

Шина хоста (со стороны CPU) имитируется портами PIOA контроллера AT91SAM7S64.
Связаны ли глюки с тем, что имитировать шину портами нежелательно из-за выбросов ?

или не так делаю?

Сообщение отредактировал penauch - Nov 2 2009, 23:41
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Builder
сообщение Nov 3 2009, 00:05
Сообщение #2


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(penauch @ Nov 3 2009, 02:40) *
требуется считывать данные из шины в ПЛИС (запись в регистры аппаратуры-ПЛИС)

Оно работает, но иногда глючит...

или не так делаю?

А что дальше с данными делаете? И в чём глюки?
Как осуществляете синхронизацию асинхронной и синхронной части проекта?
Go to the top of the page
 
+Quote Post
penauch
сообщение Nov 4 2009, 02:40
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 12-10-09
Пользователь №: 52 902



Цитата(Builder @ Nov 3 2009, 04:05) *
И в чём глюки?


Разобрался с проблемой!

Нужно было считывать по спаду сигнала записи!

Код
process(Port_WE,Port_CS)
begin
if (falling_edge(Port_WE) and Port_CS='0') then
  --Register
  if Port_A='0' then
  --Data
  else
  end if;
end if;
end process;


Отлично работает при условии, что Port_WE опустится чуть-позже, чем Port_CS. Если одновременно - не сработает.

Можно было сделать Port_CSWE<=Port_CS or Port_WE и анализировать по falling_edge(Port_CSWE), но при этом данные недостоверны!

Есть ли какие нибудь мысли как можно сделать корректную фиксацию данных на шине при одновременном опускании CS и WE ?

Сообщение отредактировал penauch - Nov 4 2009, 02:43
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 4 2009, 11:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(penauch @ Nov 4 2009, 05:40) *
Есть ли какие нибудь мысли как можно сделать корректную фиксацию данных на шине при одновременном опускании CS и WE ?

Есть мысли...

Код
// данные - сделать прозрачную защелку:

wire dsel = A0 & !CS & !WE;
always @*
  if (dsel) Register <= D;

// адрес - сделать счетчик по началу цикла

wire asel = !A0 & !CS & !WE;

always @(posedge asel)
  VRAM_Address<=VRAM_Address+1'b1;


Только надо быть очень внимательным в части изучения временных диаграмм входных сигналов, чтобы asel/dsel были без глитчей. Никакое обконстреивание тут не спасет.
Go to the top of the page
 
+Quote Post
penauch
сообщение Nov 4 2009, 11:35
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 12-10-09
Пользователь №: 52 902



Цитата(SM @ Nov 4 2009, 15:28) *
Есть мысли...

Код
// данные - сделать прозрачную защелку:

wire dsel = A0 & !CS & !WE;
always @*
  if (dsel) Register <= D;

// адрес - сделать счетчик по началу цикла

wire asel = !A0 & !CS & !WE;

always @(posedge asel)
  VRAM_Address<=VRAM_Address+1'b1;


Только надо быть очень внимательным в части изучения временных диаграмм входных сигналов, чтобы asel/dsel были без глитчей. Никакое обконстреивание тут не спасет.


Verilog не знаю smile.gif
Что значит always @ в двух ваших случаях?

Ну или на словах , если перевод в vhdl затруднителен..

Сообщение отредактировал penauch - Nov 4 2009, 11:36
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 4 2009, 11:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(penauch @ Nov 4 2009, 14:35) *
Что значит always @ в двух ваших случаях?

В первом случае это такой процесс, в списке чувствительности которого перечислены все сигналы, которые задействованы внутри процесса, т.е. dsel и D. Во втором случае - rising_edge(asel).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- penauch   Асинхронная запись данных в ПЛИС   Nov 2 2009, 23:40
- - rezident   Я не силен в HDL, но на мой взгляд у вас асинхронн...   Nov 3 2009, 00:08
- - Shtirlits   Цитата(penauch @ Nov 3 2009, 02:40) CS - ...   Nov 3 2009, 00:09
- - penauch   Глюк в том, что когда интенсивно используются кома...   Nov 3 2009, 02:36
- - des00   нарежте асинхронную шину на ~100 МГц и сделайте но...   Nov 3 2009, 04:24
- - penauch   что значит нарезать? синхронизация в проекте 50 м...   Nov 3 2009, 05:06
|- - des00   Цитата(penauch @ Nov 2 2009, 23:06) что з...   Nov 3 2009, 05:14
- - penauch   Мне нужно писать в свободную банку SRAM со скорост...   Nov 3 2009, 05:25
- - eliza   ЦитатаЕсть ли какие нибудь мысли как можно сделать...   Nov 4 2009, 14:11
|- - penauch   Цитата(eliza @ Nov 4 2009, 17:11) Смотрим...   Nov 4 2009, 23:24
- - penauch   попробую перевести на vhdl: register<=d when (...   Nov 4 2009, 14:16
- - SM   Цитата(penauch @ Nov 4 2009, 17:16) Прави...   Nov 4 2009, 17:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016