iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
自我挑戰組

硬體學習日記系列 第 13

Day-13 Verilog介紹-9 Case

  • 分享至 

  • xImage
  •  

今天要來介紹的是Case~其中一個verilog常使用到的功能。

Case

如果有寫過程式,相信對條件的語法都不陌生~Case就是verilog的條件句,程式中會根據當前條件來對應當前遇到的case,如果符合則執行該case的指令,不符合就跳過,看下一個case,如果沒case就結束。其中的條件通常會視某個信號或變數的值。
Case就像是高階語言中的「switch」,給出幾個條件,看當前狀態符合誰,就執行他的內容。
那case在某些地方就特別需要啦~像是狀態機、解碼器及數據多工器。

這是case的基本語法:

case(expression)
	value1: begin
		//statements
	end
	value2: begin
		//statements
	end
	
	//接續下去
	
	default: begin
		//statements
	end
	
endcase

是不是跟switch很像!只是從switch變成case、從case變為value。

稍稍來說明一下這個語法結構:

  1. case括號中的expression是要被測試的表達式或訊號,通常會是多位元信號,如多位元向量。
  2. value1、value2…等等則是expression可能的值,當expression遇到其中的某個對應的value,這個value裡的程式碼就會被執行。要盡量把所有可能的狀況都寫入case喔~
  3. 我們使用了begin…end來把要執行的多行指令包起來,但如果只有一條指令要執行,就可以省略掉begin…end喔!
  4. 最底下是default,就是當expression跟上述的value都沒有對應到的話,就會執行default~可以防止都沒有對應到case的狀況。

這裡舉個例子:

module newwork(C);
	output [1:0] C;
	
	reg [1:0] cas;
	reg [1:0] out;
	
	always @(*)begin
		case(cas)
			2'b00: out = 0;
			2'b01: out = 1;
			2'b10: out = 2;
			2'b11: out = 3;
		endcase
	end
	
	assign C = out;
	
endmodule

這裡定義了一個2位元的輸出C、二位元暫存器cas及out。
在always的地方,out會根據cas來選擇要存的值為何,最後再將結果傳給C。

那case他還有兩個特殊的變形-casex及casez,他們主要是用來處理包含未知符號(x)及高阻抗值(z)的信號,他們會把x、z當作萬用字元,來簡化邏輯。

casex

先來介紹casex,他表示允許使用”x”或”z”來當作萬用字元,如果遇到這兩個字元,對應的位元可對應到任何值(0、1、x、z)。

這邊就直接舉例:

module newwork(C);
	output [3:0] C;
	
	reg [3:0] sig;
	reg [3:0] result;
	
	always @(*)begin
		casex(sig)
			4'b1xx0: begin
				result = 0;
			end
			default: begin
				result = 1;
			end
		endcase
	end
		
	assign C = result;
	
endmodule

只要sig的最高位是1、最低位是0,result的值就會是0;否則result的值就會為1,最後再將result結果傳給C。

casez

casez則只允許”z”做為萬用字元,遇到”x”的話會代表未知,不會是萬用狀態,所以得精確對應。
這裡舉個與casex相似的例子,只改變case的部分:

module newwork(C);
	output [3:0] C;
	
	reg [3:0] sig;
	reg [3:0] result;
	
	always @(*)begin
		casez(sig)
			4'b10z0: begin
				result = 0;
			end
			default: begin
				result = 1;
			end
		endcase
	end
		
	assign C = result;
	
endmodule

這裡的話,則是當sig為「4’b1000」、「4’b1010」及「4’b10z0」其中一個時會使result值為0,否則為1,最後再將結果傳給C。

那今天就先到這邊~


上一篇
Day-12 Verilog介紹-8 initial、Time_unit
下一篇
Day-14 Verilog介紹-10 條件&迴圈
系列文
硬體學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言