Важная информация

User Tag List

Страница 161 из 191 ПерваяПервая ... 157158159160161162163164165 ... ПоследняяПоследняя
Показано с 1,601 по 1,610 из 1901

Тема: ПЛИС и всё что с ними связано

  1. #1601
    Veteran Аватар для dosikus
    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    HardWareMan, спасибо за науку...\






    - - - Добавлено - - -

    Цитата Сообщение от omercury Посмотреть сообщение
    В простейшем случае ничего особо и не надо.
    В Compilation Report в окне Table of content найди в дереве TimeQuest Timing Analiser и выбери в нём медленные модели.
    Что-то он там по-любому наанализировал...
    Вложение 70073
    12.14 MHz 12.14 MHz U_PLL|altpll_component|auto_generated|pll1|clk[0]
    325.52 MHz 325.52 MHz U_PLL|altpll_component|auto_generated|pll1|clk[1]

    - - - Добавлено - - -

    Цитата Сообщение от Bolt Посмотреть сообщение
    Вот. Сам не могу понять этот эффект автонастройки, но влияет наличие не_чёрного во время гашения и синхроимпульсов. Может на RGB какие-то иголки с комбинационных схем пролазят, вот монитор и пытается их в кадр впихнуть?
    Нашел из-за чего эта хрень была.
    У меня адаптер HDMI-VGA с питанием , питание было воткнуто в хаб и туда же флешка дикожрущая . Из-за нее питание и садило...
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  2. #1602
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,428
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    606
    Поблагодарили
    450 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    Странно, по идее должен был остаться один мультиплексор. Ты точно вынес все присвоения pix_count за пределы основного условия?

    Вот такой код:
    Код:
    module TOP(
    	input	clk,
    	input	reset,
    	output	reg [15:0]pix_count,
    	output	reg [7:0]line_count
    );
    
    reg [1:0]sync;
    
    always @(posedge clk)
    begin
    	//
    	sync[1:0] <= {sync[0],reset};
    	//
    	if ((sync[1] & ~sync[0]) | (pix_count[15:0] == 16'h041F)) pix_count[15:0] <= 16'h0000; else pix_count[15:0] <= pix_count[15:0] + 16'h0001;
    	//
    	if (sync[1] & ~sync[0])
    	begin
    		line_count[7:0] <= 8'h00;
    	end else begin
    		if (pix_count[15:0] == 16'h0100) line_count[7:0] <= line_count[7:0] + 8'h01;
    	end
    end
    
    endmodule
    Должен выглядеть вот так:

    Видишь, как объединились оба условия обнуления pix_count в один мультиплексор? И, что особенно, выстроились мультиплексоры у line_count в порядке приоритета (чем ближе к триггеру - тем больше приоритет)? При этом, если грамотно описать, то можно сделать сбалансированное дерево, я уже об этом говорил.
    Последний раз редактировалось HardWareMan; 25.09.2019 в 20:55.

  3. #1603
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У pix_count три варианта: сброс в ноль, инкремент, хранение. Поэтому два мультиплексора.

  4. #1604
    Activist Аватар для omercury
    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    может сделаем знакогенератор ?
    У тебя растр 800х600.
    Шрифт, надеюсь, моноширинный?

    Определяй размеры знакоместа.

    - - - Добавлено - - -

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Желательно всегда стремиться к уменьшению вложенности управляющих цепей (это те, которые условия), а так же стараться объединять цепи, ведущие к одному результату.
    Тут, кстати, положительную роль играет одна особенность верилога - при попытке управлять регистром из разных always блоков, Квартус ругается ошибкой, в отличие от VHDL, который пропускает даже (о ужас) тактирование триггера из разных процессов.

    - - - Добавлено - - -

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Видишь, как объединились оба условия обнуления pix_count в один мультиплексор?
    А нафига его вообще обнулять при сбросе?
    В этом есть необходимость?
    (прошу прощения за мой французский...)

  5. #1605
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,428
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    606
    Поблагодарили
    450 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    А нафига его вообще обнулять при сбросе?
    В этом есть необходимость?
    (прошу прощения за мой французский...)
    АХЕЗ. Я бы не обнулял, да. А вот PPU я делал от Денди, там при обнулении блокируется синхрогенератор. Это понятно для ASIC - надо как-то привести в некоторое надёжное состояние при включении питания. При построении этого на основе FPGA это самое состояние можно прописать прямо в коде: reg [15:0]pix_count = 16'h1234;

    - - - Добавлено - - -

    Цитата Сообщение от Bolt Посмотреть сообщение
    У pix_count три варианта: сброс в ноль, инкремент, хранение. Поэтому два мультиплексора.
    При этом хранение у него идет, почему-то, на сепаратор фронта сброса, что не правильно. Поэтому я и говорю - искайте ошибку. У меня в примере этому соответствует line_count.

  6. #1606
    Veteran Аватар для dosikus
    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    omercury, скорей 8x16. 8x8 слишком мелкий, 16x16 много сожрет




    Цитата Сообщение от omercury Посмотреть сообщение

    А нафига его вообще обнулять при сбросе?
    В этом есть необходимость?
    (прошу прощения за мой французский...)
    Ну дык потому-что код сп**ен ))))
    Последний раз редактировалось dosikus; 26.09.2019 в 11:54.
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  7. #1606
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #1607
    Veteran Аватар для dosikus
    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сейчас полный код синхры выглядит так:

    module vga_sync(

    input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
    input reset, // Input async. active low reset signal

    output reg vga_hsync, // Output horizontal sync signal
    output reg vga_vsync, // Output vertical sync signal

    output reg disp_enable, // Set when a writable portion of display is enabled:
    output reg[9:0] pix_x, // x-coordinate of an active pixel
    output reg[9:0] pix_y, // y-coordinate of an active pixel
    //output reg[19:0] v_addr, // VRAM address count
    output wire[7:0] data_out
    );
    //================================================== ====================

    localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
    localparam SYNC_OFF = 1'b1;

    localparam HSYNC_START = 840;
    localparam HSYNC_END = 968;
    localparam LINE_END = 1056;
    localparam VSYNC_START = 601;
    localparam VSYNC_END = 605;
    localparam FRAME_END = 628;
    localparam H_ACTIV = 800;
    localparam V_ACTIV = 600;

    reg [7:0] vram [0:4095]; initial $readmemh("vram.txt", vram);

    reg[9:0] line_count; // Line counter, current line
    reg[15:0] pix_count; // Pixel counter, current pixel
    reg[19:0] v_addr; // Pixel counter, current pixel




    reg [1:0]SynRes;
    always @( posedge clk_in )
    begin
    // Синхронизация сброса
    SynRes[1:0] <= {SynRes[0],reset};
    // Счетчик пикселей
    if ( (SynRes[1] & ~SynRes[0]) | (pix_count == 1056) ) pix_count <= 0; else pix_count <= pix_count + 1;
    // Остальная логика
    if (SynRes[1] & ~SynRes[0]) begin // Либо так: if (SynRes[1:0] == 2'b10) begin
    line_count <= 0; // On a reset, restart counters from 0
    v_addr <=0;
    end else begin




    // This is a state machine based on a pixel count. Since VGA modes timings are
    // based on a multiple of pixel counts, we add them up and generate syncs at
    // proper times

    case (pix_count)
    0: vga_hsync <= SYNC_OFF;
    HSYNC_START: vga_hsync <= SYNC_ON;
    HSYNC_END: vga_hsync <= SYNC_OFF;
    LINE_END: begin
    line_count <= line_count + 1'b1;
    pix_count <= 0;
    end
    endcase

    case (line_count)
    0: vga_vsync <= SYNC_OFF;
    VSYNC_START: vga_vsync <= SYNC_ON;
    VSYNC_END: vga_vsync <= SYNC_OFF;
    FRAME_END: line_count <= 0;

    endcase


    // The following code defines a drawable display region and outputs
    // disp_enable to 1 when within that region. Also, set the pixel coordinates
    // (normalized to the top-left edge of a drawable region)
    disp_enable <= 0;
    pix_x <= 0;
    pix_y <= 0;
    if (line_count>=0 && line_count<V_ACTIV)
    begin
    if (pix_count>=0 && pix_count<H_ACTIV)
    begin
    disp_enable <= 1;
    pix_x <= pix_count;
    pix_y <= line_count;
    v_addr <= ((pix_y*800)+pix_x);

    end
    end
    end
    end


    assign data_out = vram[v_addr];

    endmodule

    - - - Добавлено - - -

    RTL выгладит так.
    В предыдущей я наврал - не удалил одну строку...





    - - - Добавлено - - -

    Здесь полная схема RTL

    Скрытый текст


    [свернуть]
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  9. #1608
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,428
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    606
    Поблагодарили
    450 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    dosikus, квиксёрч по этой страничке показывает:


    - - - Добавлено - - -

    PS Хоть line_count работает достаточно медленно и та цепочка мультиплексоров в принципе не решает, но всё же её тоже можно прилично сократить по мной предложенной схеме. Только на этот раз внимательно посмотри какие события должны влиять на нее и всё такое.

  10. #1609
    Veteran Аватар для dosikus
    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ВотЪ, как ты и говорил.



    - - - Добавлено - - -

    Так ?

    if ( (SynRes[1] & ~SynRes[0]) | (line_count == 600) ) line_count <= 0; else if (pix_count==800 ) line_count<= line_count + 1;

    А | (OR) здесь логическое или битовое, или без разницы?

    - - - Добавлено - - -

    Цитата Сообщение от dosikus Посмотреть сообщение
    Так ?

    if ( (SynRes[1] & ~SynRes[0]) | (line_count == 600) ) line_count <= 0; else if (pix_count==800 ) line_count<= line_count + 1;

    Не прокатило...
    Последний раз редактировалось dosikus; 26.09.2019 в 13:01.
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  11. #1610
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,428
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    606
    Поблагодарили
    450 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    dosikus, что там не прокатило? Правильный RTL показывается. Ааа, ты про line_count? Не, не так. В коде влияние на line_count идут вот такие сигналы:
    1. (SynRes[1] & ~SynRes[0]) сбрасывает в 0
    2. pix_count == LINE_END добавляет 1
    3. line_count == FRAME_END сбрасывает в ноль
    Отсюда вывод: надо делать вот так
    Код:
    // Счетчик пикселей
    if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
    // Счетчик строк
    if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
       else if ( pix_count == LINE_END ) line_count <= line_count + 1;
    Остальные присвоения line_count нужно удалить. Поправь и покажи результирующий RTL.

  12. Этот пользователь поблагодарил HardWareMan за это полезное сообщение:

    dosikus (26.09.2019)

Страница 161 из 191 ПерваяПервая ... 157158159160161162163164165 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. ДВК (и всё, что с ними связано)
    от Grand в разделе ДВК, УКНЦ
    Ответов: 4539
    Последнее: 25.05.2024, 14:25
  2. Ответов: 1187
    Последнее: 22.12.2023, 20:53
  3. PAL/GAL и все что с ними связано.
    от Mick в разделе Клоны на ПЛИС, МК и БМК
    Ответов: 487
    Последнее: 01.12.2023, 00:30
  4. SMUC на дискретах и ПЛИС
    от spensor в разделе Scorpion
    Ответов: 844
    Последнее: 15.05.2023, 12:31
  5. Вопрос по ПЛИС
    от Zloy в разделе Несортированное железо
    Ответов: 23
    Последнее: 17.10.2015, 17:12

Ваши права

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