Перейти к содержанию
    

Оптимизация регистров в Quartus

В моем случае по адресу 1 - FIFO, по адресу 0 - статусный регистр(взяла аналогично описанию корки DCFIFO), только статусный регистр я создаю сама(не с лап), и при обращении по адресу 1 запроса считывания выдаю его на readdata. Биты статусного регистра:

(0:2)бит - поле дынных содержит режим, устанавливающий размер пакета

3 - фифо пустой

4 - фифо полный

5 - ошибка: превышение заданных размеров контейнера

6 - контейнер заполнен

7 - контейнер отправлен

Передача не пакетная пока что, планирую и это реализовать, но хочу сначала с азами разобраться.

По достижению нужного количества слов (данный момент как раз устанавливается 3 битами статусного регистра, обьем всего FIFO выставлен для возможности хранения максимально длинного пакета): проц прекращает обращение к FIFO(Chipselect = 0) и FIFO начинает передавать накопленный пакет. Передача без подтверждения, стробирующих сигналов пока нет, просто слив пакета через ff_out. Как только FIFO опустел, он выставляет прерывание процу, тот снова толкает пакет и снимает обращение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если честно, расчитывала только на то, что носом ткнете в ошибки... Большое спасибо! Очень хочется узнать, что конкретно делаю не так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот как то так

tmp22_fifo00.rar

Там есчё нужно ессно дорабатывать, на идеал не претендую, но идею я думаю что донёс :laughing: каменты есть ;)

Если чего не ясно спрашивайте. В обсчем там ключевые моменты:

- работа автоматов в 2 клоковых доменах: один загружает данные с авалона, второй по стробу выгружает фифошным интерфейсом с флагом валидности.

- передача одноклокового строба так, чтоб он был одноклоковый для принимающего.

И я там писал с рассчёта на 32-х битные дата-трансферы по шине (но использовал только нижные 8 байт), этот момент тоже проработайте для удобства в дальнейшем использования.

Если что, думаю товарисчи исправят или дополнят если что-то заФтыкал.

 

А на счёт

Очень хочется узнать, что конкретно делаю не так

сравните ваш вариант и мой - сразу станет всё понятно :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

угу, с учетом того, что я пока писала проекты только на VHDL - "сразу станет все понятно" :biggrin: ... сижу, разбираюсь, чуствую вопросов будет много)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 margosh - мог написать на вхдл , но с учётом моего рабочего графика заняло бы дней 5 :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Принцип контроля за заполнением кадра для меня пока не ясен... Kuzmi4, прерывания Вы не используете, в таком случае Вы создаете какой-то аналог сигнала waitrequest? если не сложно, обьясните плиз, что происходит, когда заполнился первый кадр? С этого момента я суть программы перестаю улавливать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слона то я и не заметил... :rolleyes:

Вот с прерыванием длинной 1 клок на мастер

tmp22_fifo01.rar

 

Далее

прерывания Вы не используете, в таком случае Вы создаете какой-то аналог сигнала waitrequest?
расшифруйте, что вы имели ввиду? Потому как мне кажется, что у вас неправильное понимание назначения waitrequest.

 

Потом

.wrusedw (av_wr_counter), // wr counter

...

.rdusedw (fifo_rd_counter) // rd counter

Это счётчики заполнения/опустошения, тактируемые своими клоками (могу и ошибаться, что это именно wr/rdusedw, потому как давно с альтерой плотно не работал, но камент специально поставил :laughing: ). Смотрите где они используются.

 

Идём дальше

Принцип контроля за заполнением кадра для меня пока не ясен

А принцип контроля со сторы хоста простой - так как бурста нет, тогда пишем по одному байту и читаем флаг container_full (хотя это и не обязательно и я думаю избыточно в принципе - можно же вычитать stat/cfg регистр с длинной фифошки и в проге на сях для ниоса это учесть (если не он конфигурил), ну или в своём самописном мастере (опять же если не он конфигурил) - ну и дальше гнать данные по одному трансферу согласно вычитанного кода длинны). Если несколько разных мастеров работают, тогда каждый на начале трансфера должен записывать свой параметр длинны и по окончании записи нужного количества байт ждать прерывания и отдавать слейв другому мастеру, ну а тот повторяет процедуру...

 

Ну и наконец

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

 

Вроде всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

расшифруйте, что вы имели ввиду? Потому как мне кажется, что у вас неправильное понимание назначения waitrequest.

waitrequest - сигнал, котрый выставляет устройство, если не успевает вовремя выдать данные процессору или считать от процессора. Я не разобралась в другом :wacko: , - в стробовых сигналах. Не могу понять что делает модуль interck2, Вы не могли бы прояснить? Если только сообщает о завершении считывания из fifo, то у меня это было предусмотрено выставлением соответствующего бита в статусный регистр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И снова добрый день!

Итак, имеем

waitrequest - сигнал, котрый выставляет устройство, если не успевает вовремя выдать данные процессору или считать от процессора
так а при чём тут

прерывания Вы не используете, в таком случае Вы создаете какой-то аналог сигнала waitrequest
??

 

Далее,

что делает модуль interck2

Как говорил, у нас 2 машинки - одна записывает данные в фифо с авалона на клоке шины, другая считывает данные наружу (в external) по наружному клоку. Клоки могут быть произвольные, потому нужен модуль корректно передающий строб с одного произвольного домена в другой (это и есть interck2). Собсно строб нужен для того чтоб запускать выгрузку сразу по заполнению нужным количеством данных - на сколько я помню

По достижению нужного количества слов ... проц прекращает обращение к FIFO(Chipselect = 0) и FIFO начинает передавать накопленный пакет.

Собсно отсюда и с неопределённости использования компонента вытекает избыточность в реализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте :) Овтечу подробнее во избежание повторений. Дело в том, что я сходу не въехала как работает interck2, и, так как у Вас не был использован сигнал прерывания, решила что он выполняет что-то вроде задержки нового сигнала записи от Авалона на тот период, пока кадр из фифо не считался. После более детального изучания поняла функциональное назначение interck2, правда масштабно представить себе этот переход от одного клока к другому не могу - еще с этим не работала, жапуталась :laughing:

Дико извиняюсь, я не сообщила один важный момент - клоки не произвольные, - с авалона 50 МГц на запись, на чтение - 25 МГц с генератора, причем оба синхронизованны по фазе.

 

Для того, чтобы запускать выгрузку фифо сразу по достижению нужного количества данных в моей программке использовался бит 6 статусного регистра, теперь правда думаю, что условия его выставления необходимо подкорректировать, так же, как и условие выставления прерывания. Kuzmi4, огромное спасибо за помощь, и мои извинения, если запутала Вас в условиях задачи. Сажусь исправлять :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 margosh - успехов :laughing:в раЖпутывании

На счёт клоков - interck2 для произвольных доменов, так что тут можно поставить галочку

 

Завалил бобра-спас дерево :) (народная мудрость)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...