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;
такой кусок процесса видео будет, имхо…. Больше подсказать вряд ли смогу....
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 }
_________________ В сортире лучше быть юзером, чем админом...
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 - черный ) Если в стандартных селлах он есть - то совсем хорошо.
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) соответственно.
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
Теперь яснее? Надеюсь, больше ляпов нет.... Или?.....
Member
Статус: Не в сети Регистрация: 29.01.2004 Откуда: Питер
Yamamoto
Цитата:
Вроде так? ( Неужели еще раз придется переписывать? 8) )
Да так! Congratulation!!! Спасибо
Буду разбираться непосредственно как это работает(на временных диаграммах). Если еще буду вопросы теперь знаю к кому обращаться Спасибо!!!
PS теперь осталось только выяснить как же все-таки этот остаток от деления на этом языке пишется, а то что-то никак не получается(max+plus все время ругается что типа не знает таких слов, хотя остаток от деления в книге для VHDL это rem, а max+plus'у почему-то не нравится ). Завтра пойду препода на эту тему мучать
_________________ В сортире лучше быть юзером, чем админом...
Member
Статус: Не в сети Регистрация: 29.01.2004 Откуда: Питер
Yamamoto Плохие новости Говорят, что VHDL с составе Max+ plus имеет на полную поддержку, а про остаток от деления говорят вряд ли он тут будет работать(т.е. из-за этой не полной поддержки) Но я покопался в справке и ввел там в поиске rem(в книге по VHDL rem называется остатком от деления) и он нашел rem keyword
в описание которого есть только одна строчка: <Multiplying Operator> ::= * | / | MOD | REM не понял толком что она означает, но чувствую что придется писать по другому Может тебе она о чем-то говорит?
_________________ В сортире лучше быть юзером, чем админом...
Member
Статус: Не в сети Регистрация: 02.06.2004 Откуда: 97RUS
Sid Manson Вообще-то такие вещи нужно изучать как минимум с мануалом в руках. У тебя хоть какая-нибудь литература по VHDL есть? А то так долго мы будем переписываться...
Цитата:
в описание которого есть только одна строчка: <Multiplying Operator> ::= * | / | MOD | REM
если есть остаток от деления - значит, можно сделать.
Цитата:
не понял толком что она означает, но чувствую что придется писать по другому
если по-другому - то, как я уже сказал, можно сделать счетчик на 80, после него - Д-триггер. это будет то же самое, но сложней. Если честно, как конкретно это написать - не знаю, счас у самого никакой литературы нет. Но если книжку найдешь - там всегда примеры есть.
Я точно не уверен, но попробуй в процесс Syncgen сделать так ( кажется, доперло ):
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 ), я запихнул их в один цикл. Попробуй разобраться, должно вроде все быть нормально.
Member
Статус: Не в сети Регистрация: 02.06.2004 Откуда: 97RUS
mse Сенкс, но немного не в тему... Мы тут конкретно VHDL обсуждаем, а не программируемую логику.... Но все равно спасибо. Sid MansonЕсли все заработает как надо, ты отпишись, что ли... А то мне и самому уже интересно... Что я, зря 3 раза переписывал?
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;
это описание первой шахматной строки остальные семь описываются аналогично только меняется в первой строке координата 'у' и соответственно в зависимости от строки последовательность белых и черных квадратов изменяется
Может и громоздко зато вроде работает да и препод не против такого написания а если он не против то зачем мне напрягаться
_________________ В сортире лучше быть юзером, чем админом...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения