首页 > 其他分享 >ALU模块设计

ALU模块设计

时间:2023-06-23 13:22:41浏览次数:36  
标签:SLAVE EXEC FIFO rd inst 模块 设计 ALU

  • 该文章主要记录ALU-DMA系统设计中ALU的设计点。

1. ALU_TOP架构

  • 主要包含四个模块
    • ALU_RF:主要由一个深度为16,宽度为32bits的双端口RAM组成。主要用于存放ALU中操作数。
    • ALU_EXEC:主要根据输入的inst进行运算,执行乘法、加法,减法,与,或,异或,异或非等运算。
    • ALU_FIFO:主要用于缓存ALU_SLAVE输出的指令以及ALU_EXEC输出的运算结果。
    • ALU_SLAVE:根据ALU_TOP的输入s_din和s_addr以及一些控制信号s_sel等,产生其它模块的控制信号,以及ALU_TOP层的数据输出和中断。

2. ALU_SLAVE

  • s_addr设置不同的值,s_din输入值所代表含义如下。
s_addr value s_din
[7:0] 8'h00 OPERATION_START
[7:0] 8'h01 INTERRUPT
[7:0] 8'h02 INTERRUPT_ENABLE
[7:0] 8'h03 INSTRUCTION
[7:0] 8'h04 ALU_READ
[7:0] 8'h05 ALU_STATUS
[7:0] 8'h1x ALU_RF
  • 根据s_addr和s_sel,s_wr信号进行RF模块的读写、FIFO中reslut的读操作和inst的写操作。
  • 根据s_addr和s_in的值产生一些状态控制信号如:op_start,opdone_clear,以用于ALU_EXEC中;还有中断信号s_interrupt。

3. ALU_RF

  • 该模块有3个读地址和1个写地址;
    • 写相关信号由ALU_SLAVE提供,主要根据s_addr判断为读写寄存器模式,根据s_wr判断是写/读。对于写,SLAVE提供写地址、写数据以及写使能信号。
    • RF内部根据waddr进行译码&写使能信号,选通寄存器,进行写入。
    • 读地址根据来源分为两种,一种为ALU_SLAVE发出的,读出数据直接输出ALU_TOP;另一种为ALU_EXEC发出的,读出数据作为ALU运算的操作数。
    • 前者,根据SLAVE的读写使能信号we以及raddr进行读取数据。至于为什么要设计直接读出寄存器值的功能,我认为是为了在系统工作异常时可以检测RF模块是否出错。
    • 后者,根据EXEC模块给的rd_en和rADDR1、rADDR2来取数据。

4. ALU_EXEC

  • 首先介绍3中的rd_en信号和rADDR1、rADDR2。
    • rd_en是由EXEC中next_state判断的,当下一状态是MUL/EXEC时,需要准备好运算的操作数,所以将RF的读使能信号拉高。
    • 两个操作数的地址是根据inst进行译码得到的,不仅可以得到操作数地址,还可以得到位移量shamt,以及执行那个运算的操作码opcode。主要映射关系如下代码所示:
    assign opcode = inst[13:10];
    assign opAaddr = inst[9:6];
    assign opBaddr = inst[5:2];
    assign shamt = inst[1:0];
    
  • ALU_EXEC中主要进行读取指令,运算,输出结果等操作,通过状态机来实现。
    • 首先判断FIFO的rd_err_result、wr_err_inst信号是否拉高,两者分别为SLAVE读FIFO的result和向FIFO中写inst信号,如果SLAVE与FIFO的交互发生问题,那么需要将状态拉到FAULT。
    • IDLE:起始状态,什么都不做;从该状态跳出进入INST_POP1需要使用ALU_SLAVE提供的op_start信号。
    • INST_POP1:该状态主要做的任务是处理从FIFO中读出指令。
      • (1)首先如果FIFO反馈的rd_err_inst信号拉高,即读指令发生问题,那么状态会跳到FAULT中,不继续操作。
      • (2)如果FIFO反馈的rd_ack_inst信号拉高,即从FIFO中读出新的指令,那么根据opcode分为三种情况:NOP:没有操作、MUL:乘法操作、EXEC:基础运算操作。
      • (3)如果rd_ack_inst信号如果为0,说明没有读到,便仍在INST_POP1阶段。
    • NOP: 没有操作停留一周期,直接跳到INST_POP2状态,再次读取指令。
    • EXEC:在此前一阶段,已经拿到了操作数A,B;在这阶段花一个周期计算,并跳转到RESULT_PUSH1状态。
    • MUL:直到mul_done信号被拉高,表示乘法运算结束后,跳到RESULT_PUSH1状态。否则没计算完成,保持MUL状态。
    • RESULT_PUSH1:判断向FIFO中写result是否出错,如果wr_err_result拉高,状态跳到FAULT。如果没有出错,则会跳到RESULT_PUSH2阶段。
    • RESULT_PUSH2:下一状态为INST_POP2.需要连续两个RESULT_PUSH阶段,我认为是因为EXEC和MUL阶段输出结果为64bit,需要分两个周期(每周期能传输32bit数据,所以划分了两个连续状态)传输一个完整的数据。
    • INST_POP2:
      • 这一步再次判断rd_err_inst是否被拉高,如果被拉高,说明FIFO中所有指令都被读取完毕,那么执行结束,进入EXEC_DONE状态。区分于INST_POP1中的(1),那次的rd_err_inst判断是最开始读指令时,防止FIFO设计错误,或ALU_SLAVE写入inst错误,导致FIFO中为空;若最开始检测没有问题,那么rd_err_inst的再次拉高就证明时FIFO中的指令都被读完,而不是设计错误.
      • 如果rd_err_inst未被拉高,则再次进入INST_POP1的步骤(2)(3)。
    • EXEC_DONE:如果opdone_clear信号被拉高,则状态机回到最开始的状态IDLE。如果未被拉高,则一直保持执行完毕的状态。
    • FAULT:错误阶段,停留在该阶段,还没有写跳出FAULT的处理,会导致死循环。
  • ALU_calculation
    • 首先需要对输入的两个操作数opA和opB做符号扩展,得到opA_s和opB_s,由32bits扩展为64bits。之后用opA_s和opB_s做EXEC中的操作。并根据op_code将计算后的值赋值给64bits的temp变量。
    • 对result的赋值,首先在RESULT_PUSH1阶段将temp的高32bit符号位给出,这个阶段会首先判断FIFO是否已经满了,如果满了还要往里面写,就会跳转到FAIL状态。如果FIFO没满,还可以继续写.高32bit和低32bit分两个周期给出。
  • ALU_multiplier
    • 具体的运算实现,后续文章介绍。

5. ALU_FIFO

  • 模块包括指令INST_FIFO和运算结果RESULT_FIFO。
  • INST_FIFO
    • 对于inst的读取,需要拿到ALU_EXEC的读使能信号rd_en_inst.
      • 在ALU_EXEC模块中,只有state为INST_POP1或INST_POP2时,rd_en_inst = 1.
    • 对于inst的写入,需要拿到ALU_SLAVE输出的写使能信号wr_en_inst.主要由s_addr决定是否为指令写模式。
  • RESULT_FIFO
    • 输入来自于ALU_EXEC的计算结果result输出;FIFO输出作为ALU_SLAVE的输入,内部mux选通输出到s_dout.
    • 对于FIFO中result的读取,需要拿到ALU_SLAVE的读使能信号rd_en_result.在s_addr[7:0]= 4时,拉高读使能信号。
    • 对于FIFO中result的写入,需要拿到ALU_EXEC的写使能信号wr_en_result,在state为RESULT_PUSH1和RESULT_PUSH2时,拉高写使能信号。
  • FIFO具体设计以及对满,空的处理后续文章介绍。

标签:SLAVE,EXEC,FIFO,rd,inst,模块,设计,ALU
From: https://www.cnblogs.com/qianbinbin/p/17498930.html

相关文章

  • C++面向对象技术与C++课程设计任务书[2023-06-23]
    C++面向对象技术与C++课程设计任务书[2023-06-23]面向对象技术与C++课程设计任务书题目1 小型学籍管理系统班级 21060101~02 指导教师 耿军雪姓名 学号 地点 G1-203 完成时间 2023/6/262023/6/30【目的与要求】1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基......
  • zemax光学设计-案例5-一个fTheta透镜与坐标断点
    案例5–f-theta透镜与坐标断点1、波长632nm2、ENPD=50mm3、F#=34、扫描角度10deg5、双胶合BK7+F26、视场0°即可目标:学习坐标断点(旋转反射镜改变光束位置)多重结构组态中,附加数据#:3(选择第三个面的第三个参数作为parameter)优化:由于只是学习目标断......
  • zemax光学设计-案例1-单透镜指标
    案例1–单透镜1、使用FdC光2、ENPD=25mm3、F/#=4则EFFL=4*25=100mm4、FOV=05、材料BK7目标:学习查看Rayfan和Spot优化前:变量与优化函数:优化前后对比优化前点列图:像差二、使用非球面透镜进行优化使用变量与优化前后MTF索雷博......
  • zemax光学设计-案例2-双胶合Doublet
    案例2–双胶合透镜1、使用FdC光2、ENPD=50mm3、F/#=8(相对孔径倒数)4、FOV=105、玻璃最小边缘厚度和中心厚度4mm,最大中心厚度为18mm6、正透镜用缅玻璃,负透镜用火石玻璃分别使用的是BK7+F2以及将玻璃材料选为替换作为变量后优化(局部和锤形->局部+最优)观察......
  • 任务划分、任务设计、中断服务程序设计
    参考文章地址......
  • 模块化和组件化的含义及区别
    1、模块化【代码逻辑角度划分】用于保证每个模块的只能单一比如药品管理,就是一个模块,包含了列表,添加,修改,删除;2、组件化【UI界面角度划分】页面上的每个独立区域,都可作为一个组件,便于组件复用3、区别划分角度不同4、为什么要使用模块化和组件化开发和调试的效率更高......
  • iOS 微信、支付宝、银联支付组件的进一步设计
    原文地址:https://zhanglei.blog.csdn.net/article/details/121376500前言有段时间没写技术文章了,一是因为工作太忙,再者因为本人文笔实在一般。最近终于闲下来,本着分享的目的将一些组件设计上的心得与大家分享。本篇文章是基于原有一篇关于支付文章的进一步优化设计,所以在阅读本......
  • SpringCloud Alibaba入门1-创建多模块工程
    一、创建父项目创建一个Maven的父项目,命名为mymall用于管理子项目。项目创建完成后,删除src目录和在pom.xml文件里面设置packing的方式为pom,管理其他子模块的依赖。删除之后的项目结构为:二、创建子module在父项目上右键,新建module,命令为mymall-common,然后创建子模块创建子模块成......
  • [连载]Java程序设计(05)---任务驱动方式:简单的加密/解密系统
    任务:还是上一家公司,现在该公司在全国各地都设立了自己的分公司以拓展其核心业务,那么就需要利用互联网在全国各地的公司之间传递信息(我们假定这些信息就是文字信息),这些信息可能涉及一些商业机密,为此公司需要一套简单的加密和解密系统来避免直接在互联网上传递明文信息。目前拟定了两......
  • nginx 的模块及处理流程
        nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。这样的模块化设计类似于面向对象中的接口类,它增强了nginx源码的可读性、可扩充性和可维护性。nginx的4种角色模块Nginx模块主要有......