Jump to content

    

Взрыв мозга, или написание простого блока на 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
 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

    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

Share this post


Link to post
Share on other sites

Спасибо,

Да ошибка детская про разрядность регистра ;-)

Share this post


Link to post
Share on other sites
18 часов назад, AnatolySh сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
47 minutes ago, dsl2640free said:

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

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

Добрый день уважаемые коллеги,
И я снова зашел в тупик, на картинке вы найдете блок схему устройства.
Функциональные назначения блоков:
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

Share this post


Link to post
Share on other sites

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

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

IMG_6597_3.jpg

Share this post


Link to post
Share on other sites
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. Фактически буферизировать ничего не надо.

 

Share this post


Link to post
Share on other sites

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

mt48lc4m16a2.v

Edited by likeasm

Share this post


Link to post
Share on other sites
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 нет ни каких проблем от слова совсем он простой и я бы даже сказа примитивный. Проблема с контроллером памяти о чем я и писал?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now