本题目虽然简单,但是值得探究有符号数和无符号数问题,笔试面试和实际项目常见的问题,建议学习。
1. 题目
根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a、b为8bit有符号数,
当select[1;0] =0,输出a;
当select[1;0] =1,输出b;
当select[1;0] =2,输出a+b;
当select[1;0] =3,输出a-b。
2. 解析
本题目比较简单,但是还是有一些值得注意的点,中间改动一些东西可能就会出错。因为输入输出都已经直接定义了signed有符号数类型,所以直接相加、相减也没有问题,不会出现运算错误。
有符号数+有符号数=有符号数
这其中,如果加数中有无符号数,那么就会按照无符号运算。
如果表达式中有一个无符号数,则所有的操作数都会被强行转换为无符号数;
即:有符号A +无符号B时,会将补码表示的有符号A当成无符号数A1,,再计算A1+B,这样得到的结果就是错的了。
两种解决方法:
(1)涉及到有符号数运算时,和有符号相关的输入、输出、中间变量均定义成signed有符号数,这样全部遵循有符号数运算规则;
(2)用位拼接符补齐符号位;
3. 代码
`timescale 1ns/1ns
module data_select(
input clk,
input rst_n,
input signed[7:0]a,
input signed[7:0]b,
input [1:0]select,
output reg signed [8:0]c
);
always @ (posedge clk&nbs***bsp;negedge rst_n)
begin
if( ~rst_n ) begin
c <= 9'b0;
end
else begin
case ( select )
2'b00 : begin
c <= {a[7], a};
end
2'b01 : begin
c <= {b[7], b};
end
2'b10 : begin
c <= {a[7], a} + {b[7], b};
end
2'b11 : begin
c <= {a[7], a} - {b[7], b};
end
default : begin
c <= 9'b0;
end
endcase
end
end
endmodule

京公网安备 11010502036488号