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

Взрыв мозга, или написание простого блока на verilog Xilinx ISE - требуется помощь

Добрый день уважаемые форумчане,
Начал осваивать разработку ПЛИС,
и вроде простые примеры начали получаться,
Тестовая задача была принимать изображение с камеры,
для наложения на него информации и все это выводить на монитор,
Для этого были изучены рефересные дизайн DVI-OUT, а также позаимствованы блоки для инициализации и настройки камеры.
И даже получились синтезировать рабочие проекты, которые собирались, но картинка с камеры была не в том разрешений. Захотел все переделать так что бы все блоки были мне понятны, то есть написаны с нуля.
Начал с замены модуля генерации развертки vga_gen.
И он таки получился и заработал, но затем я решил создать проект с нуля.
И скопировал туда этот блок, в итоге при синтезе блок собирается не, верно,
Сигнал вертикальной сигнализации почему-то тупо зануляется.

Прошу помощи в чем тут проблема?

В логах вот такие сообщения:
WARNING:Xst:1293 - FF/Latch <v_count_0> has a constant value of 0 in block <vga_gen>. This FF/Latch will be trimmed during the optimization process.

Код модуля:
module vga_gen(
// Clock input
input    wire pixel_clk,
// output's
output wire h_sync,
output wire v_sync,
output wire video_enable,
// pixel data
output reg [23:0] pixel_addres,
output reg pixel_get
    );

    // VGA timings https://timetoexplore.net/blog/video-timings-vga-720p-1080p
    localparam HS_STA = 40;              // horizontal sync start
    localparam HS_END = 168;         // horizontal sync end
    localparam HA_STA = 296;    // horizontal active pixel start
     
    localparam VS_STA = 1;        // vertical sync start
    localparam VS_END = 5;    // vertical sync end
    localparam VA_STA = 28;              // vertical active pixel start
    localparam VA_END = 628;             // vertical active pixel end
     
    localparam LINE   = 1096;             // complete line (pixels)
    localparam SCREEN = 628;             // complete screen (lines)

    reg [9:0] h_count;  // line position
    reg [9:0] v_count;  // screen position

    assign h_sync = ((h_count >= HS_STA) & (h_count < HS_END));
    assign v_sync = ((v_count >= VS_STA) & (v_count < VS_END));
    // active: high during active pixel drawing
    assign video_enable = ((h_count >= HA_STA) & 
                        (v_count >= VA_STA) & 
                        (v_count <= VA_END));

    initial
        begin
            h_count <= 0;
            v_count <= 0;
        end

    always @ (posedge pixel_clk)
    begin

            if (h_count == LINE)  // end of line
            begin
                h_count <= 0;
                v_count <= v_count + 1;
            end
            else 
                h_count <= h_count + 1;

            if (v_count == SCREEN)  // end of screen
                v_count <= 0;

    end
endmodule
 

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


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

Хотите сделать правильно и удобно  - делайте цифровой автомат. Потом на отладке сэкономите кучу времени. Когда буду дома могу скинуть пример

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


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

    initial
        begin
            h_count <= 0;
            v_count <= 0;
        end
ИМО относится к несинтезируемым конструкциям: хотите сделать начальную установку - заводите внешний сброс в Ваш блок.

 

А самое главное

reg [9:0] h_count;  // line position
никогда не достигнет 

localparam LINE   = 1096;             // complete line (pixels)

в строке
         if (h_count == LINE)  // end of line

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


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

18 часов назад, AnatolySh сказал:

ИМО относится к несинтезируемым конструкциям

А вы не мнение имейте, а знание. Это помогает.

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


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

Средства синтеза игнорируют временные задержки, определённые конструкцией #<delay>, поэтому надо использовать стиль описания, исключающий использование задержек, в противном случае результаты моделирования до и после синтеза могут отличаться. Хотя использование этой конструкции допускается стандартом совместно с примитивами и конструкцией assign, но поскольку она несинтезопригодна, рекомендуется применять ее только на этапе отладки алгоритма функционирования устройства.

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


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

47 minutes ago, dsl2640free said:

Средства синтеза игнорируют временные задержки, определённые конструкцией #<delay>

А зачем в RTL дизайне вообще их использовать?

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


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

On 3/15/2019 at 6:48 PM, AnatolySh said:

    initial
        begin
            h_count <= 0;
            v_count <= 0;
        end
ИМО относится к несинтезируемым конструкциям: хотите сделать начальную установку - заводите внешний сброс в Ваш блок.

но тем не менее заводить ресет там где без него можно обойтись - так себе практика и даже сродни вредному совету по мнению FAE Xilinx,

я про возможность инита в современныз САПР такой конструкцией:

 

    reg [9:0] h_count = 10'h0;  // line position
    reg [9:0] v_count = 10'h0;  // screen position

 

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


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

Добрый день уважаемые коллеги,
И я снова зашел в тупик, на картинке вы найдете блок схему устройства.
Функциональные назначения блоков:
Clock – генератор всех синхросигналов
pixel_clk – 40Мгц
mem_clk – 80Мгц

vga_gen – генератор развертки видео 800x600
dvi_out – генератор HDMI сигнала
sdram – sdram контролер с имитацией двухпортовости в реальности у сигнала чтения приоритет над сигналом записи
writer – модуль запись тестового паттерна ‘ffff’ во фреймбуфер работает 1 раз до заполнения всего фреймбуфера
reader – модуль вычитки содержимого фреймбуфера и записи его в буфер FIFO буфер hdmi, стартует по сигналу конца экрана от модуля vga_gen.

fifo -  буфер на внутричиповой памяти BRAM хранит 1024 элемента

регистры led и выводы для отладки на осцилограф и светодиоды.

Как итог на экран всегда выводиться пустота то есть с контроллера sdram модуль чтения всегда вычитывает нули пробовал (задержки в модуле чтения менять думал может быть данные не готовы на микросхеме sdram от 2 до 9 тактов картинка не меняется) если в модуле reader на выходную шину повесить константу то заливка экрана меняется на нужную, так что грешу на контроллер памяти, но его делал на базе работающего проекта и там он отрабатывает корректно. Смоделировать работу этого модуля не могу так как нет модели на микросхему памяти это AS4C16M16S-6TCN
В общем нужна помощь?!
Проект в атаче.
 

Блок_схема_кадровый буфер.png

VGA_OUT.zip

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


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

4 часа назад, sany_v сказал:

В продолжение

Devboard на которой ведется разработка.

 

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

Когда заработает VGA. Начинайте отлаживать TMDS кодер. Отлаживать просто: берете кодер и декодер. На вход кодера идут данные - с выхода декодера выходят данные. Очевидно, что на выходе должно быть то же самое, что и на входе. 

Потом отлаживайте SDRAM. Модель памяти берите у микрона (www.micron.com) Когда заработает на микроновской модели - тогда меняете задержки под Вашу память. Контроллеры памяти для SDRAM на 99% одинаковые. Разница только в задержках.

Сейчас я ткнул пальцем в SDRAM контроллер и сразу увидел работу по двум фронтам clk одновременно. Уже ляп, как минимум. (100 строчка и 110 строчка) 

Могу поделиться TMDS декодером. 100% проверенный, гарантированно работающий. Правда на VHDL.

На самом деле вывод на DVI/HDMI монитор - штука не самая сложная. Можете даже попробовать без SDRAM буфера обойтись для тестов ибо данные, которые выходят с VGA - сразу должны попадать на TMDS кодер, откуда потом сразу на частоте x10 (или частоте x5 если применить DDR регистры - это небольшой намек, как ещё можно делать:acute:) через серилайзер уходят на DVI. Фактически буферизировать ничего не надо.

 

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


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

Почему в одну строку не написали объявление подмодулей в топ модуле? Читать схему невозможно. Погуглите Verilog coding style и почитайте как рекомендуют объявлять модули.

mt48lc4m16a2.v

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

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


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

14 часов назад, Flip-fl0p сказал:

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

Когда заработает VGA. Начинайте отлаживать TMDS кодер. Отлаживать просто: берете кодер и декодер. На вход кодера идут данные - с выхода декодера выходят данные. Очевидно, что на выходе должно быть то же самое, что и на входе. 

Потом отлаживайте SDRAM. Модель памяти берите у микрона (www.micron.com) Когда заработает на микроновской модели - тогда меняете задержки под Вашу память. Контроллеры памяти для SDRAM на 99% одинаковые. Разница только в задержках.

Сейчас я ткнул пальцем в SDRAM контроллер и сразу увидел работу по двум фронтам clk одновременно. Уже ляп, как минимум. (100 строчка и 110 строчка) 

Могу поделиться TMDS декодером. 100% проверенный, гарантированно работающий. Правда на VHDL.

На самом деле вывод на DVI/HDMI монитор - штука не самая сложная. Можете даже попробовать без SDRAM буфера обойтись для тестов ибо данные, которые выходят с VGA - сразу должны попадать на TMDS кодер, откуда потом сразу на частоте x10 (или частоте x5 если применить DDR регистры - это небольшой намек, как ещё можно делать:acute:) через серилайзер уходят на DVI. Фактически буферизировать ничего не надо.

  

Спасибо за предложением, но c TMDS проблем нет(то есть с блоками clock, vga_gen, dvi_out) я могу выводить заполнение любым цветом присваивая статическая значения в модуле reader или же на входе dvi_out, более того я уже наигрался с рисование цветных полос, квадратов модифируя vga_gen, а так же пробовал различные разрешения, с HDMI нет ни каких проблем от слова совсем он простой и я бы даже сказа примитивный. Проблема с контроллером памяти о чем я и писал?

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


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

Ну значит отлаживайтесь с помощью микроновской модели. 

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


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

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

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

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

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

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

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

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

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

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