Verilog HDL 训练】第 12 天(数据通路)

网友投稿 803 2022-05-30

数据通路。

y = func(a,b)

func可以是加法,减法,乘法,比较,移位,舍入,饱和等。

分别针对有符号数,无符号数的情况。

提示:可以参考synopsys的一篇文档 https://t.zsxq.com/QF6QNju

加法:

对于无符号数而言:

module arithmetic(

input [3:0] a,

input [3:0] b,

output [4:0] res_sum, //加

output [3:0] res_sub, //减

output [7:0] res_pro, //乘

//output [3:0] res_comp, //比较

output [3:0] right_shift //右移

);

assign res_sum = a + b;

assign res_sub = a - b;

assign res_pro = a * b;

//assign res_com =

assign right_shift = a>>3; //逻辑右移

wire [3:0] right_shift_a; //算术右移结果

assign right_shift_a = a>>>3;

endmodule

测试文件:

module arithmetic_tb(

);

【Verilog HDL 训练】第 12 天(数据通路)

reg clk;

reg [3:0] a;

reg [3:0] b;

wire [4:0] res_sum; //加

wire [3:0] res_sub; //减

wire [7:0] res_pro; //乘

//wire [3:0] res_comp, //比较

wire [3:0] right_shift; //右移

initial begin

clk = 0;

forever

# 2 clk = ~clk;

end

initial begin

a = 4'b1011;

b = 4'b1001;

#10

a = 4'b1001;

b = 4'b0111;

end

arithmetic u0(

.a(a),

.b(b),

.res_sum(res_sum),

.res_sub(res_sub),

.res_pro(res_pro),

.right_shift(right_shift)

);

endmodule

行为仿真时序图:

对于无符号数,逻辑右移和算术右移是一样的,都是高位补零。

对于有符号数而言:

module arithmetic(

input signed [3:0] a,

input signed [3:0] b,

output signed [4:0] res_sum, //加

output signed [3:0] res_sub, //减

output signed [7:0] res_pro, //乘

output signed [3:0] right_shift //右移

);

assign res_sum = a + b;

assign res_sub = a - b;

assign res_pro = a * b;

//assign res_com =

assign right_shift = a>>3; //逻辑右移

wire [3:0] right_shift_a; //算术右移结果

assign right_shift_a = a>>>3;

endmodule

测试文件同上!

仿真波形:

可以看出,对于有符号数,逻辑右移和算术右移结果不一样,逻辑右移依然是补零,算术右移则补符号位。

但对于有符号数的加法规则如何?

例如上述仿真:1001 + 0111 为什么等于 00000?

也就是-1 + 7 = 0?

得到了答案:

1001是补码的形式,原码是1111,也就是-7,这样的话就是-7+7=0,也符合道理了。

机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:solr-搜索-查询中的局部参数
下一篇:零代码基础建立AI语音模型-快速上手
相关文章