Jump to content

    
Sign in to follow this  
Faton_11

Двунаправленный Буфер, Verilog

Recommended Posts

Добрый вечер!

Передача данных производится от ПК(Устройство_1) к ПЛИС(Устройство_2) по схеме:

Устройство_1-->Шина_Данных_1-->Буфер-->Шина_Данных_2-->Устройство_2

 

post-77128-1381419701_thumb.png

 

Следующие передачи

а.)Шина_Данных_1-->Буфер

Буфер-->Шина_Данных_2

 

б.)Шина_Данных_2-->Буфер

Буфер-->Шина_Данных_1

 

описываются на veriloge таким образом:

 

input in;

input ena;

output out;

inout in_out;//шина данных

 

assign out = in_out;

assign in_out = (ena == 1'b1) ? in : 8'bz;

 

Остальные передачи таким же образом описаны в тестбенче:

а.)Устройство_1-->Шина_Данных_1

Шина_Данных_2-->Устройство_2

 

б.)Устройство_2-->Шина_Данных_2

Шина_Данных_1-->Устройство_1

 

Нужно ли их описывать в основном файле,

как вообще правильно описать подобную схему с 2-направленным буфером?

Share this post


Link to post
Share on other sites

А вы схему поподробней нарисуйте, где чистые выходы, где элементы с тристейтами. Начало хорошо положили - вы описали буфер с тристейтом. Выделите его в отдельный модуль, и напишите верхний уровень, где все блочки соединяются. В принципе, если поискать в интернете, то можно найти даже модели всех популярных серий на россыпухе - SN74, ALS74 ну и т.д., включая отечественные 155, 555, 1553 , 564 и т.д. серии. Но в целом, вы написали правильно, только еще надо разрядности везде указать.

 

В чистом виде двунаправленный буфер - это аналоговый ключ. В цифре такое не используется. Ваша же схема - это два тристейта с общим выходом, а вовсе не двунаправленный буфер. Но если очень надо смоделировать именно аналоговый ключ, то погуглите про tran, tranif0, tranif1 и т.д. - это конструкции для моделирования ключей.

Share this post


Link to post
Share on other sites
Нужно ли их описывать в основном файле,

как вообще правильно описать подобную схему с 2-направленным буфером?

 

Тут какая-то путаница с терминологией. Совершенно не понятно ни что Вам надо, ни тем более что Вы из этого описали.

 

Вам нужен синтезируемый код или просто "помоделировать"?

 

Что такое основной файл? Какой модуль или уровень иерархии он описавает?

 

Из того, как Вы нарисовали и из части того, как Вы описали "схему передачи данных" следует, что буфер это целый модуль, у которого с одной стороны некий порт (в смысле целый набор сигналов управления и данных), который работает по протоколу шины 1, а с другой стороны - по протоколу шины 2. Но из другой части того, что Вы написали, следует, что речь идет о гораздо более "простом" двунаправленном буфере.

 

 

input in;

input ena;

output out;

inout in_out;//шина данных

 

assign out = in_out;

assign in_out = (ena == 1'b1) ? in : 8'bz;

 

У Вас получился модуль с двумя входными портами (in, ena), одним выходным (out) и одним двунаправленным (in_out). Непонятно какой части рисунка соответствует это описание.

 

Причем, двунаправленный порт in_out Вы используете пока строго, как выходной порт. Просто выход с третьим состоянием.

 

т.е. полностью сохраняя функциональность вашего кода, его можно записать гораздо короче:

 

input in;
input ena;
output out;

assign out = (ena == 1'b1) ? in : 8'bz;

 

 

А главное, почему двунаправленный порт in_out Вы называете шиной?

 

Шина, это грубо говоря - провод, а не порт.

Share this post


Link to post
Share on other sites

Когда-то из академического интереса мне попадалась модель двунаправленной шины с задержками. За копирайтами IBM что ли. Мощная вещь с точки зрения использования языка. Возможно это как раз то, что хочется, хотя зачем - непонятно.

Share this post


Link to post
Share on other sites
Добрый вечер!

Передача данных производится от ПК(Устройство_1) к ПЛИС(Устройство_2) по схеме:

Устройство_1-->Шина_Данных_1-->Буфер-->Шина_Данных_2-->Устройство_2

 

как вообще правильно описать подобную схему с 2-направленным буфером?

 

Первые пару строк описания, причем весьма сумбурного Вы привели... А вот остальные 70% - нет...

Значит интерфейс описывается так:

1. Названия сигналов

2. Их взаимодействие

3. Электрические характеристики

4. Конструкция

 

Так вот, интерфейс бывает синхронный, бывает асинхронный... Причем переключение направления передачи данных - это не только одна строка на верилоге. Откройте описание PCI, и посмотрите, как сделано чтение...

А только когда нарисуете себе подробную циклограмму работы будете задавать вопрос: "а буби это ромбики"? И иначе "не знаю, не знаю, играем на деньги" - Вам гарантировано.... :)

 

Share this post


Link to post
Share on other sites

чего вы человека давите)

как вообще правильно описать подобную схему с 2-направленным буфером?

правильно вы описали

Нужно ли их описывать в основном файле

в файлах иерархией выше ничего больше дополнительного с этим сигналом делать не надо. выводите на пин - и все дела.

 

правильно ли всё организовано для ОБЩЕЙ задачи (о чем начали говорить все выше) - этого-то вопроса тс не задавал)

Share this post


Link to post
Share on other sites

Shivers, рисую схему поподробней - прикрепляю сделанную мной "каракатицу"=)

 

post-77128-1381661224_thumb.png

 

Sefo, код обязательно должен быть синтезируемым.

Под основным файлом имелся ввиду топ-файл.in_out - не порт, а двунаправленная шина

 

Идея следующая:

данные из компьютера в ПЛИС передаются посредством протокола rs232, описанном на veriloge.

Приведенная в 1-м сообщении схема относится к цифровому автомату, который должен управлять этими передачами.

 

Комментарии к схеме, приведенной в этом сообщении:

Рассмотрен цикл передачи данных из SRAM ПЛИС в буфер компьютера.

-выставляем адрес на ША2

-каждый провод ШД2 разделяется на 2 провода, по одному из которых мы можем считывать данные

с этой шины, в то время как другой выставляем в z-состояние. Если z-состояние нами не установлено,

то записываем в шину. В нашем случае, оно не установлено (ena2==1), значит из регистра reg2 данные

попадают на шину data2_bus.

 

assign wire2= data2_bus;

assign data2_bus= (ena2 == 1'b1) ? reg2 : 8'bz;

 

-Теперь сигналы с шины data2_bus нужно записать в buffer. Чтобы настроить шину на

вход в буфер, нужно "запереть" выходы от буфера к шине(ena2*==0).Получаем:

 

assign wire2*= data2_bus;

assign data2_bus= (ena2* == 1'b1) ? buffer : 8'bz;

 

-сделали назначение, теперь записываем:

buffer<=wire2*

 

-этот буфер находится в логическом блоке FPGA, связанном с микросхемой UART.К этой микросхеме

идут 2 провода: для чтения и для записи. Мы используем провод UART_TXD. Детали передачи опустим.

В итоге получаем 8 бит данных в буфере UARTa на другом конце порта, со стороны ПК. С этого

момента дальше ничего не ясно. Из этого буфера 8 бит нужно записать в регистр по определенному

адресу. Как выставить этот адрес? Он формируется цифровым автоматом в самой FPGA.

Его тоже нужно отравлять через порт rs232 перед тем, как отправить данные?

 

И ещё вопрос по поводу 2-направленного провода: почему когда 1-й провод работает на чтение, 2-й мы ставим в z-состояние, а когда 2-й работает на запись, 1-й в z-состояние не устанавливаем?

 

Скорее всего, эти вопросы покажутся смешными, но новичка они ставят в тупик. А написано так

подробно, потому что я хочу помочь вам помочь мне =)

 

Share this post


Link to post
Share on other sites

а зачем вам 2 направленная шина?

в целом вы не открыли Америки и так делается очень часто.

У нас в последнем устройстве АРМ связан с ПЛИС по SPI, в плис сделан модуль который принимает SPI сообщение, декодирует добывая из него данные, адрес и направление данных. И передает в другие модули или читает из них и отправляет обратно.

 

Между этим модулем и блоками идут 2 шины. Одна из модуля в блоки, другая из блоков в модуль.

 

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

 

Все прекрасно синтезится и на 2 направленной шине вы не выиграете в ресурсах, потому что синтезатор все равно все разберет, и сделает что-то свое, и здорово это все соптимизирует. У меня модуль в котором всего 1 регистр записывается 32 битный, занимает 3-4 ЛУТа.

 

по проводам думаю это та-же история что я написал. 1 провод кто-то рулит и вы его не трогаете, а 2 провод вы ставите данные только когда вас спросили, а когда не спрашивают отпускаете его что-бы мог ответить кто-то другой. Но это догадка, так как я не очень понимаю что за провода:)

 

 

Share this post


Link to post
Share on other sites

Faton_11, мне кажется, вы плохо представляете себе интерфейсы, которые моделируете. RS-232 вообще не имеет двунаправленных сигналов. RXD - последовательный канал приема, TXD - последовательная передача. Никаких тристейтов не требуется.

Если хотите написать модель RS-232 со стороны ПК, то ищите стандарт, кроме обычного serdes там еще есть свой формат, куча статусов и т.д. Лучше найти готовую модель, чем писать самому. То же касается и rs-232 контроллера в ПЛИС. То, что нарисовано на картинке .. это жесть. Если бы речь о LPT шла, тогда проглядывается что то знакомое, но на rs-232 это никак не похоже, вы уж извините

Share this post


Link to post
Share on other sites
Идея следующая:

данные из компьютера в ПЛИС передаются посредством протокола rs232, описанном на veriloge.

 

Вы только не вздумайте ножки ПЛИС подсоединять к разъему DB9 напрямую - пожжете все почем зря. Между ПЛИС и разъемом необходим приемо-передатчик сигналов RS-232. Ну, например, MAX3180 фирмы Maxim Integrated.

 

in_out - не порт, а двунаправленная шина

 

В вашем коде это просто порт.

 

Рассмотрен цикл передачи данных из SRAM ПЛИС в буфер компьютера.

-выставляем адрес на ША2

-каждый провод ШД2 разделяется на 2 провода, по одному из которых мы можем считывать данные

с этой шины, в то время как другой выставляем в z-состояние. Если z-состояние нами не установлено,

то записываем в шину. В нашем случае, оно не установлено (ena2==1), значит из регистра reg2 данные

попадают на шину data2_bus.

 

В вашем рисунке опять есть противоречия. Из рисунка следует, что одна ПЛИС находится внутри другой ПЛИС - таких, кажется, еще нет :).

 

Если SRAM это внешняя, по отношению к ПЛИС микросхема, то либо у нее отдельные провода для входных данных и отдельные для выходных данных, либо у нее один двунаправленный порт для входных и выходных данных.

 

В первом случае, ни о какой двунаправленной шине и речи быть не может, правда проводов действительно 2 для каждого бита данных. Только они нигде не разделяются - они сразу идут отдельно и в ПЛИС приходят на разные ножки.

 

Во втором случае, у Вас нет 2-х проводов на каждый бит данных - ничего нигде не разделяется и не воссоединяется. От двунаправленного буфера SRAM для каждого бита данных тянется 1 единственный провод к одной единственной ножке ПЛИС с таким же двунаправленным буфером.

 

Смотрите доку на SRAM. Какой чип стоит?

 

Если Вы имеете ввиду блоки памяти внутри ПЛИС, то такими категориями думать вообще бесполезно - ничего хорошего не выйдет.

 

 

assign wire2= data2_bus;

assign data2_bus= (ena2 == 1'b1) ? reg2 : 8'bz;

 

-Теперь сигналы с шины data2_bus нужно записать в buffer. Чтобы настроить шину на

вход в буфер, нужно "запереть" выходы от буфера к шине(ena2*==0).Получаем:

 

assign wire2*= data2_bus;

assign data2_bus= (ena2* == 1'b1) ? buffer : 8'bz;

 

-сделали назначение, теперь записываем:

buffer<=wire2*

 

Видите ли, Verilog это не язык программирования. Здесь нет последовательного "выполнения" ПЛИС кода строчка-за-строчкой.

 

То, что Вы описываете, больше напоминает и логику и процесс написание программы для процессора. Если Вы решили работать с ПЛИС Вам надо радикально изменить образ мышления - программистский просто не подходит и не даст результата.

 

С этого момента дальше ничего не ясно. Из этого буфера 8 бит нужно записать в регистр по определенному

адресу. Как выставить этот адрес? Он формируется цифровым автоматом в самой FPGA.

Его тоже нужно отравлять через порт rs232 перед тем, как отправить данные?

 

RS-232 в том виде, в котором Вы его собираетесь использовать - это просто протокол передачи байт в обоих направлениях. Что эти байты значат и что с ними делать решать только Вам. Вам нужно разработать или взять какой-нибудь стандартный протокол обмена "поверх" RS-232. Кстати, если Вы собираетесь в компе пользовать какие-нибудь стандартные утилиты для обмена по RS-232, то в ПЛИС Вам придется реализовать именно поддерживаемые ими протоколы обмена.

 

Скорее всего, эти вопросы покажутся смешными, но новичка они ставят в тупик. А написано так

подробно, потому что я хочу помочь вам помочь мне =)

 

За подробное описание спасибо.

 

К сожалению вопросы свидетельствуют, что Вы пока не разобрались с основами проектирования "железа" в целом и работы с ПЛИС в частности.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this