在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: 2441697316

[求助] Verilog补码乘法

[复制链接]
发表于 昨天 15:04 | 显示全部楼层
Thanks
 楼主| 发表于 昨天 15:37 | 显示全部楼层


liuguangxi 发表于 2024-9-27 14:46
当然可以综合,主流EDA工具都支持



您看看我写的代码,位宽处理有没有问题
//////
wire signed [7:0] byte3_a;
wire signed [7:0] byte2_a;
wire signed [7:0] byte1_a;
wire signed [7:0] byte0_a;


wire signed [7:0] byte3_b;
wire signed [7:0] byte2_b;
wire signed [7:0] byte1_b;
wire signed [7:0] byte0_b;


assign byte3_a [7:0] = data_in_a[31:24];

assign byte2_a [7:0] = data_in_a[23:16];

assign byte1_a [7:0] = data_in_a[15: 8];



assign byte0_a [7:0] = data_in_a[ 7: 0];



assign byte3_b [7:0] = data_in_b[31:24];

assign byte2_b [7:0] = data_in_b[23:16];
assign byte1_b [7:0] = data_in_b[15: 8];

assign byte0_b [7:0] = data_in_b[ 7: 0];


///////

wire signed [7:0] byte3_a_sgn;
wire signed [7:0] byte2_a_sgn;
wire signed [7:0] byte1_a_sgn;
wire signed [7:0] byte0_a_sgn;


wire signed [7:0] byte3_b_sgn;
wire signed [7:0] byte2_b_sgn;
wire signed [7:0] byte1_b_sgn;
wire signed [7:0] byte0_b_sgn;



assign byte3_a_sgn [7:0] = {sign_a && byte3_a[7] , byte3_a[6:0]};

assign byte2_a_sgn [7:0] = {sign_a && byte2_a[7] , byte2_a[6:0]};
assign byte1_a_sgn [7:0] = {sign_a && byte1_a[7] , byte1_a[6:0]};


assign byte0_a_sgn [7:0] = {sign_a && byte0_a[7] , byte0_a[6:0]};



assign byte3_b_sgn [7:0] = {sign_b && byte3_b[7] , byte3_b[6:0]};

assign byte2_b_sgn [7:0] = {sign_b && byte2_b[7] , byte2_b[6:0]};
assign byte1_b_sgn [7:0] = {sign_b && byte1_b[7] , byte1_b[6:0]};

assign byte0_b_sgn [7:0] = {sign_b && byte0_b[7] , byte0_b[6:0]};



/////

reg signed [15:0] mult_byte3;
reg signed [15:0] mult_byte2;
reg signed [15:0] mult_byte1;
reg signed [15:0] mult_byte0;

always@(...)begin
    if(!rstn)begin
        mult_byte3[15:0] <= 16'b0;
        mult_byte2[15:0] <= 16'b0;
        mult_byte1[15:0] <= 16'b0;
        mult_byte0[15:0] <= 16'b0;
    end
    else if(mult_flag)begin

        mult_byte3[15:0] <= byte3_a_sgn[7:0] * byte3_b_sgn[7:0] ;
        mult_byte2[15:0] <= byte2_a_sgn[7:0] * byte2_b_sgn[7:0] ;
        mult_byte1[15:0] <= byte1_a_sgn[7:0] * byte1_b_sgn[7:0] ;
        mult_byte0[15:0] <= byte0_a_sgn[7:0] * byte0_b_sgn[7:0] ;
    end

end


/////

reg signed [17:0] mult_byte_sum;

always@(...)begin
    if(!rstn)
        mult_byte_sum[17:0] <= 18'b0;
    else if(mult_sum_flag)

        mult_byte_sum[17:0] <= mult_byte3[15:0] +
                                             mult_byte2[15:0] +
                                             mult_byte1[15:0] +
                                             mult_byte0[15:0];
end



/////


reg signed [31:0] sum;
always@(...)begin
    if(!rstn)
        sum[31:0] <= 32'b0;
    else if(sum_flag)

        sum[31:0] <= sum[31:0] + mult_byte_sum[17:0];
    else
        sum[31:0] <= 32'b0;
end








发表于 4 小时前 来自手机 | 显示全部楼层


2441697316 发表于 2024-9-24 20:50
要能软件配置有符号还是无符号,比如有*有,有*无,无*有,无*无,直接定义signed的电路好像不能复用




复用跟有无符号无关,应该说一般情况下每个*运算符会综合出一个乘法器,除非公共子表达式之类的优化有可能减少乘法器的数量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-28 20:14 , Processed in 0.013431 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表