Verilog 關於負數


使用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,此過程寄存器需要負數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM