使用Verilog描述语言时,在编写含有负数判断的描述语言时,需要定义负数的数据类型。
一般的包含0以及0以上的正数寄存器只需声明 reg 即可;
用法:
reg [x:0] a;
reg寄存器是最常用的寄存器类型,这种寄存器中只能存放无符号数。如果给reg中存入一个负数,通常会被视为正数!
而对于是负数或者是存在负数的寄存器声明要使用 signed;
用法:
reg signed [x:0] 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,此过程寄存器需要负数。