User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 24

Тема: VHDL process, обьясните как работает

  1. #11

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    И да, always @ вовсе не гарантирует триггеров в цикле, например такая запись:
    Код:
    reg q;
    always @(posedge clock) begin
    q = a & b;
    end
    создаст честную комбинаторику.
    Это в каком смысле "честную комбинаторику"? Нетрудно проверить:

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


    (это можно скопипастить в https://www.tutorialspoint.com/compi...log_online.php)
    Код:
    /* 
     * Do not change Module name 
    */
    module main;
      reg clk=0;
      reg fastclk=0;
    
      always #5 clk <= ~clk;
      always #1 fastclk <= ~fastclk;
    
      initial 
        begin
          $display("Hello, World");
          #20 $finish;
        end
    
    
      wire q_clocked;
      wire q_unclocked;
      
      reg [1:0] count = 0;
      always #2 count <= count + 1;
      wire a = count[0], b = count[1];
    
      always @(posedge fastclk) 
        $display("clk=", clk, " a=", a, " b=",b, 
            " q_clocked=", q_clocked, " q_unclocked=", q_unclocked);
    
      clocked boo1(clk, a, b, q_clocked);
      unclocked boo2(a, b, q_unclocked);
        
    endmodule
    
    module clocked(input clock, input a, input b, output reg q);
       always @(posedge clock) begin
            q <= a & b;
       end
    endmodule
    
    module unclocked(input a, input b, output reg q);
        always @* begin
            q <= a & b;
        end
    endmodule
    [свернуть]
    Больше игр нет

  2. #12

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

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    Это в каком смысле "честную комбинаторику"? Нетрудно проверить:

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


    (это можно скопипастить в https://www.tutorialspoint.com/compi...log_online.php)
    Код:
    /* 
     * Do not change Module name 
    */
    module main;
      reg clk=0;
      reg fastclk=0;
    
      always #5 clk <= ~clk;
      always #1 fastclk <= ~fastclk;
    
      initial 
        begin
          $display("Hello, World");
          #20 $finish;
        end
    
    
      wire q_clocked;
      wire q_unclocked;
      
      reg [1:0] count = 0;
      always #2 count <= count + 1;
      wire a = count[0], b = count[1];
    
      always @(posedge fastclk) 
        $display("clk=", clk, " a=", a, " b=",b, 
            " q_clocked=", q_clocked, " q_unclocked=", q_unclocked);
    
      clocked boo1(clk, a, b, q_clocked);
      unclocked boo2(a, b, q_unclocked);
        
    endmodule
    
    module clocked(input clock, input a, input b, output reg q);
       always @(posedge clock) begin
            q <= a & b;
       end
    endmodule
    
    module unclocked(input a, input b, output reg q);
        always @* begin
            q <= a & b;
        end
    endmodule
    [свернуть]
    Пример действительно поганенький.


  3. #13

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну вот, триггер. А как иначе, если там posedge?

    По-моему правильное утверждение -- это что-то вроде: "декларация сигнала регистром не достаточна для синтеза физического регистра, для этого необходимо, чтобы запись в него тактировалась posedge/negedge". В синтезируемом подмножестве verilog запись в регистр в процессе always без posedge/negedge, -- это почти то же самое, что непрерывное присваивание wire. В безклоковом случае отличие от assign по-моему только в том, что в блоке always можно расписать сложные выражения, пользуясь блокирующими присваиваниями.

    На самом деле это уже как-то совсем оффтоп, хоть и проходящий мимо темы ТС по касательной. Прошу прощения.
    Больше игр нет

  4. #14

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

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    А как иначе, если там posedge?
    2 регистра, разумеется.

    Цитата Сообщение от svofski Посмотреть сообщение
    блокирующими присваиваниями
    Именно в этом и "секрет")))

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

    svofski(03.10.2019)

  5. #15

    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    На самом деле это уже как-то совсем оффтоп, хоть и проходящий мимо темы ТС по касательной. Прошу прощения.
    очень даже не оффтоп! а как же быть с ДВУМЯ клоками одновременно? как же так что verilog такое понимает а vhdl нет?
    Последний раз редактировалось bigral; 03.10.2019 в 13:33.

  6. #16

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    bigral, наверное не совсем так. Просто verilog, как и vhdl, создавался как язык для симуляции. К синтезу их притянули за уши потом. Фактически когда квартуз "компилирует" код, он находит соответствие увиденного какому-то набору шаблонов. Какие-то шаблоны допустимы, какие-то нет. Из-за этого страшная путаница и уже не первое поколение fpga-шников хочет выкинуть все и переписать с нуля.

    В синтезируемом подмножестве с помощью always можно сделать несколько видов процессов. Пусть меня поправят настоящие сварщики, если я ошибаюсь.

    1) Непрерывное присваивание.

    Код:
    reg r;
    always @* r <= expression;
    Это то же самое, что
    Код:
    wire w;
    assign w = expression;
    2) Защелка -- значение залипает пока не случится cond1 или cond2 (ататат! если это случайно -- надо синхронизировать с клоком).
    Код:
    reg r;
    always @* begin
       if (cond1) r <= 1;
       else if (cond2) r <= 0;
       // чтобы убрать защелочность достаточно добавить else
       // else r <= 0;
    end;
    3) триггер
    Код:
    reg r;
    always @(posedge clk) begin
      r <= expression;
    end
    4) триггер с асинхронным сбросом
    Код:
    reg r;
    always @(posedge clk or negedge reset_n)
      if (!reset_n)
        r <= 0;
      else
        r <= expression;
    По-моему это всё. Все более сложные конструкции либо упрощаются до совпадения с одним из этих паттернов, либо приводят к ошибке синтеза. Каждый из этих случаев достаточно частный. Например, триггер с асинхронным сбросом возможен благодаря тому, что базовые логические элементы имеют асинхронный сброс и принципиально важно, что оба присваивания находятся во взаимоисключающих половинках if - else. Это не потому, что verilog позволяет тактировать один регистр двумя разными клоками. Просто туманность синтаксиса может ввести в заблуждение.

    На VHDL регистры с асинхронным сбросом тоже возможны.

    Цитата Сообщение от bigral
    а можно сюда скинуть кусок текста оттуда, ато тяжело мне понять как "люди редко пишут" и почему...
    Мне сейчас не с руки откапывать. Идея в том, что человек как правило напишет:

    Код:
    always @(posedge clk)
      if (c) r <= 1;
      else r <= a & b;
    или
    Код:
    always @(posedge clk)
       r <= (a & b) | c;
    Но все эти хитрые конструкции упрощаются к виду:
    Код:
    wire wire123 = (a & b) | c;
    always @(posedge clk)
      r <= wire123;
    Только обычно сильно более сложные и запутанные. И именно такие они получаются в результате реверса.
    Больше игр нет

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

    Bolt(04.10.2019)

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

  8. #17

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

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    а как же быть с ДВУМЯ клоками одновременно?
    Вас же не смущают 2 клока в VHDL
    Код:
    process (clk, asyncrst_n)
    Отчего же смутили те же самые 2 клока в верилоге?
    Код:
    always @(posedge clk or negedge asyncrst_n)
    И, кстати, это вовсе не клоки, это, грубо говоря, входы, на манипуляции с которыми должен реагировать синтезируемый элемент.
    И даже называется списком чувствительности.

    Цитата Сообщение от bigral Посмотреть сообщение
    как же так что verilog такое понимает а vhdl нет?
    А Вы опишите установку триггера из одного "process" а сброс из другого на VHDL.
    А затем попробуйте проделать то же самое на Verilog.
    Вы сильно удивитесь, кто из них что умеет на самом деле. И какую ахинею порой допускает.

  9. #18

    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    Вас же не смущают 2 клока в VHDL
    Отчего же смутили те же самые 2 клока в верилоге?
    нету там в vhdl 2-х клоков

    reg r;
    always @(posedge clk or negedge reset_n)
    if (!reset_n)
    r <= 0;
    else
    r <= expression;
    а этот кусок два триггера генерит (смотрю в RTL viewer quartus-a), но не при любых условиях в sense list, иногда пишет warning про то что не может сгенерить триггеры и генерит какуюто пачку нелепой комбинаторики (что вообще дикость... вместо ошибки генерить что попало, такого пожалуй не видел ни в одном компиляторе)

    но фраза об изначальной "костыльности" verilog для синтеза конечно может обьяснить все что угодно, это как теория заговора - универсальное обоснование

  10. #19

    Регистрация
    31.03.2008
    Адрес
    Москва
    Сообщений
    735
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    37 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    а этот кусок два триггера генерит
    Там реакция идет на posedge и negedge, т.е. на перепады сигнала. Реакция на перепад сигнала синтезируется в триггер.
    ZXM-Phoenix rev.01 2048K, VG93 hw emulator

  11. #20

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    а этот кусок два триггера генерит (смотрю в RTL viewer quartus-a), но не при любых условиях в sense list, иногда пишет warning про то что не может сгенерить триггеры и генерит какуюто пачку нелепой комбинаторики (что вообще дикость... вместо ошибки генерить что попало, такого пожалуй не видел ни в одном компиляторе)
    На самом деле интересно посмотреть на конкретные примеры. Особенно на случай, когда генерится пачка. Может быть мы смогли бы вместе разобраться в чем там дело.
    Больше игр нет

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Как работает графика?
    от SaintTurnip в разделе Корвет
    Ответов: 2
    Последнее: 23.02.2018, 09:00
  2. Ответов: 8
    Последнее: 19.10.2017, 15:08
  3. Как работает /RESET?
    от Gutten в разделе Несортированное железо
    Ответов: 5
    Последнее: 28.03.2014, 11:58
  4. как работает огибающая?
    от jerri в разделе Музыка
    Ответов: 6
    Последнее: 28.02.2014, 00:59
  5. Как в VHDL смешать бипер с PWM (AY и Covox)?
    от ILoveSpeccy в разделе Звук
    Ответов: 14
    Последнее: 21.04.2009, 18:03

Ваши права

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