Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios II + VGA проблема
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Artur Nikolajev
Добрый день! У меня такая проблемка:
Я составил самый простой процессор на Ниосе....



Попробивал запустить и откомпилировать. Всё работает! дальше...

Написал VGA модуль на VHDL:

CODE
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;



ENTITY vga_sync_gv IS
PORT
(
clk : IN STD_LOGIC;
v_sync : out STD_LOGIC;
h_sync : OUT STD_LOGIC;
h_out, v_out : INOUT INTEGER RANGE 0 TO 1023;
VGA_Blank, VGA_sync : INOUT STD_LOGIC;
blue, red, green : OUT STD_LOGIC_VECTOR(9 DOWNTO 0)

);
END vga_sync_gv;



ARCHITECTURE a OF vga_sync_gv IS
SIGNAL h, v: INTEGER RANGE 0 TO 1023;
BEGIN

PROCESS
VARIABLE video_on_h, video_on_v: STD_LOGIC;
BEGIN
WAIT UNTIL RISING_EDGE(clk);

IF h < 800 THEN --skaita 800 horizontâlos pixeïus (ieskaitot palîgpixeïus)!
h <= h + 1;
ELSE
h <= 0;
END IF;





IF ( h <= 755 ) AND (h >= 659 ) THEN
h_sync <= '0';
ELSE
h_sync <= '1';
END IF;


IF ( v >= 524 ) AND ( h >= 699 ) THEN
v <= 0;
ELSIF ( h = 699 ) THEN
v <= v + 1;
END IF;

------------------------------------------
IF ( v <= 494 ) AND ( v >= 493 ) THEN
v_sync <= '0';
ELSE
v_sync <= '1';
END IF;

IF ( h <= 639 ) THEN
video_on_h := '1';
h_out <= h;
ELSE
video_on_h := '0';
END IF;

IF ( v <= 479 ) THEN
video_on_v := '1';
v_out <= v;

ELSE
video_on_v := '0';
END IF;


VGA_Blank<= (video_on_h AND video_on_v);

END PROCESS;








PROCESS (VGA_Blank, v_out, h_out)
BEGIN
blue<= "0000000000";
red<= "0000000000";
green<= "0000000000";

IF (h_out > 100) AND (h_out<400) AND (v_out > 100) AND (v_out<300) THEN
green<= "0011100000";
blue<= "1001100000";
red<= "1111100000";
END IF;

END PROCESS;

END a;


Прикрепил его к Ниосу:


Получилось:




При компиляции выдаёт ошибку.....


Скажите пожалуйста что я делаю не так?
Serhiy_UA
Посмотрите в an333.pdf

Еще в http://electronix.ru/forum/index.php?showtopic=46550&hl=
Kuzmi4
2 Artur Nikolajev - если в 2-х словах - в компонент эдиторе неправильно сигналы выставили biggrin.gif
Artur Nikolajev
Цитата(Kuzmi4 @ Jun 4 2009, 13:04) *
2 Artur Nikolajev - если в 2-х словах - в компонент эдиторе неправильно сигналы выставили biggrin.gif


A mozno popodrobnej? smile.gif
torik
Вы когда делали компонент для SOPC, обратили внимание на красненькие надписи? Это интерфейс Conduit... Надо руководствоваться описанием SOPC Builder и документами на которые там идет ссылка (описание шины авалон). Дабы избежать таких проблем желательно задавать имена сигналам в соответствии с правилами.

Кстати, ширина 1024 - это явно ошибка. 10 бит...
Artur Nikolajev
Подскажите пожалуйста! как избавится от следующих варингов? и что они вообще значат? спаибо!

vadimuzzz
Цитата(Artur Nikolajev @ Jun 4 2009, 23:13) *
Подскажите пожалуйста! как избавится от следующих варингов? и что они вообще значат? спаибо!

первый видимо вызван тем, что на vga подается клок 27МГц, а проц работает на 100. надо бы переделать: регистры vga должны писаться/читаться по клоку процессора. когда переходите от одного клока к другому, принято ставить FIFO. а почему не используете это : http://www.altera.com/literature/hb/nios2/qts_qii55006.pdf ?
второй говорит, что у вас шина 10 бит, а у авалона 32. либо ставьте byteenable, либо сделайте 32 бита, а старшие можно игнорить внутри модуля.
Artur Nikolajev
Цитата(vadimuzzz @ Jun 5 2009, 03:02) *
первый видимо вызван тем, что на vga подается клок 27МГц, а проц работает на 100. надо бы переделать: регистры vga должны писаться/читаться по клоку процессора. когда переходите от одного клока к другому, принято ставить FIFO. а почему не используете это : http://www.altera.com/literature/hb/nios2/qts_qii55006.pdf ?
второй говорит, что у вас шина 10 бит, а у авалона 32. либо ставьте byteenable, либо сделайте 32 бита, а старшие можно игнорить внутри модуля.

А как правельно усановить byteenable?
vadimuzzz
Цитата(Artur Nikolajev @ Jun 5 2009, 11:42) *
А как правельно усановить byteenable?

тут посмотрите http://www.altera.com/literature/manual/mnl_avalon_spec.pdf


еще примерчик
http://www.altera.com/support/examples/nio...celeration.html
Artur Nikolajev
Цитата(vadimuzzz @ Jun 5 2009, 02:02) *
первый видимо вызван тем, что на vga подается клок 27МГц, а проц работает на 100. надо бы переделать: регистры vga должны писаться/читаться по клоку процессора. когда переходите от одного клока к другому, принято ставить FIFO. а почему не используете это : http://www.altera.com/literature/hb/nios2/qts_qii55006.pdf ?
второй говорит, что у вас шина 10 бит, а у авалона 32. либо ставьте byteenable, либо сделайте 32 бита, а старшие можно игнорить внутри модуля.


Извините, может за глупий вопрос. А если устанавливать 32 бита, то это в каких сигналах нужно делать?
vadimuzzz
Цитата(Artur Nikolajev @ Jun 7 2009, 21:53) *
Извините, может за глупий вопрос. А если устанавливать 32 бита, то это в каких сигналах нужно делать?

шина данных
Artur Nikolajev
Цитата(vadimuzzz @ Jun 7 2009, 19:33) *
шина данных

Шина данных Это там где avalon_slave интерфейс?
vadimuzzz
Цитата(Artur Nikolajev @ Jun 7 2009, 23:54) *
Шина данных Это там где avalon_slave интерфейс?

да, туда проц пишет/читает, а у него мастер 32 бита.
Artur Nikolajev
Цитата(vadimuzzz @ Jun 8 2009, 14:24) *
да, туда проц пишет/читает, а у него мастер 32 бита.

Уменя с avalon_slave связано:
input address;
input cs;
input write;
input [7:0] fifo_data;
output fifo_not_full;
output lastpixel;
Как это правельно записать?
Так:
input [31:0] address;
input [31:0] cs;
input [31:0] write;
input [31:0] fifo_data;
output [31:0] fifo_not_full;
output [31:0] lastpixel;
vadimuzzz
Цитата(Artur Nikolajev @ Jun 9 2009, 14:59) *
Уменя с avalon_slave связано:
input address;
input cs;
input write;
input [7:0] fifo_data;
output fifo_not_full;
output lastpixel;
Как это правельно записать?
Так:
input [31:0] address;
input [31:0] cs;
input [31:0] write;
input [31:0] fifo_data;
output [31:0] fifo_not_full;
output [31:0] lastpixel;

точно не так smile.gif какой хотите интерфейс? Avalon Memory Mapped? я выше пример приводил http://www.altera.com/support/examples/nio...celeration.html
для MM надо
адрес(сколько бит внутреннее адр. пространство модуля)
данные(запись, чтение) - для простоты 32 бита
clk,rst,cs,wr,rd по 1 бит
внешние сигналы - как вам надо.
всем сигналам сделать префиксы для авт. распознавания.

p.s. может задачку поконкретнее сформулируете?
Копейкин
Уважаемые всезнающие господа, помогите советом пожалуйста.
У меня в системе 2 модуля FIFO.
В один из них аппаратно, из потока, пишутся данные очень редко.
Из другого аппаратно извлекаются данные и встраиваются в поток. Тоже не быстро.
Оба модуля 8 битные, глубиной 16 байт.
Подскажите, как их (модули) правильно подключить на Авалон ММ чтобы NIOSII мог из одного модуля читать, а в другой записывать побайтно.
Модули созданы МегаВизардом на основе dcfifo и уже вставлены в систему.
Клоки чтения и записи разные.
Ширина шины входа/выхода - 8/8бит.
На стороне ФИФО, подключаемой к NIOS надо подавать тот же клок, что подается на модуль процессора?
torik
Для записи надо напрямую подключить данные шины авалон на вход FIFO, а в качестве сигнала записи - datavalid. В шину выдать сигнал готовности при необходимости (переполнение фифо).
Для чтения по аналогии.
Sergey'F
Цитата(Копейкин @ Aug 7 2009, 11:39) *
Уважаемые всезнающие господа, помогите советом пожалуйста.
У меня в системе 2 модуля FIFO.
В один из них аппаратно, из потока, пишутся данные очень редко.
Из другого аппаратно извлекаются данные и встраиваются в поток. Тоже не быстро.
Оба модуля 8 битные, глубиной 16 байт.
Подскажите, как их (модули) правильно подключить на Авалон ММ чтобы NIOSII мог из одного модуля читать, а в другой записывать побайтно.
Модули созданы МегаВизардом на основе dcfifo и уже вставлены в систему.
Клоки чтения и записи разные.
Ширина шины входа/выхода - 8/8бит.
На стороне ФИФО, подключаемой к NIOS надо подавать тот же клок, что подается на модуль процессора?

1. Периферийный модуль может тактироваться любым клоком, просто Quartus автоматом вставит логику перехода между доменами, довольно медленную. Если нужно более высокое быстродействие обмена между доменами, смотрите Avalon-MM Clock Crossing Bridge.
2. В Вашем случае стоит посмотреть в сторону Avalon-ST и компонент типа Avalon-ST Dual Clock FIFO. Avalon-ST, условно говоря, не шинный интерфейс Avalon-MM, а интерфейс типа точка-точка, заточенный под потоковые передачи.
3. Если лень разбираться с Avalon-ST, то можно посмотреть примеры и сделать периферийный модуль на Avalon и в нем обратиться к FIFO. Там внутри и с разрядностью разберетесь как надо.
Копейкин
Я разобрался с чтением из FIFO, подключенным к Авалон ММ:
В редакторе нового компонента создал компонент с сигналами:
clk
readdata[7..0]
read
address[1..0] - вывел, но не использовал.
Файлы описания не подключал и SOPC билдер вывел эти сигналы наружу из процессора.
Еще указал в свойствах интерфейса:
Все времена задержек = 0
и в Deprecated параметрах указал тип адресации NATIVE а не DYNAMIC.
Если этого не сделать то при 8-битной шине будут проводится 4 чтения подряд.!!!
Сам интерфейс чтения у FIFO должен быть: Show-ahead sinchronouse FIFO mode.
Тактовая частота та же, что и для процессора.
Таким образом заработало.
Теперь добиваю запись в FIFO...
-------------------------
Подскажите еще:
Если тип адресации DYNAMIC, то как при 8-битной шине данных избежать 4-х кратного чтения.
Для записи вроде сигнал byteenable[] должен помочь.
Или выводить шину address[1..0] и строить дешифратор для доступа к младшему байту.
Или я вообще ни разу не прав?????
Всем откликнувшимся громадное спасибо!!!

Цитата(Sergey'F @ Aug 7 2009, 16:08) *
1. Периферийный модуль может тактироваться любым клоком...
2. В Вашем случае стоит посмотреть в сторону Avalon-ST и компонент типа Avalon-ST Dual Clock FIFO.
3. Если лень разбираться с Avalon-ST, то можно посмотреть примеры и сделать периферийный модуль на Avalon и в нем обратиться к FIFO. Там внутри и с разрядностью разберетесь как надо.

1. Этого не требуется
2. К сожалению переход между Avalon-ST и Avalon-MM остался выше моего понимания.
Я так понял, нужно ставить Scatter-Gather DMA и все равно делать свой компонент для вывода сигналов Avalon-ST наружу из процессора.
Это мне кажется слишком сложно для обработки изредка приходящих команд управления.
3. Avalon-ST Dual Clock FIFO все равно никак не подключается к шине Avalon MM.
А мне надо, чтобы NIOSII получал эти байты команд...
Спасибо за советы laughing.gif


Цитата(torik @ Aug 7 2009, 15:52) *
Для записи надо напрямую подключить данные шины авалон на вход FIFO, а в качестве сигнала записи - datavalid. В шину выдать сигнал готовности при необходимости (переполнение фифо).
Для чтения по аналогии.

А как быть с таймингами?
Для dcfifo запись/чтение производится по положительным перепадам clk.
rdreq/wrreq являются только сигналами разрешения.
Пока они активны с каждым перепадом будет запись/чтение.
А для чтения FIFO отдельная заморочка с выдачей данных...
Sergey'F
Цитата(Копейкин @ Aug 7 2009, 17:32) *
3. Avalon-ST Dual Clock FIFO все равно никак не подключается к шине Avalon MM.

Я не про компонент ST FIFO, я про обычный пользовательский модуль со slave портом на avalon-mm. И в нем внутри осуществляется обращение к Вашему FIFO, которое Вы уже создали. Можно как пример вставить в проект модуль PIO и посмотреть после генерации его исходники. Там понятно, как разбираться с адресом, чипселектом и т.д..

Но Вы уже все равно сделали, так что это ни к чему.

dynamic alignment:
Если master пишет в slave большей разрядности, шина выставляет byteenable на нужные байты (естественно, slave их должен корректно обработать).
Если master читает из slave большей разрядности, читается слово целиком и выбираются данные из нужных байт.
Если master пишет в slave меньшей разрядности, шина формирует n записей по последовательным адресам (и пока не закончит, master ждет).
Если master читает из slave меньшей разрядности, шина формирует n чтений по последовательным адресам (и пока не закончит, master ждет).

Ели такое поведение не нужно - проще всего не использовать deprecated параметры, тем более про включение native alignment в документации написано очень размыто, а, например, объявить 32-х разрядный порт, а в устройстве использовать только младшие 8 бит (читать младшие 8 при записи от шины и выставлять младшие 8, а остальные нули при чтении от шины).
torik
Цитата
А как быть с таймингами?
Для dcfifo запись/чтение производится по положительным перепадам clk.

Ну и что, у вас разве что-то работает по отрицательным перепадам?


Цитата
rdreq/wrreq являются только сигналами разрешения.
Пока они активны с каждым перепадом будет запись/чтение.
А для чтения FIFO отдельная заморочка с выдачей данных...


Конечно, необходимо добавить немного логики, которая контролирует заполненность FIFO.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.