当前位置: 首页 > article >正文

12.3【hardware][day3]

  1. 关于使用硬件 DSP 资源实现乘法的含义

    • 在 Xilinx 7 Series FPGA(现场可编程门阵列)中,乘法运算可以通过专门的数字信号处理(DSP)硬件资源来完成。当使用 Verilog 语言编写代码进行乘法运算时,直接使用乘号(如a * b,其中ab是操作数),综合工具在处理代码时会自动将乘法操作映射到 FPGA 内部的 DSP 模块。
    • 自己实现乘法逻辑是指不依赖 FPGA 内部的 DSP 资源,而是通过基本的逻辑门(如与门、加法器等)组合来构建乘法电路。例如,使用移位相加的方法来实现乘法:对于两个二进制数相乘,可以将一个数按位与另一个数相乘,然后根据位权相加。然而,这种方法构建的乘法电路在时序方面往往存在问题。
    • 时序问题主要体现在信号的延迟上。自己构建的乘法逻辑可能会包含多个逻辑门的级联,每个逻辑门都会引入一定的延迟。当信号经过多个逻辑门时,延迟会累积,导致输出信号不能及时跟上输入信号的变化,从而可能出现时序违规的情况。例如,在高速数字系统中,信号需要在特定的时钟周期内完成处理,如果由于乘法逻辑的延迟导致数据不能在规定时间内准备好,就会产生错误。

DSP 资源的定义和作用

  • 定义:DSP 资源是 FPGA 内部专门用于数字信号处理的硬件模块。在 Xilinx 7 Series FPGA 中,这些 DSP 模块是高度优化的电路结构,专门用于高效地执行乘法、加法、滤波等数字信号处理操作。
  • 作用
    • 高效乘法运算:DSP 模块能够以很高的速度和较低的功耗执行乘法操作。它们内部包含了高速乘法器、加法器以及一些用于数据存储和流水线处理的寄存器等。例如,在实现一个高速数字滤波器时,需要大量的乘法和加法运算,DSP 资源可以快速地完成这些操作,满足系统对速度的要求。
    • 支持复杂运算:除了乘法,DSP 模块还可以支持其他复杂的数字信号处理运算,如乘累加(MAC)操作。MAC 操作在数字信号处理算法(如离散傅里叶变换、卷积等)中广泛应用。DSP 模块通过将乘法和加法操作集成在一个单元中,可以在一个时钟周期或几个时钟周期内高效地完成 MAC 操作,大大提高了数字信号处理的效率。
    • 流水线处理和资源复用:DSP 资源通常采用流水线结构,使得数据能够在多个阶段中依次处理,从而提高了数据吞吐量。同时,这些资源可以在不同的时间复用,例如,在一个多通道数字信号处理系统中,同一个 DSP 模块可以在不同的时钟周期处理不同通道的数据,提高了 FPGA 内部资源的利用率

 

通用寄存器组(GPR - General - Purpose Registers)

  • 功能
    • 用于存储操作数和运算结果。MIPS 通常有 32 个通用寄存器($0 - $31),不同的指令可以对这些寄存器进行读写操作。例如,算术指令(如addsub等)从通用寄存器中读取操作数,并将结果写回通用寄存器;加载 / 存储指令(如lwsw)则用于在通用寄存器和内存之间传输数据。
  • 运行规则
    • 每个通用寄存器都可以通过指令中的寄存器编号来指定。在指令译码阶段读取寄存器编号对应的寄存器值,在执行和写回阶段根据指令操作对寄存器进行写入操作。需要注意的是,$0寄存器通常被硬连线为0值,写入$0 寄存器的值会被忽略。

4. 数据存储器地址寄存器(MAR - Memory Address Register)

  • 功能
    • 在执行加载 / 存储指令时,用于存储要访问的内存地址。对于lw指令,MAR 存储从基地址寄存器和偏移量计算得到的内存读取地址;对于sw指令,MAR 存储从基地址寄存器和偏移量计算得到的内存写入地址。
  • 运行规则
    • 在执行阶段计算出内存访问地址后,将地址存入 MAR,访存阶段根据 MAR 中的地址进行内存读写操作。

5. 数据存储器缓冲寄存器(MBR - Memory Buffer Register)

  • 功能
    • 在加载指令(lw)时,用于暂存从内存中读取的数据,在写回阶段将数据从 MBR 写入目的寄存器;在存储指令(sw)时,用于暂存要写入内存的数据。
  • 运行规则
    • 在访存阶段,对于lw指令,将从内存读取的数据存入 MBR;对于sw指令,将源寄存器中的数据存入 MBR,然后将 MBR 中的数据写入内存。

6. 条件码寄存器(CCR - Condition Code Register)

  • 功能
    • 用于存储算术和逻辑运算结果的相关状态信息,如零标志(Z - 结果是否为 0)、符号标志(N - 结果的符号位)、溢出标志(V - 运算是否溢出)等。这些标志可以被条件分支指令(如beq根据零标志判断是否跳转,blt根据符号标志和溢出标志判断是否跳转等)所使用。
  • 运行规则
    • 在执行算术或逻辑运算指令后,根据运算结果更新 CCR 中的相应标志位。例如,执行add指令后,如果结果为 0,则 Z 标志被置 1;如果结果的第 31 位为 1,则 N 标志被置 1;如果加法运算发生溢出,则 V 标志被置 1。

这些寄存器在 MIPS 五级流水线中相互协作,确保指令的正确执行。程序计数器用于获取指令,指令寄存器用于暂存和译码指令,通用寄存器用于操作数和结果存储,数据存储器相关寄存器用于内存访问操作,条件码寄存器用于存储运算状态供条件分支指令使用

  1. 地址最低有效位(LSB)的作用

    • 在 MIPS 指令集中,内存是按字节编址的。对于 32 位的字,地址的最低 2 位(addr[1:0])用于确定在一个 32 位字中的具体位置。
    • 例如,当进行半字(16 位)访问时,addr[1:0]的值就很关键。如果addr[1:0] = 0010,表示访问的半字是字中的低半字(地址对齐到半字边界);如果addr[1:0] = 0111,表示访问的是字中的高半字。
    • 对于字节访问,addr[1:0]的四种可能取值(00011011)分别对应 32 位字中的四个字节,从最低有效字节开始编号为 0 - 3。
  2. 访存指令中的选择信号(sel)

    • 在代码中,通过sel信号来选择要操作 32 位数据中的哪部分。
    • 以存储字节(SB)指令为例,根据addr[1:0]的值来设置sel。如addr[1:0] = 00时,sel <= 4'b0001,表示选择 32 位数据中的最低字节进行存储;当addr[1:0] = 01时,sel <= 4'b0010,选择第二个字节进行存储,以此类推。
    • 对于存储半字(SH)指令,同样根据addr[1:0]来确定seladdr[1:0] = 00时,sel <= 4'b0011,表示选择 32 位数据中的低半字(两个字节)进行存储;addr[1:0] = 10时,sel <= 4'b1100,选择高半字进行存储。

  • 字节加载(LB)
    • 在 MIPS 架构中,字节(Byte)的长度是 8 位。由于内存是按字节编址的,所以字节加载指令(LB)无论从哪个字节地址进行加载操作都是自然对齐的。也就是说,每个字节都有自己独立的地址,字节加载指令可以从任何字节地址获取一个完整的 8 位字节数据,不会出现跨越字边界或者半字边界导致数据错误的情况。

  • 半字加载(LH)
    • 半字(Half - Word)的长度是 16 位。半字数据在内存中的存储应该是按照半字边界对齐的,即半字的起始地址应该是 2 的倍数(在字节编址的情况下,地址最低位为 0)。这样规定是为了方便硬件实现高效的访问。如果半字加载指令(LH)的地址最低位不为 0,就意味着这个半字跨越了字(32 位)中的两个半字部分,硬件在读取数据时可能会出现错误或者需要更复杂的操作来拼接数据。

  • 符号扩展:当把一个有符号数从较小的位宽转换为较大的位宽时,为了保持数值不变,需要进行符号扩展。其原则是用原数的符号位(最高位)填充扩展后的高位部分。例如,对于一个 8 位有符号数10001010(最高位为 1,表示负数),将其扩展为 16 位时,应该扩展为1111111110001010,即使用原数的符号位 1 填充高 8 位。符号扩展的目的是确保在不同位宽下,有符号数的数学表示和运算结果是一致的。
  • 零扩展:当把一个无符号数从较小的位宽转换为较大的位宽时,使用零扩展。其操作是用 0 填充扩展后的高位部分。例如,对于一个 8 位无符号数00001010,将其扩展为 16 位时,扩展为0000000000001010,简单地在高位添加 0,因为无符号数没有符号位的概念,高位添 0 不会改变其数值。

b,h,w


http://www.kler.cn/a/468656.html

相关文章:

  • Backend - EF Core(C# 操作数据库 DB)
  • jenkins入门7 --发送邮件1
  • 网络层协议之IP数据包层分片随笔
  • 前端小案例——520表白信封
  • 软件工程期末复习(一)
  • 30分钟学会css
  • springboot优先级和ThreadLocal
  • Docker, Moby, Containers
  • Tailwind CSS 实战:深色模式设计与实现
  • Coroutine 基础八 —— Flow 操作符(二)
  • CPT203 Software Engineering 软件工程 Pt.3 系统建模(中英双语)
  • 五月天TV 1.1.0 | 频道丰富的娱乐向电视直播应用
  • 使用大语言模型的生物嵌入,后续应该会有很多类似文章出来!
  • VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案
  • 信息系统管理师试题-人力资源
  • 高校教务系统登录页面JS分析——安徽大学
  • Level DB --- BloomFilterPolicy
  • List-顺序表--2
  • Go语言的 的泛型(Generics)核心知识
  • Eclipse Memory Analyzer (MAT)
  • MongoDB基本操作
  • 常见的反规范化技术
  • 在大型语言模型LLM中使用私有数据
  • Ansible之批量管理服务器
  • 高效撰写文献综述的指南:利用ChatGPT提升研究能力
  • CPU 100% 优化排查实战