我是Verilog的新手并尝试编写一个代码,该代码将使用CSA将3个5位数字添加到2的补码输出中。所以我面临的问题是如何最初声明我的输入,其中一些输入采用以下格式:
x是2的补码1.4格式, y是2的补码2.3格式,和 z是无符号5.0格式
这是我的2个模块
module fulladder
( input a,b,cin,
output sum,carry
);
assign sum = a ^ b ^ cin;
assign carry = (a & b) | (cin & b) | (a & cin);
endmodule;
module Top
( input [4:0] x,y,z,
output [7:0] s,
output cout
);
reg [4:0] x; //(Q1.4)
reg [4:0] y; //(Q2.3)
wire [4:0] c1,s1,c2;
fulladder fa_inst10(x[0],y[0],z[0],s1[0],c1[0]);
fulladder fa_inst11(x[1],y[1],z[1],s1[1],c1[1]);
fulladder fa_inst12(x[2],y[2],z[2],s1[2],c1[2]);
fulladder fa_inst13(x[3],y[3],z[3],s1[3],c1[3]);
fulladder fa_inst14(x[4],y[4],z[4],s1[4],c1[4]);
fulladder fa_inst20(s1[1],c1[0],1'b0,s[1],c2[1]);
fulladder fa_inst21(s1[2],c1[1],c2[1],s[2],c2[2]);
fulladder fa_inst22(s1[3],c1[2],c2[2],s[3],c2[3]);
fulladder fa_inst22(s1[4],c1[3],c2[3],s[4],c2[4]);
fulladder fa_inst23(1'b0,c1[4],c2[4],s[5],cout);
assign s[0] = s1[0];
endmodule;
我检查了很多来源,但没有一个说明Verilog如何确切地声明分数。如果有人解释如何对输出进行位对齐,我也会很感激,因为我的输入都是不同的格式。我计算出我的输出应该是7.4位长。
答案 0 :(得分:1)
您必须手动将二进制点对齐为@serge提及。
最大分数部分是4.因此(z)纯整数需要4个派系位。无符号整数需要将额外的MSB设置为0,因此在二进制补码中,它可以与带符号的数字组合。
// x => 1.4 format (signed)
// y => 2.3 format (signed)
// z => 5.0 format (unsigned)
reg [9:0] x_i, y_i, z_i; // format 6.4 (signed)
x_i = { 5{x[5]}, x }; // 5 int bits
y_i = { 4{y[5]}, y, 1'b0}; // 4 int bits + 1 frac bit
z_i = { 1'b0, z, 4'b0}; // 1 int bits (always positive) + 4 frac bits
关于使用Verilog的定点的一般答案是here。