|
Quartus и VHDL, Как так-то... |
|
|
|
Jul 6 2008, 09:46
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Здравствуйте. Помогите разобраться с логикой работы VHDL...Что-то вообще я её не понимаю...почитал...вроде всё логично, а начинаю делать - вообще никак... Вот например: На вход схемы приходит сигнал IRDYn, я его сразу же передаю на выход схемы RST: RST<=IRDYn; Сигнал выходит с задержкой на целый такт...Там, конечно, говориться про дельто-задержку...но не настолько же... Как мне сразу передать на выход данные? Или вот ещё: Создаю компонент, который будет сравнивать приходящий адрес (ADR1) и содержание BAR в конфигурационном пространстве для PCI: ARCHITECTURE behavior OF ADR_CMP IS begin process(ADR1) begin if (ADR1 = BAR) then --Если адрес совпадает, то разрешаем доступ ADREN<='1'; else ADREN<='0'; ---Если нет - то нет... end if; end process; end behavior; В программе пишу: SET_SIGNALS: process(ADREN) begin if (ADREN='1') then --Если разрешён доступ, то выставляем соответствующие сигналы DEVSELn<='0'; TRDYn<='0'; DIREN_in<='1'; --Открытие буферных элементов для входнях сигналов else DEVSELn<='1'; TRDYn<='1'; DIREN_in<='0'; end if; end process SET_SIGNALS; Так вот, если в DIREN_in писать '1', то адрес не совпадает...но он же (DIREN_in) выставляется после того, как адрес определился...непонятно... P.S. DIREN_in так же изменяет направление передачи данных с двунаправленой шины AD, по которой в фазе адреса приходит тот самый адрес, а в фазе данных должны уходить данные....Может поэтому глючит...
|
|
|
|
|
Jul 6 2008, 10:06
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Вы забываете про тактовую частоту и строку "if clk'event and clk = '1' then" иначе у Вас будут не тригеры, а защелки. Должно быть наподобии Код SET_SIGNALS: process(ADREN, clk) begin if clk'event and clk = '1' then if (ADREN='1') then --Если разрешён доступ, то выставляем соответствующие сигналы DEVSELn<='0'; TRDYn<='0'; DIREN_in<='1'; --Открытие буферных элементов для входнях сигналов else DEVSELn<='1'; TRDYn<='1'; DIREN_in<='0'; end if; end if; end process SET_SIGNALS; Передачу сигналов с входа на выход можно делать и вне процесса. В VHDL кроме сигналов есть и переменные(variable), которые видны внутри данного процесса и переменным присвоение происходит без всяких задержек. P.S. Если это для контролёра PCI зайдите на opencores.org и скачайте реализацию ядра интерфейса шины PCI и посмотрите, как там это сделано. Просто PCI это не для новичка который только начинает разбираться в VHDL - это мое субъективное мнение
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 7 2008, 04:56
|

Полное ничтожество
    
Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354

|
Цитата(Maverick @ Jul 6 2008, 14:06)  Вы забываете про тактовую частоту и строку "if clk'event and clk = '1' then" иначе у Вас будут не тригеры, а защелки. Должно быть наподобии Код SET_SIGNALS: process(ADREN, clk) begin if clk'event and clk = '1' then if (ADREN='1') then --Если разрешён доступ, то выставляем соответствующие сигналы DEVSELn<='0'; TRDYn<='0'; DIREN_in<='1'; --Открытие буферных элементов для входнях сигналов else DEVSELn<='1'; TRDYn<='1'; DIREN_in<='0'; end if; end if; end process SET_SIGNALS; Передачу сигналов с входа на выход можно делать и вне процесса. В VHDL кроме сигналов есть и переменные(variable), которые видны внутри данного процесса и переменным присвоение происходит без всяких задержек. P.S. Если это для контролёра PCI зайдите на opencores.org и скачайте реализацию ядра интерфейса шины PCI и посмотрите, как там это сделано. Просто PCI это не для новичка который только начинает разбираться в VHDL - это мое субъективное мнение  использование переменных внутри процесса это заморочки кривого языка си (языка программирования) и не более того - hdl языки не языки программирования - они языки описания аппаратуры, что с программированием разные вещи. от того что все переменные будут глобальными ничего кроме пользы не будет на какой частоте симулируете??? процесс универсальное средство - я другими не пользуюсь например и его не обязательно тактировать
|
|
|
|
|
Jul 7 2008, 09:53
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 Maverick - касательно Код if (ADREN='1') then --Если разрешён доступ, то выставляем соответствующие сигналы DEVSELn<='0'; TRDYn<='0'; DIREN_in<='1'; --Открытие буферных элементов для входнях сигналов else DEVSELn<='1'; TRDYn<='1'; DIREN_in<='0'; els if; и Код if (ADR1 = BAR) then --Если адрес совпадает, то разрешаем доступ ADREN<='1'; else ADREN<='0'; ---Если нет - то нет... end if; Это можно сделать на простой логике , не включая тактовую в разбор полётов 2 hynter - если вы роутите сигнал со входа на выход в architecture - то на выходе сигнал будет иметь только задержку , кторая равна времени прохождяния сигнала по пути внутри кристала - как роутер положит - если у вас большая частота и путь кривоватый - то оно может выйти так , что сигнал выйдет гораздо позже чем зашёл смотря по тактовой..
|
|
|
|
|
Jul 8 2008, 07:39
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Ага. Спасибо большое за разъяснение!! Очень помогло!!=) Такой вопрос, всё-таки, остался...Вот есть кусок проги: ST: process(CLK) Begin if CLK'event and CLK='1' then
CASE STAT is
when IDLE => If (FRAMEn='0') then
If (AD1=BAR) then STAT<=S_DATA; DEVSELn<='0'; else STAT<=B_BUSY; DEVSELn<='Z'; end if; else STAT<=IDLE; AD1<=ZST; end if; ................................. end case; end if; end process ST; Сигналу DEVSELn значение упорно присваивается на целый такт позже чем это надо...То есть через такт после того, как выполняется условие AD1=BAR. Подскажите, пожалуйста, как этого избежать?
|
|
|
|
|
Jul 11 2008, 09:16
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Подскажите, пожалуйста, а как сохранить в переменную..или ещё куда данные? В определённый момент приходят данные на вход CBEn, которые потом теряются с него => их необходимо сохранить. Пишу:
------ shared variable CMD : std_logic_vector(3 downto 0):="ZZZZ"; ------ Process(FRAMEn) begin if falling_edge(framen) then CMD:=CBEn; end if; end process;
В результате в CMD не сохранятеся
|
|
|
|
|
Jul 13 2008, 09:22
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Обьясните, пожалуйста, как же всё-такие это работает...В книжках одно пишут...на деле - другое... Квартус половину функций не пропускает (например несколько WAITов в одном процессе)...список чувствиетльности вообще какая-то непонятная вещь...что туда ни пиши - получается, что он всё равно реагирует на все сигналы, которые в этом процессе проверяются...
Самый главный вопрос такой:
как передать данные, при их поступлении, сразу на выход?? Без всяких задержек...неужели он обычный провод синтезировать не может????
Сообщение отредактировал hynter - Jul 13 2008, 09:23
|
|
|
|
|
Jul 14 2008, 04:37
|

Полное ничтожество
    
Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354

|
Цитата(hynter @ Jul 13 2008, 13:22)  Обьясните, пожалуйста, как же всё-такие это работает...В книжках одно пишут...на деле - другое... Квартус половину функций не пропускает (например несколько WAITов в одном процессе)...список чувствиетльности вообще какая-то непонятная вещь...что туда ни пиши - получается, что он всё равно реагирует на все сигналы, которые в этом процессе проверяются...
Самый главный вопрос такой:
как передать данные, при их поступлении, сразу на выход?? Без всяких задержек...неужели он обычный провод синтезировать не может???? чето вы совсем темните выход <= вход; на самом деле порядка 3-5 наносекунд задержка на уровне вывода сколько у вас задержка
|
|
|
|
|
Jul 14 2008, 11:02
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 hynter - отвыкайте от wait - какпо мне - не сильно удобочитаемо - как то потыкался я в квартусе с этими вейтами - ни туда не сюда - да и забыл про них. На счёт списка чувствительности - всё что читается в процессе или проверяется. Хотя если вы туда что то не напишите - нечего страшного не будет. А на счёт Цитата как передать данные, при их поступлении, сразу на выход ну так вам rv3dll(lex) написал Код out <= in; Всё прекрасно работает и в планнере видится
|
|
|
|
|
Jul 16 2008, 14:06
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Ага...понятно в чём косяк=) Оно так и должно задерживаться...а у нас же 33MHz...оно медленней и поэтому всё хорошо=) Спасибо большое! Но вот такой теперь косяк: Всё работает! Комментирую подачу в выходной сигнал переменной, которая НИГДЕ НЕ ИСПОЛЬЗУЕТСЯ! ей просто присваивается значение - всё!! Летит вся прога вообще!! Одни неопределённые сигналы....вся диаграмма в крестах...
Как такое вообще может быть? Чего не так-то??
|
|
|
|
|
Jul 16 2008, 14:39
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 hynter - ну что значит Цитата НИГДЕ НЕ ИСПОЛЬЗУЕТСЯ понимаете в HDL языках понятие переменной немного не такое как в C++ ... Посмотрите внимательно код - возможно она муксится где то или семафорит кому либо. Или приведите код - телепаты то в отпуске - лето , море, пляж  ....
|
|
|
|
|
Jul 17 2008, 12:14
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Цитата(Kuzmi4 @ Jul 16 2008, 18:39)  Или приведите код.... Вот он код=) Речь шла о сигналах RD_TX и CNF_RD (вывод, без которого не работает, помечен коментарием "--NEED") Помогите пожалуйста разобраться...а то 24 сдавать уже всё это дело...а я недели 3 уже над этим бьюсь и никак не рвублюсь
Прикрепленные файлы
VHDL.txt ( 9.22 килобайт )
Кол-во скачиваний: 106
|
|
|
|
|
Jul 17 2008, 16:29
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 hynter - посмотримс на досуге .. А кому сдавать то - не диплом хоть ? ------------------ навскидку что видно , пока не ушёл домой: Код --********* --*SIGNALS* --********* NOT_WE <= '0' when (FRAMEn='0' and AD1=ADR ) else '1' when (DONE='0') else 'Z'; --Не распознан адрес RD_TX <= '1' when (FRAMEn='0' and CNF(4)=AD1) else '0'; --Транзакция чтения данных and CBEn="0010" CNF_RD <= '1' when (FRAMEn='0' and IDSEL='1' and CBEn="1010") else '0'; --Транзакция чтения конфигурации CNF_WR <= '1' when (FRAMEn='0' and IDSEL='1' and CBEn="1011") else '0'; --Транзакция записи конфигурации DONE <= '1' when (FRAMEn='1' and IRDYn='1') else '0'; --Транзакция Закончена А далее Код OUT2(0)<=NOT_WE; OUT2(1)<=RD_TX; ---NEED!! OUT2(2)<=CNF_RD; ---NEED!! OUT2(3)<=CNF_WR; Сделайте Код OUT2(0)<=NOT_WE; OUT2(1)<='0'; OUT2(2)<='0'; OUT2(3)<=CNF_WR; И будет вам счастие - выводы 1 и 2 порта OUT будут в нуле вечно, и синтезатор по идее должен выкинуть RD_TX и CNF_RD вообсче как ненужные.. Или тут должно быть чтото хитрей ?
|
|
|
|
|
Jul 18 2008, 09:01
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Со стэйт машинами я тут долго мудрил...вот нашёл в квартусе уже готовую часть нечто похожего на то, что мне нужно...покопался в коде и взял их оттуда..вот..
Вариант с OUT(1) - подошёл. Спасибо большое за подсказку! А вот там, где OUT(2)<=CNF_RD, при замене на '0' летит диаграмма вывода данных на AD1 при попадании на процедуру CONF_READ, хотя все управляющие сигналы DEVSELn, TRDYn, STOPn и PAR выставляются правильно...
И ещё при конфигурировании, то есть CNF_WR='1' засчёлкивается адрес, присвоенный моему устройству, в ADR. Он пишется правильно и храниться до конца работы. С этим адресом нужно сравнивать приходящий на AD1 код, что и делается в строчке:
RD_TX <= '0' when (FRAMEn='0' and AD1=ADR) else '1';
так вот, если писать так, то при сравнении AD1 и ADR, все сигналы становятся неопределёнными...а если задать адрес в переменную, то всё работает:
RD_TX <= '0' when (FRAMEn='0' and AD1=CNF(4)) else '1';
Сообщение отредактировал hynter - Jul 18 2008, 09:05
|
|
|
|
|
Jul 18 2008, 09:11
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 hynter - ступил малёхо, вы Код CNF_RD Заюзываете в процессе раздачи тасков Код --************************** --*STATE_mashine_controller* --**************************
process(NOT_WE,CNF_WR,CNF_RD,DONE,OTHER_CMD) begin case STAT is when IDLE => if (NOT_WE='0') then if CBEn="0010" then nxt_stat<=S_DATA; else nxt_stat<=BACKOFF; end if; !!! elsif (CNF_RD='1') then nxt_stat<=CONF_RD; elsif (CNF_WR='1') then nxt_stat<=CONF_WR; И есчё вот тут Код --Сохранение адреса читаемого регистра в пространстве конфигурации Process(CNF_RD) begin if (CNF_RD'event and CNF_RD='1') then ADDR <= AD1(7 downto 2); end if; end process; Ототго видно и валится. Не ненужный это сигнал оказался(ADDR кстати в вашей процедуре в стэйт-машине как раз присутствует).. Так что наверно следут оставить его в покое... Внимательней надо быть, этож ваш код..
|
|
|
|
|
Jul 18 2008, 10:01
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Я и не говорил, что CHF_RD не нужен! Как раз-таки очень нужный это сигнал.... Я сказал, что выводить его на OUT2(2) нет необходимости...я когда отлаживал - выводил и смотрел его состояние.....а когда всё заработало - я его (этот вывод) удалил и всё полетело...вот в чём вопрос.... Ну, впринципе, да и ладно бы с ним...пускай выводится...просто не буду назначать эти пины на саму ПЛИСину...
А вот ADDR я и не трогаю! С ним вообще всё отлично...сохраняется...распознаётся..выводится куда надо...засада в следующей засчёлке:
--Сохранение адреса устройства в регистр адреса в пространстве конфигурации Process(CNF_WR) begin if (CNF_WR'event and CNF_WR='0') then ADR:= AD1(31 downto 2)&"01" ; end if; end process;
вот с этим ADR-ом упорно не хочет корректно сравниваться...
Сообщение отредактировал hynter - Jul 18 2008, 10:02
|
|
|
|
|
Jul 18 2008, 10:57
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Хорошо!=) Спасибо большое за помощь! А RTL - это чё это и где это найти?? =)
|
|
|
|
|
Jul 19 2008, 14:05
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Понял почему такая фигня происходит! У меня ПЛИС EPM3256ATI144-10...она слишком медленная оказалась...если запустить на другой, со скоростью -5, то всё работате....беда только в том, что я никак не могу найти такую ПЛИС, да чтобы ешё и Индастриал была.....что делать...ума ни приложу....
|
|
|
|
|
Jul 19 2008, 15:03
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Как какая....всё та же: перестаёт работать, если удалить вывод OUT2(2)<=CNF_RD, все сигналы становятся неопределёнными, при сравнивании данных на AD1 и того, что помещено в ADR...если взять другую плисину, ну, например, EPM7256AEFC256-5, то всё работает отлично и никаких глюков не происходит...
|
|
|
|
|
Jul 19 2008, 16:37
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 27-02-07
Пользователь №: 25 709

|
Цитата(hynter @ Jul 19 2008, 18:05)  Понял почему такая фигня происходит! ... А нет...шутка...всё равно не работает...правда теперь в другом месте...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|