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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Параллельно запись/чтение в/из памяти ?, Как сделать ?
Саша Z
сообщение Nov 28 2007, 21:06
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Есть задача: на входе идет поток и байтовых данных с rate скажем Х MHz (каждый clock - запись байта).
На выходе нужно дать строенные слова, т.е. 24 бита (паковать по 3 последовательно полученных байта и выдавать слово наружу), т.е. со скоростью Х/3 MHz.
Если предположим выходной (read) clock получен делением на 3 входного (write) clockа (значит есть небольшая задержка между edges входного и выходного clocks), можно ли каким-то образом использовать буфер из 3 байт по накоплении которого слово в 24 бита выдается наружу согласно read clock ?
Проблема (как я вижу) в том что по третьему write clockу когда третий байт только записался нужно сразу-же читать все слово (все три байта буфера параллельно) по read clockу, что может примерно совпасть с записью первого байта следующей тройки (т.е. четвертого по счету с streame).
Может ли тут помочь dual port ram ?

Если это не реально, какие более реальные идеи есть ? Может что-то врое ping-pong buffer (т.е. иметь 2 буфера по 3 байта каждый - как только первый заполнился со входа всеми тремя байтами - он тут-же асинхронно скидывается во второй и 24-битное слово считывается на выхом со второго, в то время как первый заполняется следующими 3мя байтами потока, и т.д.)...

Что скажем ?
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 28 2007, 21:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вы вроде начинаете работать с ПЛИС? Вот и познакомтесь сразу с FPGA у которых имеется двухпортовое ОЗУ. Там ваша задача легко решается. Для примера гляньте, например, архитектуру серии Spartan II у Xilinx.
Go to the top of the page
 
+Quote Post
yuri_d
сообщение Nov 28 2007, 22:30
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Применить Dual Port RAM можно, но это напоминает стрельбу из пушки по воробьям.

Еще рекомендую отказаться от асинхронной установки регистров. Современные программируемые микросхемы (как CPLD, так и FPGA) плохо приспособлены для такого рода передачи данных.

И напоследок по поводу самой задачи. Можно обойтись двумя байтовыми регистрами и счетчиком до 3.
Порядок работы следующий:
1) если счетчик равен 0, то по входному тактовому импульсу записываем входные данные в первый регистр. увеличиваем счетчик на 1.
2) если счетчик равен 1, то по входному тактовому импульсу записываем данные во второй регистр. снова увеличивем счетчик на 1.
3) если счетчик равен 2, то по входному тактовому импульсу сбрасываем счетчик в 0. одновременно с этим передаем на выход тактовый импульс. выходным тактовым импульсом может быть равенство счетчика нулю.

Выходное 24-битное слово состоит из значений обоих регистров и байта входных данных.

напоследок хорошо бы отказаться от формирования тактовых импульсов подобным способом. Значительно лучше работают синхронные схемы, где имеется один тактовый сигнал и управлять сигналом clock enable для того, чтобы делать или не делать что либо.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 29 2007, 15:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Спасибо, это действительно вариант, вроде просто.
Значит нужно делать gated clocks и управлять загрузкой/считыванием с помощью них.
Буду пробовать...
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 29 2007, 15:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Саша Z @ Nov 29 2007, 18:01) *
Спасибо, это действительно вариант, вроде просто.
Значит нужно делать gated clocks и управлять загрузкой/считыванием с помощью них.
Буду пробовать...


Обычно в хелпах рекомендуют одноклоковую синхронизацию.
В хелпе Квартуса даже картинка рекомендация есть как
gated clocks превратить enable clk
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 29 2007, 22:15
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(sazh @ Nov 29 2007, 19:42) *
Обычно в хелпах рекомендуют одноклоковую синхронизацию.
В хелпе Квартуса даже картинка рекомендация есть как
gated clocks превратить enable clk


спасибо.
Пытался порыться в хелпах Quartusа у себя (установлен из "закромов") - хелп вообще не открывается.

Не могли бы вы вкратце описать что такое определение gated clock, почему оно не рекоммендуется (а посему конвертируется в enabled clock) ?
Что имеется ввиду под одноклоковой синхронизацией ?
Go to the top of the page
 
+Quote Post
AlexB
сообщение Nov 29 2007, 23:05
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 37
Регистрация: 9-08-05
Из: The Netherlands
Пользователь №: 7 477



Цитата(Саша Z @ Nov 30 2007, 02:15) *
Что имеется ввиду под одноклоковой синхронизацией ?


Поищите по форуму "синхронный дизайн". Вас ждёт много "открытий чудных".
Go to the top of the page
 
+Quote Post
skv
сообщение Nov 30 2007, 12:08
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 23-12-04
Пользователь №: 1 636



Цитата(yuri_d @ Nov 29 2007, 01:30) *
Применить Dual Port RAM можно, но это напоминает стрельбу из пушки по воробьям.

Еще рекомендую отказаться от асинхронной установки регистров. Современные программируемые микросхемы (как CPLD, так и FPGA) плохо приспособлены для такого рода передачи данных.

И напоследок по поводу самой задачи. Можно обойтись двумя байтовыми регистрами и счетчиком до 3.
Порядок работы следующий:
1) если счетчик равен 0, то по входному тактовому импульсу записываем входные данные в первый регистр. увеличиваем счетчик на 1.
2) если счетчик равен 1, то по входному тактовому импульсу записываем данные во второй регистр. снова увеличивем счетчик на 1.
3) если счетчик равен 2, то по входному тактовому импульсу сбрасываем счетчик в 0. одновременно с этим передаем на выход тактовый импульс. выходным тактовым импульсом может быть равенство счетчика нулю.

Выходное 24-битное слово состоит из значений обоих регистров и байта входных данных.

напоследок хорошо бы отказаться от формирования тактовых импульсов подобным способом. Значительно лучше работают синхронные схемы, где имеется один тактовый сигнал и управлять сигналом clock enable для того, чтобы делать или не делать что либо.


Схема и так синхронная,если в регистры писать по клоку.
Но я бы посоветовал сделать на шести регистрах. В первые три по счетчику писать входное слово побайтно. Когда счетчик будет равен 2 вырабатывать сигнал перезаписи в выходные три регистра и сбрасывать счетчик. Можно снова заполнять входной буфер. Ноль, вкачестве разрешения, использовать не рекомендую. Пока во входнм регистре ничего нет он так же равен нулю и схема все время будет вырабатывать сигнал перезаписи.
Сразу оговорюсь, что схема синхронная. Сигналы записи, чтения и перезаписи являются разрешающими, а пишем по клоку.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 30 2007, 21:26
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(skv @ Nov 30 2007, 16:08) *
Схема и так синхронная,если в регистры писать по клоку.
Но я бы посоветовал сделать на шести регистрах. В первые три по счетчику писать входное слово побайтно. Когда счетчик будет равен 2 вырабатывать сигнал перезаписи в выходные три регистра и сбрасывать счетчик. Можно снова заполнять входной буфер. Ноль, вкачестве разрешения, использовать не рекомендую. Пока во входнм регистре ничего нет он так же равен нулю и схема все время будет вырабатывать сигнал перезаписи.
Сразу оговорюсь, что схема синхронная. Сигналы записи, чтения и перезаписи являются разрешающими, а пишем по клоку.


Спасибо.
В принципе на мой неопытный взгляд, добавление выходного буфера (3 параллеьных регистра) - полезная мысля ибо синхронизирует выход. Выход есть считывание этих 24 бит параллельно, но клоком соответственно в 3 раза более медленным чем входной (пишущий во входные 3 регистра).
Но не совсем понял как я выгружаю входные 3 регистра в выходной буфер (3 параллельных регистра). Ведь после записи 3х послед. байтов во входные 3 регистра, след. клок хоть и загрузит выходной буфер 3мя входными регистрами, но одновременно по этому-же клоку идет и загрузка первого байта следующей входной трой в первых входной регистр. Т.е. получается "стокновение" (по одному-и тому-же клоку и читаем с и пишем в регистр.

Может я вас неправильно понял, и вы имели ввиду входные 2 регистра для первого и второго байта, а третий (по третьему входному клоку) сразу-же пишеться вместе в выходами 2х входных регистров в выходной буфер (из 3х параллельных регистров). Но тогда мне нужно блокировать двум входным регистрам каждый третий клок.

Т.е. если я вас правильно понял, "алгоритм" такой:
1. Пишем 3 последовательных байт считаю их счетчиком. (1 -> 2-> 3)
2. По записи первых 2х байт - счетчик = 2.
3. По записи третьего байта, то бишь по третьему входному клоку - загружаем выходной буфер (3 параллельных регистра), но одновременно блокируем этот каждый третий клок двум входным регистрам.
Кроме того, клок выходного буфера по частоте = 1/3 входного клока и синхронизириван по входному.
Этот же клок выходного буфера идет наружу как клок считывания буфера, значит ежели буфер загружается по фронту выходного клока, значит данные можно читать по его спаду.

Я вас правильно понял ?
Go to the top of the page
 
+Quote Post
BSV
сообщение Nov 30 2007, 21:46
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045



Что Вы все так рветесь прикрутить еще один тактовый сигнал, причем там, где он не нужен совсем, да еще чтение сделать по спаду. Глобальные линии и буферы нужно экономить - их много не бывает! И входной и выходной регистры тактируются одним сигналом, управление - сигналами разрешения.

Р.S. Попробуйте сначала схему нарисовать из имеющихся примитивов - счетчики, регистры, логика, а затем уже ее опишите. D-триггер (из них построены регистры) можно писать и читать одновременно (т.е. его значение изменяется ПОСЛЕ фронта тактового сигнала, а чтение происходит ДО).


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 30 2007, 21:58
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BSV @ Dec 1 2007, 01:46) *
Что Вы все так рветесь прикрутить еще один тактовый сигнал, причем там, где он не нужен совсем, да еще чтение сделать по спаду. Глобальные линии и буферы нужно экономить - их много не бывает! И входной и выходной регистры тактируются одним сигналом, управление - сигналами разрешения.

Р.S. Попробуйте сначала схему нарисовать из имеющихся примитивов - счетчики, регистры, логика, а затем уже ее опишите. D-триггер (из них построены регистры) можно писать и читать одновременно (т.е. его значение изменяется ПОСЛЕ фронта тактового сигнала, а чтение происходит ДО).


Да, спасибо, попробую действительно набросать на бумаге вначале, может тогда дохилит...
Значит вы имеет ввиду оба (входной и выходной) регистры тактируются по одному-и тому-же клоку (входному), но выход выходного (параллельного) регистра контролируется нечто типа output enable который разрешает чтение по каждому четвертому клоку (ибо по первым трем записались все 3 байта в выходной параллельный регистр)?

Кстати мне нужно иметь на выходе клок чтения, т.е. вклок по которому выхнодной регистр выдает котовые 24 бита наружу
Go to the top of the page
 
+Quote Post
BSV
сообщение Nov 30 2007, 22:04
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045



Цитата(Саша Z @ Dec 1 2007, 00:58) *
Значит вы имеет ввиду оба (входной и выходной) регистры тактируются по одному-и тому-же клоку (входному), но выход выходного (параллельного) регистра контролируется нечто типа output enable который разрешает чтение по каждому третьему клоку?
Верно, только для второго регистра (24-разрядного) надо управлять записью в него! Или там три регистра - я что-то не догоняю зачем третий тогда?
Выходной клок можно получить (если нет требований к скважности) инверсией сигнала разрешения записи во второй регистр или из старшего бита счетчика (который кстати должен быть по модулю 3).


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 30 2007, 22:20
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BSV @ Dec 1 2007, 02:04) *
Верно, только для второго регистра (24-разрядного) надо управлять записью в него! Или там три регистра - я что-то не догоняю?


Я наверно ен совсем поянтно описал то что мен нужно:
Есть поток байтов с входным клоком (назовем его clk_in), нужно байты паковать в тройки (т.е. 3 параллельных байта) и считывать наружу этих 3 параллельных байта с выходным клоком (clk_out = clk_in/3).
Вот по ходу нашей с вами дискуссии думал писать 3 последовательных байта во входной регистр (типа FIFO) по входному клоку. Насчет выходного регистра - есть два варианта (согласно вами подсказанному направлению):
1. Либо он тактируестя тем-же входным клоком и тогда он заполняестя valid данными через каждые 3 клока. Значит его можно читать наружу по каждому четвертому клоку.
2. Либо он опять-же тактируется тем-же входным клоком, но запис в него (его вход) разрешается по каждому четвертому клоку. (И тогда он готов к чтению наружу по каждому пятому клоку ?? Че-то бардак у меня получается...)

Но мен нужен выходной клок который будет тактировать внешнее устройство которое и будет читать сей выходной регистр...
Go to the top of the page
 
+Quote Post
BSV
сообщение Nov 30 2007, 22:27
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045



Почитайте мой предыдущий пост - я его немного поправил. Если устройство на которое пойдут 24 бита не предполагает управления потоком (например, не м.б. занято), то FIFO не нужно ИМХО. Тут же самый обычный конвейер - каждые 3 такта (только со сдвижкой на 1 такт) будете получать на выходе слово.

В общем, как-то так (сбросы если где-то нужны - сами добавьте, и порядок байт в слове проверьте)
Код
process (CLK)
begin
  if (CLK'event and CLK = '1') then
    if (IN_WE = '1') then
      RA <= IN;
      RB <= RA;
      RC <= RB;
      CNT <= CNT + 1;
    end if;
    OUT_WE <= CNT(1) and not CNT(0);
  end if;
end process;
process (CLK)
begin
  if (CLK'event and CLK = '1') then
    if (OUT_WE = '1') then
      R_OUT <= RA & RB & RC;
    end if;
  end if;
end process;
CLK_OUT <= not OUT_WE;


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 30 2007, 22:56
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BSV @ Dec 1 2007, 02:27) *
Почитайте мой предыдущий пост - я его немного поправил. Если устройство на которое пойдут 24 бита не предполагает управления потоком (например, не м.б. занято), то FIFO не нужно ИМХО. Тут же самый обычный конвейер - каждые 3 такта (только со сдвижкой на 1 такт) будете получать на выходе слово.

В общем, как-то так (сбросы если где-то нужны - сами добавьте, и порядок байт в слове проверьте)
Код
process (CLK)
begin
  if (CLK'event and CLK = '1') then
    if (IN_WE = '1') then
      RA <= IN;
      RB <= RA;
      RC <= RB;
      CNT <= CNT + 1;
    end if;
    OUT_WE <= CNT(1) and not CNT(0);
  end if;
end process;
process (CLK)
begin
  if (CLK'event and CLK = '1') then
    if (OUT_WE = '1') then
      R_OUT <= RA & RB & RC;
    end if;
  end if;
end process;
CLK_OUT <= not OUT_WE;



спасибо.
Требования к duty cycle есть - обязано быть 50% +/- 10%
Go to the top of the page
 
+Quote Post

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

 


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


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