Неблокиращо или блокиращо присвояване за буфер?

Опитвам се да внедря малък редов буфер във Verilog. Поставям данни от единия край и ги чета от другата страна.

wire [29:0] temp_pixel;
reg  [29:0] temp_buffer[2:0];

Мога да използвам оператори за блокиране на присвояване като тези и трябва да работи според очакванията.

always @(posedge TD_CLK27)
begin
temp_buffer[0] = temp_buffer[1];
temp_buffer[1] = temp_buffer[2];
temp_buffer[2] = temp_pixel;
end

Но мога ли да използвам неблокиращи изрази (показани по-долу) и пак да получа очаквания резултат? Или temp_buffer[1] ще бъде презаписан от temp_buffer[2], преди да бъде прочетен в temp_buffer[0]?

always @(posedge TD_CLK27)
begin
temp_buffer[0] <= temp_buffer[1];
temp_buffer[1] <= temp_buffer[2];
temp_buffer[2] <= temp_pixel;
end

Ще работят ли и двата блока по един и същи начин, или трябва задължително да блокира операторите за присвояване и защо?


person Jay K    schedule 12.04.2014    source източник
comment
Нито един от тези примери не създава буфери. Първият създава 1 джапанка, вторият създава 3 джапанки.   -  person N8TRO    schedule 13.04.2014
comment
@N8TRO Бихте ли изяснили как се създава един флип флоп?   -  person Jay K    schedule 13.04.2014


Отговори (2)


И двата блока са различни.

Когато използвате блокиращи присвоявания, следващият оператор не започва да се изпълнява, докато присвояването не приключи.

 x = #5 y + z;

Това изявление се изпълнява, както следва:

  1. Оценява RHS израза и запазва резултата
  2. Изчакайте определеното забавяне
  3. Изпълнете задание

Така че във вашия случай няма забавяне, докато присвоявате вашите буфери, които сте създали, и Verilog го интерпретира като един тригер.

x <= y + z;

Нормалното неблокиращо присвояване се изпълнява, както следва:

  1. Оценете RHS израза и запазете резултата във временен буфер
  2. Завършете изпълнението на всички други събития в процедурния блок, с изключение на други неблокиращи присвоявания
  3. Изпълнете задачата накрая.

Така че във вашия втори пример temp_buffer[2] получава предишната стойност на temp_buffer[1]. Така че има забавяне на цикъла, преди което можете да получите достъп до стойността. така че има поредица от джапанки (в зависимост от вашия код), преди да получите действителния резултат.

Отново, връзката в предишния отговор е отличен документ за четене. Ето още няколко Sunburst Design Връзка2

person chitranna    schedule 13.04.2014

Този минимален пример за блокиране, забележете =:

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] = data_in;
   temp[1] = temp[2];
   temp[0] = temp[1];
end

assign data_out = temp[0];

endmodule

създава 1 Flip-Flop:

1 Flip-Flop

Докато не блокира, забележете <=:

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] <= data_in;
   temp[1] <= temp[2];
   temp[0] <= temp[1];
end

assign data_out = temp[0];

endmodule

създава 3 джапанки:

3 джапанки

Буферите се създават по следния начин:

module test(
input  data_in, clk,
output data_out
);

wire [2:0] temp;

   buf(temp[2], data_in);
   buf(temp[1], temp[2]);
   buf(temp[0], temp[1]);

assign data_out = temp[0];

endmodule

въведете описание на изображението тук

Повече информация тук.

person N8TRO    schedule 13.04.2014