iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
自我挑戰組

硬體學習日記系列 第 10

Day-10 verilog介紹-6 always

  • 分享至 

  • xImage
  •  

今天要來介紹的是Verilog中的always block~

always block

always block通常用在描述時序邏輯或組合邏輯,這個是他的基本結構:

always @( sensitivity_list )
begin
	//一些指令描述
end

在always後的括號內,有一個叫做sensitivity_list的東西,這個列表決定了always會在哪種信號產生變化的時候被觸發且開始執行這塊block。

那在sensitivity_list中,可以包含的信號有:

  1. Event control:包含了posedge、negedge,常用在時序邏輯的地方,因為時序邏輯通常會用在觸發器及暫存器中,設類型的設計會需要clock edge。舉個例子:
always @(posedge clk) //clk在riding edge時觸發
begin
	if( A == 0 && B == 1 )
		C = 0;
	else if( A == 1 && B == 0 )
		C = 1;
end
  1. 信號名:當指定信號發生變化時觸發,常用在組合邏輯,這類型的邏輯電路,在產生任何的輸入變化時都需要更新輸出,所以sensitivity_list通常會包含所有的輸入信號~如果有很多輸入訊號的話看起來就會很長一串了哈哈。舉例來說:
always @( a or b or c ) //a,b,c三個輸入訊號其中一個發生變化時觸發
begin
	if( A == 0 && B == 1 )
		C = 0;
	else if( A == 1 && B == 0 )
		C = 1;
end

所以只要想好always要在什麼樣的變化下執行、是屬於第一類還是第二類就好了~再把欲執行的指令寫入begin。

block types

always的block有兩種types:

  1. Blocking Assignment( = ):通常會用在組合邏輯電路,這樣的賦值方式會在每行程式碼執行時立刻生效。
  2. Non-blocking Assignment(<= ):通常用在時序邏輯電路,這樣賦值的話會在此always block執行結束後統一生效。

舉個例子:

module newwork(A,B,clk,Q);
	input A,B,clk;
	output Q;
	reg Q;

	always @(posedge clk)
	begin
		if( A == 1 && B == 1 )
			Q <= 0; //Non-blocking Assignment
	end

endmodule

在這個例子中,如果clock為rising edge,Q值則會在always block結束後改變。

最後就來個練習啦~

module newwork(A,B,clk,Q,W);
	input A,B,clk;
	output Q,W;
	reg Q,W;
	wire a,b,c;
	
	always @(posedge clk) //clk為rising edge時觸發
	begin
		Q <= A & B; //Non-blocking Assignment,結束此block後才生效
	end
	
	always @(a | b | c) //a,b,c三者至少有一個訊號的輸入有變化時觸發
	begin
		W = a & ( c | b ); //程式跑到這行就直接執行,不用等整個block結束
	end
	
endmodule

今天就到這邊~


上一篇
Day-9 verilog介紹-5 expression & assign
下一篇
Day-11 verilog介紹-7 邏輯電路
系列文
硬體學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言