在Verilog中声明分数格式的定点数

在Verilog中声明分数格式的定点数,verilog,fractions,fixed-point,Verilog,Fractions,Fixed Point,我是Verilog新手,正在尝试编写一个代码,使用CSA将三个5位数字添加到2的补码输出中。因此,我面临的问题是如何最初声明我的输入,其中一些输入采用以下格式: x是2的补码1.4格式, y为2的补码2.3格式,且 z为无符号5.0格式 这是我的两个模块 module fulladder ( input a,b,cin, output sum,carry ); assign sum = a ^ b ^ cin; assign ca

我是Verilog新手,正在尝试编写一个代码,使用CSA将三个5位数字添加到2的补码输出中。因此,我面临的问题是如何最初声明我的输入,其中一些输入采用以下格式:

x是2的补码1.4格式, y为2的补码2.3格式,且 z为无符号5.0格式

这是我的两个模块

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位长

如@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定点的一般答案是。

我认为你需要首先使所有的分数具有相同的格式,比如Q9.0,通过左移去除分数,然后添加分数,然后将格式更改回适当的格式,即Q9.4谢谢你,Serge,我做了几乎相同的事情,只是输出是7.4Hi Morgan,谢谢你的回答,如果我答对了,你只需将前两个输入的4位向左移位,但我不明白为什么我们还需要将第三个输入转换为分数位?或者你只是把4个位置的小数点向左移动了?Verilog会意识到我现在想用分数操作吗?这也意味着我仍然使用reg[4:0]作为前两个输入,或者像你提到的那样,我只是直接以x_I y_的格式分配它?对于twos补码,没有符号和无符号这回事,这完全是关于如何解释位。强制MSB为0意味着它始终为正,即与未签名时相同。Verilog没有分数位的概念。我们基本上乘以2^4,得到了4个概念上的分数位,这取决于你跟踪它们!谢谢你,摩根,我想我现在好多了。起初我对分数很困惑,但现在我明白了,我们要选择如何表示定点数。我还认为还有另一种解决方案,我们可以根据输出直接扩展输入。由于输出将变为[10:0]和+cout+1'b0位,我们通过将其MSB复制5次来扩展x,通过将其MSB复制4次来扩展y,并将2'b0添加到z的右侧,将2'b0添加到z的左侧,将3'b0添加到z的右侧。@DanF。听起来不错。我只想检查一下,扩展后的每个输入中是否允许相同数量的分数位,即正确对齐二进制点。