大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
comp_conv.v:
// 2022-1-19 verilog学习
// 补码转换逻辑
`timescale 1ns/10ps;
module comp_conv(
a,
a_comp
);
input[7:0] a;
output[7:0] a_comp;
// 中间变量
wire[6:0] b; // 负数按位取反的幅度位 (1位符号位+7位幅度位)
wire[7:0] y; // 负数的补码
assign b = ~a[6:0];
assign y[6:0] = b+1; // 负数的补码=幅度位按位取反+1
assign y[7] = a[7]; // 符号位不变
// 二选一
assign a_comp = a[7]?y:a; //正数(符号位[7]是0)的补码是自己,负数的补码是y
endmodule
// testbench 测试台
module comp_conv_tb;
reg[7:0] a_in; // 输入有变化,reg型变量
wire[7:0] y_out; // 输出要看,wire型变量
comp_conv comp_conv(
.a(a_in),
.a_comp(y_out)
); // 测试输入输出即可
initial begin
a_in <= 0; // a_in初始化
#3000 $stop; // 8位bit从00000000到11111111有256个变化,每个变化10ns,3000ns足够
end
always #10 a_in <= a_in+1;
endmodule
简洁版
// 2022-1-19 verilog学习
// 补码转换逻辑
`timescale 1ns/10ps;
module comp_conv(
a,
a_comp
);
input[7:0] a;
output[7:0] a_comp;
// 中间变量
//wire[6:0] b; // 负数按位取反的幅度位 (1位符号位+7位幅度位)
//wire[7:0] y; // 负数的补码
//assign b = ~a[6:0];
//assign y[6:0] = b+1; // 负数的补码=幅度位按位取反+1
//assign y[7] = a[7]; // 符号位不变
//assign y = {a[7],~a[6:0]+1};
// 二选一
//assign a_comp = a[7]?y:a; //正数(符号位[7]是0)的补码是自己,负数的补码是y
assign a_comp = a[7]?{
a[7],~a[6:0]+1}:a; // 二选一
endmodule
// testbench 测试台
module comp_conv_tb;
reg[7:0] a_in; // 输入有变化,reg型变量
wire[7:0] y_out; // 输出要看,wire型变量
comp_conv comp_conv(
.a(a_in),
.a_comp(y_out)
); // 测试输入输出即可
initial begin
a_in <= 0; // a_in初始化
#3000 $stop; // 8位bit从00000000到11111111有256个变化,每个变化10ns,3000ns足够
end
always #10 a_in <= a_in+1;
endmodule
modelsim 仿真:
正数补码与原码相同
负数补码符号位 [7] 不变,幅度 [6:0]取反+1
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192506.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...