Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 22 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Очень нужна помощь людей которые разбираются в программировании, в частности на языке VHDL.
Задача заключается в следующем: есть макет с выходом на монитор VGA (макет через какой-то провод подключается к компу с которого мы прошиваем на макете контроллер Altera EPF10K20) и в результате на мониторе который подключен к выходу VGA на макете должно рисоваться шахматное поле (8 на 8 клеток) монитор с разрешением
640 на 480
Текст программы для перепрошивки мы должны написать на Max+Plus. Также дан пример текста для рисования на мониторе флага России, вот он:

(LIBRARY IEEE; --Подключение стандартной библиотеки
USE ieee/std_logic_1164.all; --Указание на используемый пакет
ENTITY Rus_flag IS – Начало описания декларативной части
PORT
(
--Debug: IN BOOLEAN;
Clock : IN std_logic; --Внешний выходной сигнал типа std_logic
HSync, VSync: OUT BOOLEAN; --Внешние выходные сигналы
--логического типа
vga_h_sync, vga_v_sync: OUT BOOLEAN; --Внешние выходные сигналы
--логического типа
R,G,B: out std_logic
);
END Rus_flag; --Конец описания декларативной части
ADCHITECTURE video OF Rus_flag IS –объявление архитектуры
SIGNAL CounterX, CounterY: INTEGER RANGE 0 to 1023; --Внутренние сигналы целого типа
--разрядностью 10 бит
SIGNAL HS, VS, vga_HS, vga_VS: BOOLEAN; --Внутренние сигналы логического типа
BEGIN --Начало описания архитектуры
Syncgen:PROCESS(Clock) – Объявление процесса
VARIABLE -- Объявление переменных процесса
EnableCntY, ResetCntY: Boolean;
BEGIN – Начало описания процесса
EnableCntY := (CounterX = 40);
ResetCntY := (CounterY = 524);

IF CLockEVENT AND Clock = '1'THEN
IF CounterX = 799 THEN
CounterX <= 0;
ELSE
CounterX <= CounterX+1;
END IF;
IF EnableCntY THEN
IF ResetCntY THEN
CounterY <= 0;
ELSE
CounterY <= CounterY + 1;
END IF;
END IF;
vga_HS <= (CounterX < 96);
vga_VS <= (CounterY < 2);
HS <= (CounterX = 128);
VS <= (CounterY = 32) AND HS;
--IF DEBUG THEN CouterY <= 31; END IF;
END IF;
END PROCESS Syncgen; --Конец описания процесса Syncgen
Video: Process(clock)
Variable Col_count: integer range 0 to 1023;
Variable HS _Latch:boolean; -- Объявление защелки как переменной
begin
--R <= '0'; B <= '0'; G<='0';
if(clock'EVENT'and Clock='0') then
if(HS) then
HS_Latch:=true; --Установка защелки для HS
end if;
if(HS_Latch) then
Col_count:=Col_count+1; --Счетчик длительности видеополя
if((0< CounterY)and(CounterY<150)) then – высота белой цветной полосы
if(Col_count<630) then –Установка белого цвета
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
elsif((150<CounterY)and(CounterY<300)) then -- высота синей цветной полосы
if(Col_count<630)then --установка синего цвета
R <= '0'; B <= '1'; G<='0';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false
end if;
elsif ((300<CounterY)and(CounterY<450)) then –высота красной цветной полосы
if (Col_count<630) then – установка красного цвета
R <= '1'; B <= '0'; G<='0';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false
end if;
else R <= '0'; B <= '0'; G<='0';
end if;
end if;
end if;
end Process Video;
--Присвоение значений внутренних сигналов внешним выходным сигналам
vga_h_sync<=vga_HS;
vga_v_sync<=vga_VS;
HSync<=HS;
VSync<=VS;
END video; )

Вопрос заключается вот в чем:
1. можно ли не делая кардинальных изменений в этом тексте нарисовать шахматное поле
2. Чтобы нарисовать в левом верхнем углу экрана первый квадратик я думаю надо написать
if((0< CounterY)and(CounterY<60)) then
if(Col_count<800) then
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;

а чтобы нарисовать второй квадратик(уже не белый а черный) справа от первого надо написать:

if((0< CounterY)and(CounterY<60)) then
if((Col_count>80)and(Col_count<160)) then
R <= '0'; B <= '0'; G<='0';
else
R <= '1'; B <= '1'; G<='1';
Col_count:=0; HS_Latch:=false;
end if;

прав ли я?
3. Если прав то как задать цикл чтобы он автоматически рисовал квадратики в строке (квадратик имеет размер 80 пикселей по ширине и 60 строк по высоте) сначала белый потом черный (8 штук) а потом перескакивал на следующую строку квадратиков и делал тоже самое только начинал не с белого а с черного квадратика (всего 8 строк)
Если кто-то мне поможет то буду очень благодарен!
Спасибо.

_________________
В сортире лучше быть юзером, чем админом...



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
хмм, первый раз слышу про такое.
Обьясни простыми словами, может можно будет сперва составить это на отвлеченном языке, а ты потом перегониш его на тот


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Ray Adams
Цитата:
первый раз слышу про такое.

про VHDL? Это язык для проектирования систем на СБИС(сверх больших интегральных схем).

Цитата:
Обьясни простыми словами


не знаю как объяснить проще... вобщем надо чтобы монитор подключенный к макету (на основе плат Altera одну из которых мы и прошиваем данной прогой) показывал шахматное поле(обычное поле 8 на 8 квадратиков, белые и черные)
Цитата:
может можно будет сперва составить это на отвлеченном языке, а ты потом перегониш его на тот

вся засада и заключается в том, что мне надо на этом языке (на другом каком-нибудь я сам могу попробовать, а с этим не знаю)
я бы мог каждый квадратик описать как я это описал в предыдущем посте, но тогда будет очнь длинно, а я хотел описать два квадратика и загнать их в цикл чтобы все автоматически было

Согласен, что очень своеобразная задача и сомневаюсь, что тут кто-нить найдется, кто в этом VHDL рубит, но надежда, как говорится, умирает последней.

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson Ладно, поробую свои 5 копеек внести.... С VHDL не очень знаком, немного с Verilog, но это похоже.... Впрочем, в данном случае язык значения не имеет...

Насколько я понял приведенный отрывок проги с выводом куска флага, переменная CounterY является текущей координатой Y, а Col_count - координатой X. Программа проверяет текущие координаты и ставит соответствующий цвет. Только во флаге цвет не меняется по горизонтали.
Попробуй сделать другую переменную, CounterY_div_120 ( к примеру ), которая будет являться остатком от деления текущей Y-координаты на 120. Аналогично, Col_count_div_160 будет являться остатком от деления текущей Х-координаты на 160. И проверяй условия замены цвета по ним. Это даст тебе изменение цвета по вертикали и горизонтали.

приблизительно так, наверное:

if(clock'EVENT'and Clock='0') then
if(HS) then
HS_Latch:=true;
end if;
if(HS_Latch) then
Col_count:=Col_count+1;

{здесь организуй остаток от деления CounterY_div_120 и Col_count_div_160 }

if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
elseif((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '0'; B <= '0'; G<='0';
else
Col_count:=0; HS_Latch:=false;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;

такой кусок процесса видео будет, имхо…. Больше подсказать вряд ли смогу....

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Цитата:
Попробуй сделать другую переменную, CounterY_div_120 ( к примеру ), которая будет являться остатком от деления текущей Y-координаты на 120

1. в книжке по VHDL остаток от деления не div а rem, ну да ладно это не принципиально и это я сам исправить смогу
2. Я не понял, что ты имел ввиду в этой строчке: получается, мы берем координату по Y равную 1 и делим ее на 120 и запоминаем остаток? Зачем это? Почему 120?
3. Соответственно те же вопросы по следующему предложению для координаты Х

4.
Цитата:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
elseif((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then

если не очень затруднит напиши плиз комментарии к строчкам а то я чего-то не очень понял. Я вообще в программировании туговат а тут блин дали на самостоятельное освоение язык!!! да еще и не объясняют. Может хоть вы тут поможете
Спасибо огромное!!!

Добавлено спустя 1 час, 31 минуту, 59 секунд:
еще поясни пожалуйста строку
Цитата:
{здесь организуй остаток от деления CounterY_div_120 и Col_count_div_160 }

:oops:

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson Счас попробую пояснить.
Цитата:
1. в книжке по VHDL остаток от деления не div а rem, ну да ладно это не принципиально и это я сам исправить смогу

Переменную назвал для примера, ты можешь сам назвать ее как угодно.
Цитата:
2. Я не понял, что ты имел ввиду в этой строчке: получается, мы берем координату по Y равную 1 и делим ее на 120 и запоминаем остаток? Зачем это? Почему 120?

Смысл в том, чтобы менять цвет в зависимости и от координаты Y, и от Х. Тебе нужна шахматка, разрешение 640х480, каждая клетка 80х60. Так? Так вот, подумай, какой остаток от деления будет текущей координаты ( пусть Х ) на 160? от 0 до 159 он ( остаток ) будет равен Х, а потом опять обнулится и начнет свой отсчет сначала. Если ты поставишь условие типа от 0 до 80 - белый цвет, а от 80 до 160 - черный. После того, как Х станет БОЛЬШЕ 160, остаток ОПЯТЬ станет 0, т.е. цикл изменения цвета повторится, что нам и нужно. С координатой игрек - то же самое.
поэтому эти условия -
Цитата:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then

Просто выбирают те области, которые будут закрашены белым. а именно - белыми будут клетки левая верхняя и нижняя правая. другие - черные. И эта матрица 2х2 клетки повторяется 4 раза по горизонтали, и 4 - по вертикали.

Теперь вот еще что. Вот эта строчка: if(Col_count<630) then ограничивает горизонталь в 630 точек. так как тебе полностью экран нужен, ставь 640.Иначе последние клетки будут кастрированы.

В принципе, это все. Весь приведенный мной кусок программы - будет твоим процессом видео. Ну, баги, ессно... как же без них... Отлаживать, небось, обязательно придется.....

По поводу остатка от деления. Я не помню точно, как в VHDL c чистой математикой. Я имел ввиду, что переменная CounterY_div_120 будет остатком от деления координаты Y на 120. ( Если рубишь в Паскале, там есть такая функция mod например, 5 mod 2 = 1, или 31 mod 16 = 15 тебе нужна такая же ) Соответственно, она будет возрастать от 0 до 119, потом опять обнуляться, и так 4 раза. Если с матаном там плохо, то организуй, если сможешь, двоичный одноразрядный счетчик с делением на 60. Будет то же самое. ( если 0 - белый цвет, 1 - черный ) Если в стандартных селлах он есть - то совсем хорошо.

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Я наверно очень тупой, но вот что я понял:
Пока мы рассматриваем 4 квадратика (в правом верхнем углу монитора 2 по горизонтали в первой шахматной строке и 2 по горизонтали во второй)
Вот этим условием
Цитата:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '1'; B <= '1'; G<='1';


у нас должны быть черными левый верхний и правый нижний квадратики(в пределах рассматриваемых нами 4 квадратиков)
А теперь вот, что я понял, а чего не понял:
Цитата:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then

то есть мы задаем координаты левого верхнего квадрата

а этим условием
Цитата:
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then

мы должны задать координаты правого нижнего... но со второй строкой в этом условии ясно , а вот с первой нет. Почему
(60 > CounterY_div_60) ? Разве не (60 < CounterY_div_120)? Ведь мы задаем правый нижний а у него по вертикали от 60 до 120...и этой скобкой мы должны задать больше 60
и (CounterY_div_60 < 120) почему? Как такое может быть, ведь вроде надо (CounterY_div_120 < 120) не может быть остаток от деления на 60 меньше 120 (то есть он быть может но нам то надо этой скобкой задать меньше 120 при div_120)

А теперь с
Цитата:
elseif((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then

разве в первой скобке (60 > CounterY_div_60) знак стоит правильный? По-моему надо (60 < CounterY_div_60)

А еще задав эти 4 квадратика, как ты говоришь
Цитата:
И эта матрица 2х2 клетки повторяется 4 раза по горизонтали, и 4 - по вертикали.

мне придется написать всего 16 таких условий по 5-6 строк?

Целое сочинение получилось. Спасибо за помощь

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson
Цитата:
А теперь вот, что я понял, а чего не понял:
Цитата:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then


то есть мы задаем координаты левого верхнего квадрата

а этим условием
Цитата:
if((60 > CounterY_div_60)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then

мы должны задать координаты правого нижнего... но со второй строкой в этом условии ясно , а вот с первой нет. Почему
(60 > CounterY_div_60) ? Разве не (60 < CounterY_div_120)? Ведь мы задаем правый нижний а у него по вертикали от 60 до 120...и этой скобкой мы должны задать больше 60


Да ессно, очепятка.... Извини.... :) ( Хорошо, что ты вчитываешься в текст..... ;) ) Нужно не 60 > CounterY_div_60, а 60 < CounterY_div_160... Просто когда кусок текста писал, сам знаешь, Copy - Paste.... Не забывай, мы просто задаем область на экране с соответствующими атрибутами, то есть цветом.
Правильно должно быть так:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 < CounterY_div_160)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
elseif((60 < CounterY_div_160)and(CounterY_div_60 < 120)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<630) then
R <= '0'; B <= '0'; G<='0';
else
Col_count:=0; HS_Latch:=false;
Уф-ф-ф... вроде правильно..... ( Это все Copy-Paste.... ;) И обрати внимание на знаки < и > , они жирным не выделяются.....)

Цитата:
А еще задав эти 4 квадратика, как ты говоришь
Цитата:
И эта матрица 2х2 клетки повторяется 4 раза по горизонтали, и 4 - по вертикали.

мне придется написать всего 16 таких условий по 5-6 строк?

Конечно же НЕТ! Это повторяющееся условие, понимаешь? Я же говорил, что ОСТАТОК от деления фактически ПЕРИОДИЧЕН! То есть, при изменении текущих координат по Х и Y остаток 4 раза будет возрастать и обнуляться.... Поэтому других условий НЕ НУЖНО! Шахматка и так нарисуется..... Главное, чтобы CounterY и Col_count изменялись в своих пределах от (0;480) и (0;640) соответственно.

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto Спасибо за то что помогаешь, но вроде опять опечатка или я не понял чего-то:
Цитата:
Правильно должно быть так:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 < CounterY_div_160)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then

Разве 3 строка первая скобка if((60 < CounterY_div_160) ? Почему CounterY_div_160? У нас ведь по вертикали один маленький квадратик 60 а так как мы берем 4 маленьких (2 по горизонтали 2 по вертикали) вроде не 160 а 120 должно быть, т.е. вот так:
if((60 < CounterY_div_120)and(CounterY_div_60 < 120)) и почему во второй скобке div_60? вроде div_120 и вся строчка:
if((60 < CounterY_div_120)and(CounterY_div_120 < 120))

а также в
Цитата:
elseif((60 < CounterY_div_160)and(CounterY_div_60 < 120)) then

почему 60 < CounterY_div_160? Надо 60 < CounterY_div_60...



Цитата:
Это повторяющееся условие, понимаешь?
если честн, то не очень... ну остаток от деления (по Х) от 0 до 159 = Х, потом стало 161 и что? Ведь у нас условие Col_count_div_160 я понимаю так что дальше этого квадрата т.е. дальше 160 не пойдет а просто обнулится и перейдет на строку ниже... а надо-то до 640



Цитата:
Главное, чтобы CounterY и Col_count изменялись в своих пределах от (0;480) и (0;640) соответственно

вроде это условие мы не задавали... надо добавить? Куда?

Спасибо!!!

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson
Цитата:
Спасибо за то что помогаешь, но вроде опять опечатка или я не понял чего-то:
Цитата:

Правильно должно быть так:
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 < CounterY_div_160)and(CounterY_div_60 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then


Разве 3 строка первая скобка if((60 < CounterY_div_160) ? Почему CounterY_div_160? У нас ведь по вертикали один маленький квадратик 60 а так как мы берем 4 маленьких (2 по горизонтали 2 по вертикали) вроде не 160 а 120 должно быть, т.е. вот так:
if((60 < CounterY_div_120)and(CounterY_div_60 < 120)) и почему во второй скобке div_60? вроде div_120 и вся строчка:
if((60 < CounterY_div_120)and(CounterY_div_120 < 120))


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

if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((60 < CounterY_div_120)and(CounterY_div_120 < 120)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<640) then
R <= '1'; B <= '1'; G<='1';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
elseif((60 < CounterY_div_120)and(CounterY_div_120 < 120)) then
if((0< Col_count_div_160)and(Col_count_div_160 < 80)) then
if((0< CounterY_div_120)and(CounterY_div_120 < 60)) then
if((80 < Col_count_div_160)and(Col_count_div_160 < 160)) then
if(Col_count<640) then
R <= '0'; B <= '0'; G<='0';
else
Col_count:=0; HS_Latch:=false;

Вроде так? ( Неужели еще раз придется переписывать? 8) )
Еще раз: мы вводим всего 2 новых переменных Col_count_div_160 и CounterY_div_120. Первая - остаток от деления Col_count ( текущая Х-координата ) на 160, вторая - остаток от деления CounterY ( текущая Y-координата ) на 120.

Цитата:
если честн, то не очень... ну остаток от деления (по Х) от 0 до 159 = Х, потом стало 161 и что? Ведь у нас условие Col_count_div_160 я понимаю так что дальше этого квадрата т.е. дальше 160 не пойдет а просто обнулится и перейдет на строку ниже... а надо-то до 640


Еще раз объясняю: старые переменные Col_count и CounterY никуда не деваются. именно они и меняются в своих пределах от (0;640) и (0;480) соответственно.
А ОСТАТКИ от деления - меняются от 0 до 159 и от 0 до 119 соответственно. ( 4 раза каждый ). Теперь понятно?
Цитата:
вроде это условие мы не задавали... надо добавить? Куда?

Ну, здравствуй, елка, Новый год! А процесс Syncgen на что?

ResetCntY := (CounterY = 524); // а это - ограничение по Y до 524.... а тебе 480 надо..... и все.....

IF CLockEVENT AND Clock = '1'THEN
IF CounterX = 799 THEN // это и есть задача Х от 0 до 800...
CounterX <= 0;
ELSE
CounterX <= CounterX+1;
END IF;
IF EnableCntY THEN
IF ResetCntY THEN
CounterY <= 0;
ELSE
CounterY <= CounterY + 1;
END IF


Теперь яснее? Надеюсь, больше ляпов нет.... Или?.....

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto
Цитата:
Вроде так? ( Неужели еще раз придется переписывать? 8) )

Да так! Congratulation!!! :dance: Спасибо
Буду разбираться непосредственно как это работает(на временных диаграммах). Если еще буду вопросы теперь знаю к кому обращаться :wink:
Спасибо!!!
PS теперь осталось только выяснить как же все-таки этот остаток от деления на этом языке пишется, а то что-то никак не получается(max+plus все время ругается что типа не знает таких слов, хотя остаток от деления в книге для VHDL это rem, а max+plus'у почему-то не нравится :mad2: ). Завтра пойду препода на эту тему мучать :gun:

:hi:

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson
Цитата:
Спасибо!!!

Да пожалуйста.... :)
Цитата:
PS теперь осталось только выяснить как же все-таки этот остаток от деления на этом языке пишется

Мне уже и самому стало интересно, как..... :)

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto
Плохие новости :weep: :weep: :weep:
Говорят, что VHDL с составе Max+ plus имеет на полную поддержку, а про остаток от деления говорят вряд ли он тут будет работать(т.е. из-за этой не полной поддержки) :mad2:
Но я покопался в справке и ввел там в поиске rem(в книге по VHDL rem называется остатком от деления) и он нашел rem keyword
в описание которого есть только одна строчка: <Multiplying Operator> ::= * | / | MOD | REM :insane:
не понял толком что она означает, но чувствую что придется писать по другому :weep:
Может тебе она о чем-то говорит? :?:

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
Sid Manson Вообще-то такие вещи нужно изучать как минимум с мануалом в руках. У тебя хоть какая-нибудь литература по VHDL есть? А то так долго мы будем переписываться...
Цитата:
в описание которого есть только одна строчка: <Multiplying Operator> ::= * | / | MOD | REM

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

если по-другому - то, как я уже сказал, можно сделать счетчик на 80, после него - Д-триггер. это будет то же самое, но сложней. Если честно, как конкретно это написать - не знаю, счас у самого никакой литературы нет. Но если книжку найдешь - там всегда примеры есть.
Я точно не уверен, но попробуй в процесс Syncgen сделать так ( кажется, доперло :) ):

Syncgen:PROCESS(Clock)
VARIABLE
EnableCntY, ResetCntY, ResetCntY_1: Boolean;
BEGIN
ResetCntY_1 := (CounterY = 120);
ResetCntY := (CounterY = 640);

IF CLockEVENT AND Clock = '1'THEN
IF CounterX = 799 THEN
CounterX <= 0;
ELSE
CounterX <= CounterX+1;
END IF;
IF Col_count_div_160 = 160 THEN
Col_count_div_160 <= 0;
ELSE
Col_count_div_160 <= Col_count_div_160+1;
END IF;


IF ResetCntY THEN
CounterY <= 0;
ELSE
CounterY <= CounterY + 1;
END IF;

IF ResetCntY_1 THEN
CounterY_div_120 <= 0;
ELSE
CounterY_div_120 <= CounterY_div_120 + 1;
END IF;

vga_HS <= (CounterX < 96);
vga_VS <= (CounterY < 2);
HS <= (CounterX = 128);
VS <= (CounterY = 32) AND HS;
--IF DEBUG THEN CouterY <= 31; END IF;
END IF;
END PROCESS Syncgen;
Я планировал получить эти переменные как остатки от деления "старших" переменных, но их можно задать как отдельные клоки, это непринципиально.

Пояснения:
1. EnableCntY := (CounterX = 40); выкинул потому, что это просто отступ сверху на 40. Нафиг он тебе нужен?
2. Поскольку все переменные "перещелкиваются" одними и теми же событиями ( IF CLockEVENT AND Clock = '1'THEN ), я запихнул их в один цикл. Попробуй разобраться, должно вроде все быть нормально. :)

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto
спасибо уже сделал
:beer: :beer: :beer:

Добавлено спустя 1 минуту, 33 секунды:
а остаток от деления действительно не поддерживается...

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 27.01.2003
welcomme:
http://www.telesys.ru/wwwboards/fpga/index.shtml


 

Member
Статус: Не в сети
Регистрация: 02.06.2004
Откуда: 97RUS
mse Сенкс, но немного не в тему... Мы тут конкретно VHDL обсуждаем, а не программируемую логику.... Но все равно спасибо.
Sid Manson Если все заработает как надо, ты отпишись, что ли... А то мне и самому уже интересно... Что я, зря 3 раза переписывал? :lol:

_________________
INTEGRAted man


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto ок в пятницу иду проверять и обязательно напишу все в подробностях :hi:

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Сегодня меня препод кинул(просто взял и не пришел) Жду понедельника :slobber:

_________________
В сортире лучше быть юзером, чем админом...


 

Member
Статус: Не в сети
Регистрация: 29.01.2004
Откуда: Питер
Yamamoto
Наконец то я добрался до макета и проверил сие чудо. Ожидания оправдались и все заработало был конечно и небольшой глюк в виде самой первой строчки которая почему то была либо смещена чуть вправо либо была белой как будто там изображение накладывается но я немного переделал теперь думаю все ок
Если интересно то я написал так
if((2<CounterY) and (CounterY<65)) then
if(Col_count<83)then
R <= '1'; B <= '1'; G<='1';
elsif(82<Col_count) and (Col_count<166)then
R <= '0'; B <= '0'; G<='0';
elsif(165<Col_count) and (Col_count<249) then
R <= '1'; B <= '1'; G<='1';
elsif((248<Col_count) and (Col_count<332))then
R <= '0'; B <= '0'; G<='0';
elsif(331<Col_count) and (Col_count<415) then
R <= '1'; B <= '1'; G<='1';
elsif(414<Col_count) and (Col_count<498) then
R <= '0'; B <= '0'; G<='0';
elsif(497<Col_count) and (Col_count<580) then
R <= '1'; B <= '1'; G<='1';
elsif(579<Col_count) and (Col_count<660) then
R <= '0'; B <= '0'; G<='0';
else
R <= '0'; B <= '0'; G<='0';
Col_count:=0; HS_Latch:=false;
end if;
это описание первой шахматной строки остальные семь описываются аналогично только меняется в первой строке координата 'у' и соответственно в зависимости от строки последовательность белых и черных квадратов изменяется
Может и громоздко зато вроде работает да и препод не против такого написания а если он не против то зачем мне напрягаться

_________________
В сортире лучше быть юзером, чем админом...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 22 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan