Verilog HDL 訓練】第 03 天">【Verilog HDL 訓練】第 03 天
929
2025-04-03
數據通路。
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(
);
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小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。