在Verilog

时间:2018-02-12 01:17:50

标签: verilog fractions fixed-point

我是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位长。

1 个答案:

答案 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