推荐答案
测试一下
题目
进行一个运算单元的电路设计,A[7:0]*11111011,请尽量用最少的资源来实现,写出对应的RTL代码。
参考答案与知识点
参考答案
将常数 11111011 (二进制) 即 0xFB (十进制 251) 表示为 256 - 4 - 1,即 2^8 - 2^2 - 2^0。因此 A * 251 = (A << 8) - (A << 2) - A。在 RTL 中,使用移位和加减法实现,避免了乘法器,资源最省。注意位宽:A 为 8 位无符号数,乘积最大为 16 位 (255*251=64005 < 2^16),故结果定义为 16 位。实现代码:
`timescale 1ns/1ps
module mul_251 (
input [7:0] A,
output [15:0] result
);
assign result = (A << 8) - (A << 2) - A;
endmodule
该结构仅使用三个移位器和两个减法器,综合面积小。注意减法顺序:先左移再相减,所有操作数自动扩展至 16 位。无需额外符号扩展,因为无符号运算结果非负。
涉及知识点
- 常数乘法分解为移位加减
- 资源优化设计方法
- 无符号数位宽扩展处理
- 组合逻辑 RTL 实现