EETOP 创芯网论坛 (原名:电子顶级开发网)

标题: verilog语言12x12位有符号数代码 [打印本页]

作者: cfpdl    时间: 2016-1-13 16:18
标题: verilog语言12x12位有符号数代码
RT,这个怎么写,有资料或者链接什么的大神可以给我参考一下吗,谢谢
作者: whz7783478    时间: 2016-1-13 17:40
这个直接用signed 定义乘数和被乘数就好了。难道要用booth算法+加法树去做?
作者: cfpdl    时间: 2016-1-13 17:59
回复 2# whz7783478


   其实我不大懂,网上的代码很复杂,我一句话不行吗,assign Y=X1*X2
作者: whz7783478    时间: 2016-1-13 18:41
回复 3# cfpdl


   input  signed [7:0] a, b;output  signed [15:0] o;assign o = a * b;
作者: cfpdl    时间: 2016-1-14 09:41
回复 4# whz7783478


   这个就是12位有符号整数的么,怎么网上的好几十行
作者: cfpdl    时间: 2016-1-14 10:48
回复 4# whz7783478


   我是那个弄一个module12x12(clk,a,b,result)这种的,每次始终上升沿就执行一次操作,12X12有符号整数的
作者: z894811350    时间: 2016-1-14 11:18
我本人会方法
1、generate一个mux_ip
2、手写一个
作者: whz7783478    时间: 2016-1-14 11:27
回复 6# cfpdl

一般情况下乘法器就是组合逻辑,你如果要1clk出一个结果,需要乘数、被乘数一个clk改变一次就可以了啊
作者: cfpdl    时间: 2016-1-14 17:58
回复 7# z894811350


   我想手写用一个的,但是我不明白要不要考虑原码和补码那些,因为我的数里有负数,还有看到很多很复杂的又要移位什么的,不是一个乘号*就行了吗,我写了一个,这个有什么问题吗

module 12X12(clock,dataa,datab,result)

input clock;

input signed [11:0]  dataa,datab;//输入12位有符号整数

output[22:0]  result;//23位的输出,1符号位+22位数字

reg [22:0] result;

reg [11:0] x1,x2,x3,x4;//x1x2存放输入变量;x3x4存放变量的原码

reg x5;               //存放输出的符号位

reg[21:0] x6;         //22位寄存器,存放22位有效数字相乘结果

reg[22:0] x7;          //存放输出数据的原码

always@ (posedge clock)

begin

  x1<=dataa;            //寄存器赋值

  x2<=datab;

  x3<=(x1[11]==0)?x1:{1'b1,~x1[10:0]+1'b1}; //判断最高位是否为1,即输入是否为负数,是                           


                                        就取其补码


x4<=(x2[11]==0)?x2:{1'b1,~x2[10:0]+1'b1};//同上

  x5<=x3[11]^x4[11];              //两数符号位异或

  x6<=x3[10:0]*x4[10:0];          //11位有效数字相乘

  x7<={x5,x6};                   //输出的原码,由符号位+有效数字组成

  result<=(x7[22]==0)?x7:[1'b1,~x7[21:0]+1'b1];//判断输出是否为负数,是就变为补码

end

endmodule


作者: cfpdl    时间: 2016-1-14 18:06
回复 8# whz7783478


   我楼下自己写的那个感觉不大对,我也不确定输出到底是23位还是24位,要不要补码运算,能看一下吗
作者: whz7783478    时间: 2016-1-14 19:05
回复 10# cfpdl

决定是23位还是24的要素是你的乘数或者被乘数是否能取负的最大。也即-2048.如果能出现这种情况,就是24位。你的代码如果在不出现-2048的情况下是没问题的
作者: z894811350    时间: 2016-1-15 09:41
回复 9# cfpdl


   我用你的代码试了一下,加入4*4的乘法计算,1001*1001就是不对,如果数据接口进来的是补码(可能你的是其他设备进来的数据吧),那你这种计算方式是对的,感觉fpga代码里面好像都是直接计算的。   判断23位还是24位就像whz7783478 说的那样,感觉你可以用计算器试一下,这样自己就清晰了
    如果我说的不对请纠正
作者: cfpdl    时间: 2016-1-15 14:10
回复 12# z894811350


   我是到时还要在modelsim上仿真,我被测试程序输进来的是原码,好像在网上看到说不用考虑补码什么的,我改了一下程序,但用quartus仿真波形不大对

module mult12X12(clock,dataa,datab,result);

output [23:0] result;

input clock;

input signed [11:0] dataa;

input  signed [11:0] datab;

reg signed [11:0] dataa_reg;

reg signed [11:0] datab_reg;

reg signed [23:0] result;

wire signed [23:0] mult_result;

assign mult_result =dataa_reg*datab_reg;

always@(posedge clock)

  begin

   dataa_reg<=dataa;

   datab_reg<=datab;

   result<=mult_result;

   end

endmodule


作者: cfpdl    时间: 2016-1-15 14:12
回复 11# whz7783478


   我的数里有-2047,没有到-2048,还是不大确定在modelsim要不要用补码,能帮我看看我改了之后的我程序吗,在楼下
作者: z894811350    时间: 2016-1-15 14:47
本帖最后由 z894811350 于 2016-1-15 14:49 编辑

1、你加上复位试试
2、你是要把进来的数据锁住还是输出的数据锁住
我写一个简单的锁进来数据的例子
assign mult_result =dataa_reg*datab_reg;
always@(posedge clock)
begin
    if(!rst_l)
    begin
        dataa_reg<=12‘d0;
        datab_reg<=12’d0;
    end
    else
    begin
    dataa_reg<=dataa;
    datab_reg<=datab;
    end
end
3、要不要补码你可以用计算器算,感觉第23位不足以判断就用24位(个人感觉是,我也没弄过)
作者: cfpdl    时间: 2016-1-15 14:58
回复 15# z894811350


   额,这是我的fir滤波器原理图,就是数据输入进来通过移位寄存器,每个都乘法器实现x(n-k)*h(k),我也不清楚你说的要锁住哪个,还有为什么要加复位
作者: z894811350    时间: 2016-1-15 15:10
回复 16# cfpdl


   我是看到你那里有乱数据,所以想着让你复位试试。   看你的仿真结果输出的乱,感觉是没控制好。
作者: cfpdl    时间: 2016-3-1 14:34
木人了1啊啊
作者: battyson    时间: 2016-3-1 20:15
太难受了  下个书  要几十个信源
作者: 董小三    时间: 2016-3-2 06:14
12乘12输出是24位的,包括符号位




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5