[an error occurred while processing this directive]
|
Пример1: две одинаковые защелки с выходами out1 и out2.
module latch ( in, s, out1, out2 );
input in, s ;
output reg out1 ;
output wire out2 ;
always @(in or s) if (s) out1 <= in ;
assign out2 = (s) ? in : out2 ;
endmodule
Пример2: два одинаковых мультиплексора с выходами out1 и out2.
module mux ( in1, in2, s, out1, out2 );
input in1, in2, s ;
output reg out1 ;
output wire out2 ;
always @(s or in1 or in2) if (s) out1 <= in1 ; else out1 <= in2 ;
assign out2 = (s) ? in1 : in2 ;
endmodule
Триггеры (flip-flop) получаются только в конструкциях типа
always @(posedge ... ) или always @(negedge ... ).
Теперь по поводу = и <=. Это блокирующее и неблокирущее присваивание.
Если "<=", то всё нормально, получатся обычные flip-flopы.
Если "=", то результат ЗАВИСИТ ОТ ПОРЯДКА СЛЕДОВАНИЯ ПРИСВАИВАНИЙ!!!
Пример3: 3-х битный сдвиговый регистр с посл. входом in
и парал. выходом out.
module block_nonblock1 ( clk, in, out );
input in, clk ;
output reg [2:0] out ;
always @(posedge clk) begin out[2]=out[1]; out[1]=out[0]; out[0]=in; end
endmodule
А теперь ПРИМЕР4!!!: почти то же самое, но синтезируется ОДИН триггер
с входом in и выходами out (out[0], out[1], out[2] замкнуты между собой).
module block_nonblock2 ( clk, in, out );
input in, clk ;
output reg [2:0] out ;
always @(posedge clk) begin out[0]=in; out[1]=out[0]; out[2]=out[1]; end
endmodule
Если использовать "<=", то порядок следования присваиваний пофигу,
в обоих случаях будет 3-х битный сдвиговый регистр.
Поэтому в блоках always надо применять "<=" (nonblocking),
если не хочешь получить неожиданный результат.
ЗЫ: Всё проверено на ISE 6.1 SP3.
E-mail: info@telesys.ru