使用Verilog描述語言時,在編寫含有負數判斷的描述語言時,需要定義負數的數據類型。
一般的包含0以及0以上的正數寄存器只需聲明 reg 即可;
用法:reg [ ]a;
reg寄存器是最常用的寄存器類型,這種寄存器中只能存放無符號數。如果給reg中存入一個負數,通常會被視為正數!
而對於是負數或者是存在負數的寄存器聲明要使用 signed;
用法:reg signed [ ] a;
示例:
正數的寄存器聲明:
reg [ 4:0] seconds1_data; //秒鍾低位數據寄存器1
reg [ 4:0] seconds1_data_n; //seconds1_data的下一個狀態
reg [ 4:0] seconds2_data; //秒鍾高位數據寄存器2
reg [ 4:0] seconds2_data_n; //seconds2_data的下一個狀態
reg [ 4:0] minutes1_data; //分鍾低位數據寄存器
reg [ 4:0] minutes1_data_n; //minutes1_data的下一個狀態
reg [ 4:0] minutes2_data; //分鍾高位數據寄存器
reg [ 4:0] minutes2_data_n; //minutes1_data的下一個狀態
其對應的某一段控制數據變化的組合邏輯代碼如下:
always @ (*)
begin
if(time_seconds == SEC_TIME_1S | key_out[4] == 1'b1) //判斷按鍵KEY5和判斷1s時間
seconds1_data_n = seconds1_data + 1'b1; //如果按鍵按下或者到達1s,seconds1_data將會加1
else if(seconds1_data == 4'd10) //判斷seconds1_data有沒有達到10s
seconds1_data_n = 1'b0; //如果seconds1_data到達10s,seconds1_data將會被清零
else
seconds1_data_n = seconds1_data; //否則seconds1_data將會保持不變
end
含有負數的寄存器聲明:
reg signed[ 4:0] seconds1_data; //秒鍾低位數據寄存器1
reg signed[ 4:0] seconds1_data_n; //seconds1_data的下一個狀態
reg signed[ 4:0] seconds2_data; //秒鍾高位數據寄存器2
reg signed[ 4:0] seconds2_data_n; //seconds2_data的下一個狀態
reg signed[ 4:0] minutes1_data; //分鍾低位數據寄存器
reg signed[ 4:0] minutes1_data_n; //minutes1_data的下一個狀態
reg signed[ 4:0] minutes2_data; //分鍾高位數據寄存器
reg signed[ 4:0] minutes2_data_n; //minutes1_data的下一個狀態
其對應的某一段控制數據變化的組合邏輯代碼如下:
always @ (*)
begin
if(time_seconds == SEC_TIME_1S ) //判斷1s時間
seconds1_data_n = seconds1_data - 1'b1; //如果按鍵按下或者到達1s,seconds1_data將會減1
else if(seconds1_data == -1'b1) //判斷seconds1_data有沒有達到-1s
seconds1_data_n = 4'd9; //如果seconds1_data到達-1s,seconds1_data將會被置9
else if(timeup == 1'b0) //如果計時器到0
seconds1_data_n = 1'b0; //置0
else
seconds1_data_n = seconds1_data; //否則seconds1_data將會保持不變
end
兩者例子均是seconds1_data數據位變化,一個正向從1累加到9置零,一個反向從9遞減到0置9
正向判斷是加到了10歸0;反向則是減到-1置9,此過程寄存器需要負數。