-
vadim1
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 7
-
Спасибо получено: 1
-
-
|
Надеюсь, я правильно понял, защёлка - тот же триггер но с сигналом enable.
Осваиваю verilog. Но наверное, вопрос больше по железу.
Бывает, одну и ту же логику можно записать так, что будет синтезирован или триггер или защёлка.
Пример: //`define REG 1
module reg_or_latch(clk, x, a, b);
input clk, x, a;
output reg b;
`ifdef REG
always @ (posedge clk)
if (x) // это будет синтезировано как сигнал enable защёлки
b <= a;
`else
wire ab;
assign ab = a && x || b && !x;
always @ (posedge clk)
b <= ab;
`endif
endmodule
Надо ли стремиться к решениям типа 2, чтобы был сгенерирован именно триггер? С точки зрения электрической нагрузки или, скажем, ресурса? С точки зрения вероятности ошибок в логике?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
nckm
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 112
-
Спасибо получено: 34
-
-
-
-
-
|
Вообще-то всегда, когда присвоение идет в always блоке с posedge clk (или negedge clk) будет синтезирован тригер. В этом легко убедиться, если посмотреть после компиляции проекта в квартусе меню Tools => Netlist Viewers => RtlViewer
В вашем примере в виде if(x) не превращает эту конструкцию в защелку. Там так же будет тригер.
Защелка - в моем понимании это нечто другое..
Вот к примеру
reg [1:0]a;
reg [7:0]b;
always @*
if( a==0)
b = 5;
else
if( a==1)
b=6;
else
if(a==2)
b=7;
Здесь, во-первых, нет posedge clk, значит эта логика не синхронная, а просто логическая функция. Однако, переменная "a" двухбитная, а if рассматривают не все варианты, не известно, что присваивать в переменную "b" если a==3. Значит синтезатор будет ставить "защелку", то есть latch, который будет удерживать в переменной "b" предыдущее присвоенное значение, если вдруг "a" станет равно 3
Так вот вот этот latch который появится в результате - на мой взгляд не хорошо. Нужно избегать таких логических функций, которые могут обернуться защелками.
Quartus на защелки выдает предупреждение Warning. Да и симуляция защелок не очень хорошо идет.
А если always@( posedge clk) - тут защелки не будет.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
vadim1
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 7
-
Спасибо получено: 1
-
-
|
nckm, спасибо!
На вашем примере в первые увидел подписи "latch" в RTL-viewer.
А ведь уже занимаюсь месяца 3. Вот что значит не системное изучение предмета!..
Но по сути вопрос не в этом. Ладно, не защёлка, а регистр с сигналом enable. Надо ли избегать этого сигнала, за счёт дополнительной комбинаторной логики на входе регистра?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
nckm
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 112
-
Спасибо получено: 34
-
-
-
-
-
|
Я думаю специально избегать сигнала Enable не нужно, да скорее всего вы и не сможете его избежать, ведь использовать его или нет скорее зависит не от вас, а от синтезатора и библиотечных элементов из которых синтезатор строит конечную схему.
Например, вот структурная схема логического элемента FPGA Cyclone IV
У этого логического элемента есть на триггере специальный сигнал Enable, Таким образом, если он будет задействован, то это даже сэкономит ресурсы ПЛИС, не будут вместо Enable использоваться LUT.
В статье
marsohod.org/verilog/153-verilogpictflop
есть пример триггера который с сигналом Enable и показано, как он может выглядеть по разному в RTLviewer.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.117 секунд