|
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 вообсче как ненужные.. Или тут должно быть чтото хитрей ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|