FPGA实现5位有符号定点原码乘法器:移位加与阵列结构性能对比与Quartus仿真

educoder第6关:5位无符号阵列乘法器设计 实验目的 帮助学生掌握阵列乘法器的实现原理,能够分析阵列乘法器的性能,能在 Logisim 中绘制阵列乘法器电路。 实验内容 在 Logisim 中打开 alu.circ 文件,在5位阵列乘法器中实现斜向进位的阵列乘法器,该电路引脚定义如图所示,其中 X,Y 为5位被乘数和乘数,P 为乘积输出,阵列乘法所需的25按位与的乘积项已经通过辅助电路生成,如图2.21所示,所有乘积项均通过隧道标签给出,用户只需要在已给出的电路框架中进行简单连线即可完成5位阵列乘法器。 电路框架 电路测试 完成实验后,利用文本编 阅读详情

1. 有符号定点原码乘法器基础

在FPGA设计中,乘法器是数字信号处理的核心组件之一。5位有符号定点原码乘法器虽然结构简单,但却是理解更复杂乘法器设计的基础。这种乘法器直接使用原码表示有符号数,最高位表示符号(0为正,1为负),其余4位表示数值大小。

我刚开始接触FPGA乘法器设计时,总觉得有符号数处理很复杂。其实原码乘法的规则很简单:符号位单独处理(异或运算),数值部分按无符号乘法计算。比如(-5)×(-3),符号位1⊕1=0(正数),数值部分5×3=15,结果就是+15。

在实际工程中,原码乘法器有两种主流实现方式:移位加结构和阵列结构。移位加结构就像我们手算乘法一样,逐位判断、移位累加;而阵列结构则通过并行计算所有部分积,然后用加法树快速求和。两种方法各有优劣,这也是我们今天要重点对比的内容。

2. 移位加乘法器设计与实现

移位加乘法器采用串行计算方式,特别适合资源受限的FPGA设计。其核心思想是通过状态机控制乘法的每一步:判断当前乘数位、条件累加、移位操作。

让我分享一下实际实现的代码框架:

module shift_add_multiplier (
    input clk,
    input start,
    input [4:0] multiplicand,  // 被乘数
    input [4:0] multiplier,    // 乘数  
    output reg [9:0] product,
    output reg done
);

parameter IDLE = 2'b00;
parameter CHECK = 2'b01;
parameter ADD = 2'b10;
parameter SHIFT = 2'b11;

reg [1:0] state = IDLE;
reg [4:0] counter;
reg [9:0] accum;
reg [4:0] mult_reg;

always @(posedge clk) begin
    case(state)
        IDLE: if(start) begin
            accum <= 10'b0;
            mult_reg <= multiplier;
            counter <= 5'd0;
            state <= CHECK;
        end
        
        CHECK: begin
            if(mult_reg[0]) 
                state <= ADD;
            else
                state <= SHIFT;
        end
        
        ADD: begin
            accum <= accum + {5'b0, multiplicand};
            state <= SHIFT;
        end
        
        SHIFT: begin
            accum <= {accum[9], accum[9:1]};  // 算术右移
            mult_reg <= {mult_reg[4], mult_reg[4:1]}; // 右移
            counter <= counter + 1;
            state <= (counter == 4) ? IDLE : CHECK;
            if(counter == 4) done <= 1'b1;
        end
    endcase
end
endmodule

这个设计中,我特别注意了算术右移的处理,因为要保持有符号数的符号位。实测中发现,如果使用简单的逻辑右移,负数的计算结果会出错。

移位加结构的最大优点是节省资源。在我的Cyclone IV测试中,整个设计只用了28个逻辑单元和16个寄存器。但缺点是速度较慢,完成一次5位乘法需要5-10个时钟周期(取决于乘数中1的个数)。

3. 阵列乘法器设计与实现

阵列乘法器采用完全并行的结构,通过生成所有部分积然后使用加法树快速求和。这种结构的延迟固定,与操作数无关,适合对时序要求严格的应用。

阵列乘法的关键部分是部分积的生成和处理。对于5位有符号原码乘法,我们需要考虑符号位扩展的问题:

module array_multiplier (
    input [4:0] a,  // 有符号原码
    input [4:0] b,  // 有符号原码
    output [9:0] product
);

// 符号位单独处理
wire sign = a[4] ^ b[4];

// 数值部分(取低4位)
wire [3:0] a_mag = a[3:0];
wire [3:0] b_mag = b[3:0];

// 生成部分积
wire [3:0] pp0 = {4{b_mag[0]}} & a_mag;
wire [3:0] pp1 = {4{b_mag[1]}} & a_mag;
wire [3:0] pp2 = {4{b_mag[2]}} & a_mag;
wire [3:0] pp3 = {4{b_mag[3]}} & a_mag;

// 加法树结构
wire [4:0] sum1 = pp0 + (pp1 << 1);
wire [4:0] sum2 = pp2 + (pp3 << 1);
wire [5:0] final_sum = sum1 + (sum2 << 2);

// 组合符号位和数值部分
assign product = {sign, final_sum[5:0], 3'b0};
endmodule

在实际实现中,我发现加法树的优化很重要。通过合理安排加法顺序,可以显著减少关键路径的延迟。在Quartus中综合后,阵列乘法器用了约45个逻辑单元,但延迟只有7.2ns,比移位加方案快得多。

阵列结构的另一个优点是规则性好。所有加法器都是并行的,布局布线后时序更容易满足。我在Stratix 10器件上测试时,阵列乘法器可以轻松跑到200MHz以上。

4. Quartus仿真环境搭建

搭建正确的测试环境是验证乘法器功能的关键。我通常使用ModelSim-Altera进行仿真,配合Quartus Prime Lite Edition(免费版本就足够用于这类设计)。

首先创建测试平台(testbench),要覆盖各种边界情况:

module tb_multiplier;
    reg clk;
    reg start;
    reg [4:0] a, b;
    wire [9:0] product;
    wire done;
    
    // 实例化被测设计
    shift_add_multiplier uut(
        .clk(clk),
        .start(start),
        .multiplicand(a),
        .multiplier(b),
        .product(product),
        .done(done)
    );
    
    // 时钟生成
    always #5 clk = ~clk;
    
    initial begin
        // 初始化
        clk = 0;
        start = 0;
        
        // 测试用例1:正数相乘
        #10 a = 5'b00101;  // +5
        b = 5'b00011;      // +3
        start = 1;
        #10 start = 0;
        wait(done);
        #10;
        
        // 测试用例2:负数相乘
        a = 5'b11011;      // -3(原码)
        b = 5'b10101;      // -5
        start = 1;
        #10 start = 0;
        wait(done);
        #10;
        
        // 更多测试用例...
        $stop;
    end
endmodule

在仿真中要特别注意有符号数的表示。原码表示中,负数的数值部分仍然是正数形式,只是符号位为1。比如-3的5位原码是1_0011(符号位+数值3)。

我建议至少测试以下情况:

  • 两个正数相乘
  • 正数与负数相乘
  • 两个负数相乘
  • 乘以0的情况
  • 边界值(最大正数×最大正数)

5. 性能对比分析

我对两种结构进行了详细的性能分析,结果很有启发性。在Cyclone IV EP4CE6器件上的测试数据如下:

资源占用对比:

结构类型逻辑单元(LE)寄存器数量最大频率
移位加2816125 MHz
阵列450185 MHz

延迟对比:

结构类型最坏情况延迟平均延迟
移位加10个周期(80ns)7个周期(56ns)
阵列1个周期(5.4ns)1个周期(5.4ns)

从数据可以看出明显的权衡:移位加结构节省资源但速度慢,阵列结构速度快但消耗更多资源。这种差异在实际应用中会产生重要影响。

在我最近的一个音频处理项目中,选择了移位加结构,因为系统时钟足够快(44.1kHz采样率),而资源约束很紧。但在图像处理项目中,必须使用阵列结构来满足流水线吞吐量要求。

功耗方面也有显著差异。静态功耗相差不大,但动态功耗上阵列结构更高,因为每次乘法都有大量组合逻辑切换。在电池供电设备中,这个因素需要重点考虑。

6. 优化策略与实践经验

经过多个项目的实践,我总结出一些有效的优化技巧。首先是流水线化,特别是对阵列乘法器:

// 二级流水线阵列乘法器
module pipelined_array_mult (
    input clk,
    input [4:0] a, b,
    output reg [9:0] product
);

// 第一级:生成部分积
reg [3:0] pp0, pp1, pp2, pp3;
always @(posedge clk) begin
    pp0 <= {4{b[0]}} & a[3:0];
    pp1 <= {4{b[1]}} & a[3:0];
    pp2 <= {4{b[2]}} & a[3:0];
    pp3 <= {4{b[3]}} & a[3:0];
end

// 第二级:加法树
reg [9:0] product_reg;
always @(posedge clk) begin
    product_reg <= pp0 + (pp1 << 1) + (pp2 << 2) + (pp3 << 3);
    product <= {a[4]^b[4], product_reg[8:0]};
end
endmodule

流水线化可以将频率提高40-50%,但会增加延迟和寄存器使用量。对于时序紧张的设计,这种交换通常是值得的。

另一个重要优化是操作数隔离。在移位加乘法器中,当不需要加法时,关闭加法器输入可以显著降低动态功耗:

// 操作数隔离示例
always @(posedge clk) begin
    if(state == ADD && mult_reg[0])
        accum <= accum + {5'b0, multiplicand};
    else
        accum <= accum;  // 保持原值,减少不必要的切换
end

在布局布线方面,我建议对阵列乘法器使用区域约束,将相关逻辑放在相邻位置以减少布线延迟。在Quartus中,可以通过LogicLock功能实现:

# Quartus Tcl约束示例
set_instance_assignment -name LOGICLOCK_REGION region1 -to pp0[*]
set_instance_assignment -name LOGICLOCK_REGION region1 -to pp1[*]
# ... 其他部分积

对于有符号数处理,要特别注意符号扩展和溢出处理。在原码乘法中,两个n位数相乘需要2n位结果才能避免溢出。在实际项目中,我遇到过因为结果位宽不足导致的微妙计算错误,调试起来很困难。

最后,测试覆盖要全面。除了正常数值,还要测试边界情况:-8×-8(最大正数64)、-8×7(最小负数-56)、0乘任何数等。使用自动测试向量生成可以大大提高验证效率。

logisim计组实验八 乘法器 原理:点这里 有问题欢迎留言哦~ 文章目录五位阵列乘法器电路图时间延迟分析六位补码阵列乘法器五位无符号乘法流水线原理图电路图原码一位乘法器原理图电路图补码一位乘法器 五位阵列乘法器 电路图 此处注意:全加器FA的cout端是进位端而非输出端 使用硬件控制比循环累加的速度快得多。 但是存在串行进位链 改进版: 时间延迟分析 T是计算相加数的一级门延迟 3n–>2n 性能差别在1.5倍 ... 阅读详情

相关推荐

multisim 原码阵列乘法器.ms14

任务: 1、通过multisim仿真平台,设计一个能计算含符号位的5位阵列乘法器,即内部为一个4×4阵列乘法器,符号位单独处理,如图6所示。 2、输入为两个5位含符号位的原码,输出结果亦是含符号位的原码。 图6 5×5阵列乘法器 要求: 1、能够正确输入两个5位(含符号位)的原码,并进行计算,得到正确的结果。 2、验证结果,输入两个均为原码的数据,验证并得到正确的仿真结果。 3、通过指示灯或者数码管显示为输入和输出的数据。

计算机组成原理之定点运算

计算机组成原理之定点运算 须知: l 正数的补码为其原值,负数的补码为其每位取反最末位加1 l 二进制两位数相加最大为1,即0+0=0,0+1=1,1+1=10(10不是十而是一零);则: 01 + 01 ———————— 10 一.加减法运算 1.补码加减法运算 加法: [x]补+[y]补=[x+y]补 (mod 2^(n+1))(即仅保留[x+y...

weixin_44929171的博客 4538

5位无符号阵列乘法器设计

计算机组成原理--5位无符号阵列乘法器设计

定点运算

一、移位运算 1.移位运算的数学意义 2.算术移位运算规则 设机器数字长为8位(含1位符号位),写出A=+26时,三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。 设机器数字长为8位(含1位符号位),写出A=-26时,三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。 3.算术移位和逻辑移位的区别 二、加减法运算 1.补码加减运算公式 ...

mathor的博客 9630

python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...

weixin_42204453的博客 4290

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1518

乘法运算器设计

乘法运算器的设计一,原码一位乘法器设计二,原码阵列乘法器设计三,补码一位乘法器设计 一,原码一位乘法器设计 图1图1图1 图1左是实现原码一位乘法器的流程图,右边根据流程图设计的概要图,左边的循环由右边的计数器CNT控制,每次移位,得出Yi的值(i及乘数Y的第i位的值,0或1),由右图可以看出,Yi=0时,|X|通道关闭,0通道打开,A通过ALU加0,当Yi=1时,0通道关闭,|X|通道打开,A通...

qq_43355372的博客 3548

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6244

基于FPGA的5位(有符号位)定点整数的原码乘法器Verilog代码Quartus仿真

代码功能: 组成原理第二次实验内容: 设计实现5位(包括符号位)定点整数的原码乘法器,分别由移位加和全加器阵列结构实现,比较两种结构的运算速度(输入乘数到输出积的时间)和硬件资源(逻辑门和触发器的个数)。 可以画原理图或者写verilog程序,quartus或者modelsim仿真,可编程逻辑器件实现。

xiakunpei123的博客 1464

Redis中什么是Big Key(大key)问题?如何解决Big Key问题?

通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一

weixiaohuai的博客 3万+

Windows 本地安装 OpenClaw(龙虾)完整教程(纯净无广告)

《Windows系统OpenClaw本地AI网关安装指南》 本文提供Windows 10/11系统下OpenClaw(龙虾)AI网关的完整部署教程,包含: 环境配置:Node.js安装验证 核心安装:npm全局部署OpenClaw 模型对接:以DeepSeek为例配置API 扩展功能:飞书机器人集成方法 日常管理:启停命令/Web面板访问 卸载清理:完整移除服务与残留 教程涵盖初始化配置、技能管理、常见问题排查,特别说明管理员权限要求及飞书配对流程,适合新手30分钟内完成本地AI网关搭建。通过命令行操作与W

qiuxunbin_csdn的博客 642

FPGA实现5位有符号定点原码乘法器:移位加与阵列结构性能对比分析

本文详细对比分析了FPGA实现5位有符号定点原码乘法器的两种主流结构:移位加结构和全加器阵列结构。通过Quartus仿真实测数据,从资源占用、时序性能和功耗多维度评估两种方案的优劣,为不同应用场景提供选择建议,并分享Verilog实现中的优化技巧和常见问题解决方案。

svm4gardener的博客 178

深入解析Docker Overlay2磁盘空间占用问题及高效清理策略

本文深入解析了Docker Overlay2存储驱动导致磁盘空间占用的核心原因,包括镜像与容器残留、日志文件膨胀、应用层泄漏及驱动特性。提供了从全局检查到精准定位的完整排查方法,并给出了从常规清理到配置优化的多维度高效清理策略,帮助用户从根本上解决Docker磁盘空间问题。

data3的博客 900

FPGA实现5位有符号定点原码乘法器的Verilog设计与Quartus仿真对比

本文详细介绍了基于FPGA的5位有符号定点原码乘法器的Verilog设计与Quartus仿真对比。重点分析了移位加和阵列乘法器两种实现方案,包括核心代码、性能优化和资源消耗对比,并通过Quartus平台进行功能验证和时序分析,为数字电路设计提供实用参考。

yyy34的博客 176

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3082

MAX30102心率血氧传感器原理图设计,已量产(e-Health传感器)

在最近的便携健康监测设备项目中,我们采用了集成算法的 MAX30102 心率血氧模块 —— 这类带内置 MCU 算法的传感器能直接输出心率 / 血氧数值,大幅降低了主控资源占用。但硬件电路的稳定性直接决定了 PPG 信号的采集精度,下面结合实际项目里的原理图,拆解下这个模块的设计细节。

不脱发的程序猿 1283

FPGA实现Booth乘法器:从Verilog设计到Modelsim仿真与上板验证

乘法器是数字信号处理、加密算法和算术逻辑单元中的核心运算部件,其性能直接影响系统效率。Booth算法通过巧妙的编码方式,将连续的‘1’或‘0’转换为加减操作,显著减少了硬件乘法所需的加法次数,尤其擅长处理带符号数的二进制补码乘法,在FPGA等硬件平台上能有效优化资源与速度。这一原理使其在需要高性能、低功耗计算的场景中极具技术价值,例如数字滤波器、加密协处理器和嵌入式处理器内核。本文以Booth算法为例,结合Modelsim仿真工具和嘉豪开发板,详细拆解了从Verilog代码编写、功能仿真到实际上板调试的全流

weixin_34234721的博客 397

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机组成原理之定点乘法运算

计算机组成原理之定点乘法运算

牛牛博士博客 1106

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

基于FPGA的“乘法器”设计

乘法器的两个乘数是4位2进制数,输入乘积项是8位位宽的2进制数。当乘数准备好后,START信号有效,电路开始进行乘法运算,当乘法运算结束后,电路输出DONE有效信号。另一个控制信号是RESET信号,用来完成复位时使用。乘法电路采用的算法要求使用加法和移位相结合的算法来实现电路。二进制数乘法过程可仿照十进制数乘法进行。

wechatli的博客 1610

计算机组成原理5位无符号阵列乘法器

计算机组成原理5位无符号阵列乘法器 话说我们学校上课是讲的啥啊根本听不懂、、、是我理解能力不行好吧,只能自己下来再努力上网找资料学习。今天咱就是说来浅浅学习一下5位无符号阵列乘法器。 首先上电路图 很好,又看不懂。没关系!我可以的!!! 找遍全网也看不到讲这个的可恶啊但是咱就是说不要放弃,我终于在一篇博客里面发现了一个讲这个的慕课链接,分享一下。计算机硬件系统设计 里面还有个群可以加,加了才发现群主竟然是谭志虎(笑),感觉自己追星成功哈哈哈 群号:957283876 好了咱说回这个 这玩意儿看着真复杂,但

qq_52641289的博客 1万+

计算机组成原理6位原码阵列乘法器

于是乎,我们之前得到的X原码和Y原码就派上用场了,由于两者存放的都是原码,想要正常显示就得将其转为补码,再传入X的真值与Y的真值。而且你把6位的原码转补码电路画完后,由于结果P是11位的,应该考虑和X、Y同样的问题,需要将P的原码转成补码才能使P真值反应真实数据,所以你还要手动扯线画一个11位原码转补码电路。将数值位传入无符号5位阵列乘法器得到结果的数值位,然后将符号位和数值位结合起来,再传入11位原码转补码电路,输出为P真值即可。分理处的最高位是符号位,后面需要进行异或操作得到结果的符号位。

shyYukino的博客 3060

头歌计算机组成原理实验—运算器设计(6)第6关:5位无符号阵列乘法器设计

头歌计算机组成原理实验—运算器设计(6)第6关:5位无符号阵列乘法器设计

qq_62524881的博客 6693

基于FPGA的高效乘法器

通过移位实现乘法运算,运算时间与乘数的位宽和数值有关,最多经过乘数位宽个时钟周期输出数据,由于只使用了加法器,可以运行在较高时钟频率。

详解FPGA及硬件电路开发 3105

【计算机组成原理】乘法阵列器

文章目录一、不带符号的原码乘法二、带符号的补码乘法三、不带符号的乘法阵列器四、带符号的乘法阵列器五、直接补码阵列乘法器全加器的设计 一、不带符号的原码乘法 运算规则:设置数值位为n的两个乘数用原码表示的定点数 【X】原=Xf Xn-1…… X1 X0 【Y】原=Yf Yn-1…… Y1 Y0 乘积【Z】原 =(X⊕Y)+(Xn-1……X1X0)(Yn-1……Y1Y0) 机器字长为n位,两个n位...

TYPFOON的博客 2万+

原码乘法、补码乘法

转自:http://www1.hrbust.edu.cn/zuzhijigou/metc/material/zcyl/Chap02/2.3.2.htm 1 .原码乘法          1.人工算法与机器算法的同异性   在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或 运算得到,而乘积的数值部分则是两个正数相乘之积

天涯明月的专栏 4万+

乘法阵列器

三种乘法矩阵器的介绍

2401_83299419的博客 1717
上一篇: Makefile与现代构建工具:探索STM32F103在Linux下的构建演进之路
下一篇: 从ADCensus到OAK:立体视觉算法如何重塑3D感知硬件设计
ruby5
博客等级 码龄15年 29粉丝 893原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值