User Tag List

Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 24 из 24

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

  1. #21

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

    По умолчанию

    ну вот проект на quartus 13 https://sites.google.com/site/bigral...edirects=0&d=1 тут два примера которые генерят по 2 триггера с асинхронным сбросом, но если помутить с этой фишкой что у sense list-a в verilog можно влепить больше одного "тактирующего сигнала" (сигнала у которого указан тип фронта posedge или negedge), например так:
    Код:
    module async_resetFFstyle2 (rst_n, clk, asyncrst_n, third_n);
      output rst_n;
      input clk, asyncrst_n, third_n;
      reg rst_n, rff1;
    
      always @(posedge clk or negedge asyncrst_n or posedge third_n)
      if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
      else {rst_n,rff1} <= {rff1,1'b1};
    endmodule
    то quartus пишет "Critical Warning (10237): Verilog HDL warning at async_resetFFstyle2.v(8): can't infer register for assignment in edge-triggered always construct because the clock isn't obvious. Generated combinational logic instead"
    хоть оно и critical, но таки же не error, и генерит одну из тех самых "пачек" мусора (но то такое, спишем на особенности конкретной реализации компилятора)
    Последний раз редактировалось bigral; 07.10.2019 в 16:18.

  2. #22

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

    По умолчанию

    if (!asyncrst_n) есть, а else тут как понимать? Нет однозначности, Квартус об этом и написал. Небось нагенерил эквивалент непрерывного присваивания. Я тоже не понимаю, зачем генерировать невесть что вместо того, чтобы выдать ошибку. Селяви такова, что надо смотреть на Critical warnings и учиться так не делать.

    В любом случае записывать в один и тот же регистр по двум клокам никак нельзя. Можно сделать клок из логики (derived clock), но это надо себя всерьез возненавидеть. Оно будет почти работать и отлаживать такое будет практически невозможно.
    Больше игр нет

  3. #23

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

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    Можно сделать клок из логики (derived clock), но это надо себя всерьез возненавидеть. Оно будет почти работать и отлаживать такое будет практически невозможно.
    Это как например?

  4. #24

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

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    Это как например?
    Классика это что-нибудь типа:
    Код:
    reg [3:0] div;
    always @(posedge clk) div <= div + 1'b1;
    wire clk16 = reg[3];
    always @(posedge clk16)
      something <= something + 1;
    Все с этого начинают. Я тоже так делал и очень ворчал, почему это у меня простейший Понг не может скомпилироваться два раза подряд во что-нибудь одинаковое. Дело в том, что клоки clk и clk16 теперь фактически два разных клочных домена.

    Ну и формально не запрещено взять любой сигнал и назвать его клоком:
    Код:
    wire weirdclk = clk1 | clk2;
    always @(posedge weirdclk) somereg <= somereg + 1;
    Но все поголовно учат так не делать. Если хочется, чтобы дизайн от сборки к сборке был повторим, не слишком непредсказуемо себя вел при каких-то изменениях, итд итд, надо делать все синхронно — один клок и разные clock enable:
    Код:
    reg [3:0] div;
    always @(posedge clk) div <= div + 1'b1;
    wire ce16 = &reg[3:0]; // ==1 только один clk
    always @(posedge clk)
      if (ce16) something <= something + 1;
    Код:
    wire welrdce = ce1 | ce2; // ce по длительности не должны превышать период главного клока
    always @(posedge clk) if (weirdce) somereg <= somereg + 1;
    Клок же остается един для всех процессов.

    Это с позиций FPGA. Наверное в мире CPLD, где часто приходится иметь дело с заковыристыми античными меандрами, дела обстоят иначе.
    Больше игр нет

Страница 3 из 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

Ваши права

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