Перейти к содержанию
    

33 minutes ago, Alexey87 said:

в архиве изображение.

Не, надо блок схему рисовать. Кажется что это слишком сложно и бессмысленно, но именно сейчас я бы рекомендовал последовать совету и таки нарисовать эту блок схему. Надо учиться рисовать блоки, это просто и в какой то мере даже весело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Alexey87 сказал:

подключил память RAM (думаю что неправильно)

Естественно — Вы ведь её заявили однопортовую, тогда как мало того, что для задачи требуется двухпортовая, так ещё и в реальности в ПЛИС есть только именно такие, т.е. если Вы всё оставите неизменно, то её всё равно потребуется реализовать, то бишь разделением во времени, как в старые добрые времена.

 

Также, log2(3700)=11,9, а не 13,9, и адресация у Вашего ОЗУ непрерывная десятичная, её никаким чудом двоичной склейкой не получить, т.е. требуется умножать указатель вертикали на размер по горизонтали и прибавлять указатель горизонтали, из чего следует логичный вывод, что под неё проще объявить ещё один счётчик, тупо работающий в видимой области.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 minutes ago, Flip-fl0p said:

Отобразите все ваши блоки на одной структурной схеме.

прикладываю "схему".

scheme.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, Plain said:

для задачи требуется двухпортовая

А что должно быть на входе и соответственно на выходе (не совсем понимаю для чего)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Plain said:

источнику данных,

координаты и адрес символа?

если да, то в каком формате?

 

8 minutes ago, Plain said:

чтения — дисплею.

бит из строки (слова) символа (8 бит) ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы мастерите текстовый терминал, значит видеопамять хранит коды символов, по которым из памяти знакогенератора извлекается их графика.

 

Вы объявили аппаратно одномерный массив, следовательно, и источник данных (хост, порт записи ОЗУ), и их демонстратор (дисплей, порт чтения ОЗУ), одинаково в курсе, как он делится на два измерения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 15.09.2019 в 23:41, Alexey87 сказал:

координаты и адрес символа?

если да, то в каком формате?

 

бит из строки (слова) символа (8 бит) ?

 

У Вас почти все правильно нарисовано. Теперь реализуйте все блоки отдельно. Один блок - один файл. И на верхнем уровне в соответствии с Вашей структурной схемы объедините все блоки. Соответственно, как Вам уже сказали видеопамять - это двухпортовая память. С одного порта Вы читаете из неё данные и выводите на экран. А с другого порта в эту память пишет процессор (или некое устройство - "заполнитель памяти", которое формирует Вам изображение). Теперь Вы хотите, чтобы видео-память как-то заполнялась. Для этого Вы хотите запустить "заполнитель памяти"  с кнопки. Для этого надо правильно обработать нажатие кнопки:

1. Перенести сигнал в рабочий домен и отфильтровать дребезг. 

2. Выделить фронт Вашего старт-сигнала.

Затем Вам нужен простенький автомат, который по пришествию старт-сигнала с кнопки выполнит запись в видеопамять и остановит свою работу по завершению задачи. Запись должна быть в соответствии с принятым Вами форматом данных.

И не забудьте про один важный момент. Вы должны сигналы H_sync и V_sync задержать на время, равное времени доступу к памяти symbol_ROM, иначе Вы будете выводить символы не там где хотите...

Я привел свой пример структурной схемы. Только у меня маленькое отличие от Вашей схемы: у меня symbol_rom это массив векторов длинной 8 бит. Соответственно у меня есть некий мультиплексор который выбирает нудный бит из вектора. Но этот момент не принципиальный (главное, чтобы Quartus Ваши одиночные вектора разложил в виде памяти, а не на регистрах)

P.S. Как я понимаю Вы не моделировали поведение Вашей схемы в Modelsim ? А зря. Ваш проект можно полностью отладить на симуляторе.

IMG_20190916_003528.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте Flip-fl0p и all.

20 hours ago, Flip-fl0p said:

С одного порта Вы читаете из неё данные и выводите на экран. А с другого порта в эту память пишет процессор (или некое устройство - "заполнитель памяти", которое формирует Вам изображение).

вот эту память я и хотел использовать:

Spoiler

module single_port_ram
(
	input [6:0] data,
	input [12:0] addr,
	input we, clk,
	output [6:0] q
);
	// Declare the RAM variable
	reg [6:0] ram[3699:0];
	// Variable to hold the registered read address
	reg [12:0] addr_reg;
	
	always @ (posedge clk)
	begin
	// Write
		if (we)
			ram[addr] <= data;//запись
		addr_reg <= addr;	  
	end
	assign q = ram[addr_reg];//чтение
endmodule

 

 

20 hours ago, Flip-fl0p said:

Вы должны сигналы H_sync и V_sync задержать на время, равное времени доступу к памяти symbol_ROM, иначе Вы будете выводить символы не там где хотите...

Spoiler

для задержки (гор. и верт. синхр.) я использовал неблокирующее присваивание:
//Задержка гор. и верт. синхр.
	hsync_delayed1 <= hsync;
	hsync_delayed2 <= hsync_delayed1;
	hsync_delayed3 <= hsync_delayed2;
	//
	vsync_delayed1 <= vsync;
	vsync_delayed2 <= vsync_delayed1;
	vsync_delayed3 <= vsync_delayed2;
//Задержка гор. и верт. синхр.
assign hsync_out = hsync_delayed3;
assign vsync_out = vsync_delayed3;  

и задержку pixel_x (для ROM_symbol) иначе рисует абракадабру:
//Задержка pixel_x для извлечения бита из строки ROM
    pix_x1_reg <= pixel_x;
    pix_x2_reg <= pix_x1_reg;
    pix_y1_reg <= pix_x2_reg;
    pix_y2_reg <= pix_y1_reg;
также задердка для видимой области:
//Задержка видимой области
	inDisplayAreaDelayed1 <= inDisplayArea;
	video_on <= inDisplayAreaDelayed1;    
    inDisplayArea <= (hcounter < HVisible_area) && (vcounter < VVisible_area);  	

 

я сейчас не пойму почему (даже после добавления задержки), символ на экране дублируется по вертикали (фото)?

 

кнопка_отпущена.jpg

ведь номер знакоместа для расположения символа указан явно - x  = 0, y  = 1... и верхний (первый) символ расположен правильно, а откуда взялся второй?

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Alexey87 сказал:

ведь номер знакоместа для расположения символа указан явно - x  = 0, y  = 1... и верхний (первый) символ расположен правильно, а откуда взялся второй?

Это не сложно.

Генератор уже начал рисовать кадр заново, а монитор еще рисует прежний кадр... Т.е. развертка по вертикали у монитора длится дольше, чем у генератора...

PS Был я как то в такой ситуации, когда нужно было сделать ПЗУ для знакогенератора. Руками было - лень. Так я сделал экранное приложение в ВСВ и там были "плитки", составляющие знакоместо. По ним кликал и они из белых делались черными. А потом по нажатию кнопки выдавалась строка для ПЗУ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, iosifk said:

Генератор уже начал рисовать кадр заново, а монитор еще рисует прежний кадр... Т.е. развертка по вертикали у монитора длится дольше, чем у генератора...

просто не совсем понятно, ведь координаты символа жёстко прописаны и при отрисовке они извлекаются из RAM, а рисует в другом месте...

как это исправить?

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Alexey87 сказал:

просто не совсем понятно, ведь координаты символа жёстко прописаны и при отрисовке они извлекаются из RAM, а рисует в другом месте...

как это исправить?

Безусловно, координаты заданы жестко. Но вот мониторы обычно многорежимные. И синхроимпульсы строчные и кадровые бывают разной полярности... И монитор скорее всего не понимает синхронизацию от генератора. Тупой он гад... И пока не дашь ему то, что он хочет... Самое простое, если сделать все эти значения параметризируемыми. Задал новое значение параметра, компильнул, залил и проверяй...

А чтобы было проще, сделайте классику - генерацию полос по горизонтали, или по вертикали или клетки. Или заполняйте строки символами. Строка "1111...1", "1212...1" и что-то в этом роде. Ну и смотрите, как кадр прорисовывается на экране...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 часа назад, Alexey87 сказал:

я сейчас не пойму почему (даже после добавления задержки), символ на экране дублируется по вертикали (фото)?

А я Вам не просто так говорил сделайте синхрогенератор немного другим способом, который будет удобен для работы. Даже пример своего рабочего кода привел. Да может у меня немного он избыточен. Однако он удобен на моделировании...

Вы прежде чем в железке проверять, запаситесь чаем\кофе и проверяйте в Modelsim. Проверять в железке надо когда в Modelsim все работает... Попробуйте, Вам понравится !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Flip-fl0p said:

Проверять в железке надо когда в Modelsim все работает... Попробуйте, Вам понравится !

я не сомневаюсь, но где найти конкретные правила (базовые) написания тестбенча/ей (на русском языке) я не знаю, то что я находил в интернете это уже готовый тестбенч где не поясняется практически ничего (типа вот смотрите я написал и это легко) или hello world. Тестбенч как я понял это изменённое устройство и опять таки если в тестбенче всё хорошо, то из него для синтеза некоторые вещи не подходят (задержки #, циклы), а значит надо переписывать (мне и сейчас после "классических" ЯП не особенно даётся проектирование (а не программирование))).

В том виде в котором описывается устройство на verilog'e (или VHDL) ModelSim не всегда принимает. Хотя может мне попадались такие материалы которые только ещё больше запутают.

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Flip-fl0p сказал:

А я Вам не просто так говорил сделайте синхрогенератор немного другим способом, который будет удобен для работы. . Попробуйте, Вам понравится !

Ну нельзя же так то...

Вот Вы "делай раз, делай два, готово - на, забери". А где волшебство? Где неведомое? Ведь для кого-то важен результат, а для кого-то - процесс. Сами смотрите, уже 6-я страница с 25-го июля, а конца-края не видно. Вот это и есть круто для ТС. Так что "не надо думать, надо трясти".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...