码迷,mamicode.com
首页 > 其他好文 > 详细

Verilog 关于负数

时间:2018-04-01 11:58:25      阅读:766      评论:0      收藏:0      [点我收藏+]

标签:begin   清零   sans   编写   组合   family   一个   变化   计时器   

使用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 关于负数

标签:begin   清零   sans   编写   组合   family   一个   变化   计时器   

原文地址:https://www.cnblogs.com/lyfcrazy/p/8685933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!