Verilog 关于负数

Posted stean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,此过程寄存器需要负数。

 

以上是关于Verilog 关于负数的主要内容,如果未能解决你的问题,请参考以下文章

关于verilog的全加器

关于verilog 中 assign 用法的一个问题

为啥这个 verilog 关系语句返回 true?

关于verilog中 if else 的问题

Verilog 语言,关于状态机的困惑

verilog中数组的索引顺序啥意思?如[N:1]