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

 
 
> inout шины в Verilog, для MAX+plus II
Волощенко
сообщение Jun 8 2007, 08:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Привет всем!
Есть двунаправленная шина ввода-вывода для FPGA типа FLEX10KA, с декларацией на Verilog как:
inout [31:0] IO;
MAX+plus II запретил применить следующую запись (выдача DATA единицей на OE):
assign IO = OE ? DATA : {32{1'bz}};
а вместо неё рекомендовал применить примитив TRI (с тремя состояниями) или OPNDRN (открытый коллектор).
Тогда, следуя рекомендациям, и используя TRI, получил:
TRI aaa(DATA, OE, IO);
Однако, на выходах IO почему-то всегда нули, хотя код на DATA есть, что проверил контрольным считыванием по центру сигнала OE (его длительность 30нс), во вспомогательные регистры R1 и R2:
always @ (posedge CLK) R1<=DATA;
always @ (posedge CLK) R2<=IO;

Аналогичная ситуация с использованием OPNDRN, с конструкцией:
assign DATAx = OE ? DATA : {32{1'b1}};
OPNDRN bbb(DATAx, IO);
При этом была установлена опция "Automatic Open-Drain Pins"

Вопрос: Кто сталкивался с подобным, почему так происходит, почему не выдается информация в шину?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sazh
сообщение Jun 11 2007, 09:30
Сообщение #2


Гуру
******

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



Нет у Вас никаких ошибок по схеме соединения FPGA c памятью. Потому что Вы не посчитали нужным подтягивать шины адреса и данных в этой связке. У вас заложено третье состояние. И Вы его реализуете. Если бы вы заложили на плате физически открытый сток, то заложили бы и внешние резисторы (если их нет внутри fpga).
теперь есть указания компилятору по умолчанию. Типа Auto Open-Drain Pins logic option
вот в хелпе квартуса (A logic option that directs the Compiler to automatically convert a tri-state buffer with a strong low data input into the equivalent open-drain buffer).
Я это понимаю так:
ВЫ сами описывете выходной буфер как Вам надо в соответствии с внешней схемой. Как буфер по третьему состоянию и открытый сток. Это только Ваш выбор.
assign out = in ? 1'bz : 1'b0; - это описания примитива открытоко стока. Поведенчески. "Сильный" 0, а единца делается из z состояния с помощью резистора. (Работайте в квартсусе. Смотрите RTL просмотрщик. Такое описание имитируется на буфере tri. Вход сигна подается на вход oe буфера. На входе буфера ноль.
Так вот при включенном указании компилятору этот буфер tri в open-drain buffer, если он есть. Я это так понимаю.
Мне кажется у Вас есть ошибка. Вы хотите внешнюю шину по третьему состоянию. Вы это делаете.
assign db = (dir & !oe_n) ? da : 8'hzz;
Такое описание не подходит по моему мнению к Auto Open-Drain Pins logic option
Потому что Вы требуете три состояния на шине 0,1, z.
Потому что еще раз повторюсь на выходном буфере кристалла можно получить выход, который будет имитровать три состояния, а можно чтобы было только два. Это ВЫ САМИ для себя выбираете.
Все начилось с того что Вы получили предупреждения где фигурировали понятия tri и open-drain
такие предупреждения стандартно выдаются при использования примитива bidir, если компилятор не находит при этом необходимые с его точки зрения буфера по третьему состоянию или открытый сток.
У Вас есть возможность промоделировать проект. Получите при моделировании все возможные состояния на шине. И все. ищите ошибку в проекте.
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Jun 11 2007, 11:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Цитата(sazh @ Jun 11 2007, 12:30) *
Так вот при включенном указании компилятору этот буфер tri в open-drain buffer, если он есть. Я это так понимаю.
Мне кажется у Вас есть ошибка. Вы хотите внешнюю шину по третьему состоянию. Вы это делаете.
assign db = (dir & !oe_n) ? da : 8'hzz;
Такое описание не подходит, по моему мнению, к Auto Open-Drain Pins logic option
Потому что Вы требуете три состояния на шине 0,1, z.
ОЗУ имеет буфер с тремя состояниями, считаю, что FPGA должен ему выдавать 0, 1, z.
Я изменял опцию Assign-> Global Project Logic Synthesis -> Automatic Open-Drain Pins, но это ничего не меняло.

Но появилось новое обстоятельство. Мой проект выполнен в *.gdf, и включает sim-элемент PCI-ядра и sym-элемент с собственной логикой управления на Verilog (он управляет в том числе и ОЗУ). При этом все выводы FPGA были подключены к обоим эти элементам. Я удалил из sym-элемента управления примитив TRI aaa(DATA, OE, IO), который формирует шину данных IO для ОЗУ, а эту, и только эту функцию шины данных реализовал на отдельном графическом примитиве tri из библиотеки c:\maxplus2\max2lib\prim. В итоге все заработало, почти так как надо, т.е. в теперь ОЗУ записываются и считываются разные массивы информации из PCI интерфейса компьютера.
Выходит, что на HDL уровне не проходило, а в графике идет. Конечно, можно было бы подняться на Quartis II, но там, что-то это PCI-ядро компилится с ошибками. Вынужден пока работать в МАХ+.
Вопросы о двух типах буферов в одном FPGA еще остались. Не ясно как переходить от одного буфера к другому и обратно, не понятно почему запрещено assign db = (dir & !oe_n) ? da : 8'hzz; вроде как общепринятая в Verilog конструкция. Жаль, микросхема старовата, на ней сейчас видно уже мало кто работает.
Go to the top of the page
 
+Quote Post



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

 


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


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