【芯片前端】保持代码手感——编写常值乘法器和一些拓展

本文介绍了一种基于移位加法实现的4位乘法器设计方法,用于计算c=12*a+5*b,其中a和b为4位无符号数。文章还讨论了如何优化乘法操作,例如通过移位和加法实现特定数值的乘法。

题目没什么意思,给的参考波形也有问题,不过可以拓展一点东西。

题目

编写一个4bit乘法器模块,并例化该乘法器求解c=12*a+5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);
endmodule

答案解析

无非就是用移位加法实现常值乘法呀,题目没讲清楚哪拍出,那我们就下一拍出值好了:

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);

    reg [8:0]a_mul_12;
    reg [8:0]b_mul_5;

    always @(posedge clk or negedge rst_n)begin
        if(~rst_n) a_mul_12 <= 0;
        else       a_mul_12 <= (a<<3) + (a<<2);
    end
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n) b_mul_5 <= 0;
        else       b_mul_5 <= (b<<2) + b;
    end
    assign c = a_mul_12 + b_mul_5;
endmodule

用auto_verifition仿一下:

 好了这个题没啥,注意一点,+优先级高于<<,因此别写成a<<3 + a<<2就行,否则逻辑出错。

延伸一下

如果我是面试官呢,我会继续延伸一步,不使用*写一下c=255*a的逻辑,当然了,这样写肯定是没有问题的:

c = (a << 7) + (a << 6) + (a << 5) + (a << 4) + (a << 3) + (a << 2) + (a << 1) + a

但是肯定有更好的逻辑优化解:

c = (a << 8) - a

要知道,减法和加法的逻辑开销是相差很小的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值