基于radix4的booth乘法器设计

下述乘法器是基于radix 4的booth乘法器,常用于集成电路IC的乘法器设计。

  1. 支持位宽可设置
  2. 支持signsign、signunsign、unsignsign、unsignunsign;
// +FHDR------------------------------------------------------------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
//                 Copyright (c) 2023 COMPANY: Undefined variable..
//                       ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename      : radix4_booth_mult.v
// Author        : 
// Created On    : 
// Last Modified : 
// -----------------------------------------------------------------
// Description:
//  radix 4 booth multipiler
//  operate a can be int or uint, if(int) ,sign <= 1'b1 ,else  sign <= 1'b0
//  when multipiler used independently , op_b_cin <= 1'b0;
//  when need to cascaded as WIDTH_A * (WIDTH_B*n) multipiler , op_b_cin <= (the highest bit of previous multipiler operate b)
//  
// -FHDR------------------------------------------------------------
module radix4_booth_mult #(parameter  WIDTH_A = 4,parameter  WIDTH_B = 8
)(input  wire                                            comp_en     //Take the complement of the calculation result,input  wire                                            sign_a      //operate a sign flag,1'b1->signed,1'b0->unsigned,input  wire                                            sign_b      //operate b sign flag,1'b1->signed,1'b0->unsigned,input  wire    [WIDTH_A-1:0]                           op_a        //operate a data input,input  wire    [WIDTH_B-1:0]                           op_b        //operate b data input,used to booth coding,input  wire                                            op_b_cin    //booth coding carry in,when multipiler cascaded,use the highest bit of previous multipiler operate b,output reg     [(WIDTH_A+WIDTH_B)*(WIDTH_B/2+2)-1:0]   prod        //wallace tree partial product output
);
//==============================================================================================
//======                                function                                        ========
//==============================================================================================//==============================================================================================
//======                                parameter                                       ========
//==============================================================================================localparam BOOTH_NUM = WIDTH_B/2;//==============================================================================================
//======                                define signal                                   ========
//==============================================================================================//reg                                             complement  ;reg                                             signed_a    ;reg                                             signed_b    ;reg     [WIDTH_A-1:0]                           operate_a   ;reg     [WIDTH_B:0]                             operate_b   ;wire    [2:0]                                   booth_code      [BOOTH_NUM-1:0] ;wire    [WIDTH_A+1:0]                           temp_prod       [BOOTH_NUM-1:0] ;wire    [BOOTH_NUM-1:0]                         temp_comp                       ;wire    [(WIDTH_A+WIDTH_B)*(BOOTH_NUM+2)-1:0]   prod_pre    ;//==============================================================================================
//======                            initialize signal                                   ========
//==============================================================================================//==============================================================================================
//======                               behave of RTL                                    ========
//==============================================================================================//--------------------------------------------------------------------//------            buffer the input signal                     ------//--------------------------------------------------------------------always@(*)begin//complement  = comp_en          ;signed_a    = sign_a           ;signed_b    = sign_b           ;operate_a   = op_a             ;operate_b   = {WIDTH_B+1{comp_en}}^{op_b,op_b_cin}  ;end//--------------------------------------------------------------------//------                                                        ------//--------------------------------------------------------------------genvar i;generate for(i=0;i<BOOTH_NUM;i=i+1) begin: distribute_aassign booth_code[i] = operate_b[i*2 +: 3];//assign booth_code[i] = {3{complement}} ^ operate_b[i*2 +: 3];booth #(.WIDTH(WIDTH_A)) u_booth_0 (.sign     (signed_a        ),.code     (booth_code[i]   ),.src_data (operate_a       ),.out_data (temp_prod[i]    ),.out_inv  (temp_comp[i]    ));assign prod_pre[(WIDTH_A+WIDTH_B)*i +: WIDTH_A+WIDTH_B] = {{(WIDTH_A+WIDTH_B-2*i-1){1'b0}},temp_prod[i],{2*i{1'b0}}};assign prod_pre[(WIDTH_A+WIDTH_B)*BOOTH_NUM + 2*i +: 2] = {1'b0,temp_comp[i]};end endgenerateassign prod_pre[(WIDTH_A+WIDTH_B)*BOOTH_NUM + WIDTH_B +: WIDTH_A] = (signed_b|(~operate_b[WIDTH_B]))? {WIDTH_A{1'b0}} : operate_a;assign prod_pre[(WIDTH_A+WIDTH_B)*(BOOTH_NUM+1) +: WIDTH_A+WIDTH_B] = {{BOOTH_NUM-1{2'b01}},2'b10,{WIDTH_A{1'b0}}};//--------------------------------------------------------------------//------                                                        ------//--------------------------------------------------------------------always@(prod or prod_pre)beginprod = prod_pre   ;end
endmodule//*******************************************************************************************//
//
//*******************************************************************************************//
// +FHDR------------------------------------------------------------
//                 Copyright (c) 2023 COMPANY: Undefined variable..
//                       ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename      : booth.v
// Author        : 
// Created On    : 
// Last Modified : 
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------module booth #(parameter  WIDTH = 8
) (input                  sign,input      [2:0]       code,input      [WIDTH-1:0] src_data,output reg [WIDTH+1:0] out_data,output reg             out_inv
);
//==============================================================================================
//======                                function                                        ========
//==============================================================================================//==============================================================================================
//======                                parameter                                       ========
//==============================================================================================//==============================================================================================
//======                                define signal                                   ========
//==============================================================================================wire    [WIDTH:0]   data_in ;//==============================================================================================
//======                            initialize signal                                   ========
//==============================================================================================//==============================================================================================
//======                               behave of RTL                                    ========
//==============================================================================================assign data_in = {sign&src_data[WIDTH-1],src_data};always @(*) begincase(code)// +/- 0*src_data3'b000,3'b111:beginout_data = {1'h1,{WIDTH+1{1'h0}}};out_inv = 1'b0;end// + 1*src_data3'b001,3'b010:beginout_data = {~data_in[WIDTH], data_in};out_inv = 1'b0;end// - 1*src_data3'b101,3'b110:beginout_data = { data_in[WIDTH],~data_in};out_inv = 1'b1;end// + 2*src_data3'b011:beginout_data = {~data_in[WIDTH], data_in[WIDTH-1:0], 1'b0};out_inv = 1'b0;end// - 2*src_data3'b100:beginout_data = { data_in[WIDTH],~data_in[WIDTH-1:0], 1'b1};out_inv = 1'b1;enddefault:beginout_data = {1'h1,{WIDTH+1{1'h0}}};out_inv = 1'b0;endendcaseendendmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

降雨量预测 | Matlab基于ARIMA-RBF降雨量预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 降雨量预测 | Matlab基于ARIMA-RBF降雨量预测 注&#xff1a;程序和数据放在一个文件夹。 程序语言为matlab&#xff0c;程序可出预测效果图&#xff0c;指标图; 代码特点&#xff1a;参数化编程、参数可方便更改、代…

web前端学习笔记Day02

web学习Day02 一、页面布局 盒子模型 盒子将页面的所有标签都包含在了一个矩形区域content(内容区域)->padding(内边距区域)->border(边框区域)->margin(外边距区域) div标签: 一行只能显示一个&#xff08;独占一行&#xff09;width默认为父元素宽度&#xff0c…

Docker核心技术:Docker原理之Namespace

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Namespace&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1…

多模态AI:概念、用例、优势、挑战及发展未来

多模态实际上是在尝试复制人类的感知方式&#xff1a;我们将视觉、声音和触觉等感官输入结合起来&#xff0c;形成对现实的更细致入微的感知&#xff0c;并利用这些数据来做出决定或采取行动。多模态模式也在尝试做同样的事情。 多模态AI的应用范围正在不断扩大&#xff0c;那么…

【Spring】深入理解了IOC(控制反转)和DI(依赖注入)

学习时间&#xff1a;09&#xff1a;XX--10&#xff1a;28&#xff0c;50min 微信读书 今日学习Spring框架&#xff0c;有很大的收获&#xff0c;感觉是学习SpringBoot以来的一个里程碑&#xff0c;因为今天上午这50min理解了Spring框架的核心基础&#xff0c;控制反转&#x…

使用 useLazyAsyncData 提升数据加载体验

title: 使用 useLazyAsyncData 提升数据加载体验 date: 2024/7/19 updated: 2024/7/19 author: cmdragon excerpt: 摘要&#xff1a;本文介绍useLazyAsyncData函数在Nuxt 3中的使用&#xff0c;以提升数据加载体验。此函数支持异步获取数据并在组件中处理挂起与错误状态&…

生成式AI在IT领域的应用中,对产品,UI设计师,前端开发。后端开发,运维的影响?

生成式AI在IT领域的应用将对产品、UI设计师、前端开发、后端开发和运维等多个角色产生深远影响。 以下是对这些角色的具体影响、技术对比以及未来展望的分析&#xff1a; 产品经理 影响革新&#xff1a; 精准需求洞察&#xff1a;生成式AI深度挖掘市场数据与用户反馈&#xff0…

IOCTLance:一款针对x64 WDM驱动程序的漏洞检测工具

关于IOCTLance IOCTLance是一款针对x64 WDM驱动程序的漏洞检测工具&#xff0c;该工具来源于CODE BLUE 2023上展示的一个名为“使用符号执行和污点分析增强 WDM 驱动程序漏洞检测 ”的项目。该工具能够有效增强检测Windows驱动程序模型&#xff08;WDM&#xff09;驱动程序中各…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串&#xff0c;如下所示&#xff0c;a、b、c、d、e五个元素从左到右组成了一个有序的列表&#xff0c;列表中的…

标准IO中fopen函数返回的FILE*指针的存储位置

程序的内存分配&#xff1a; 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其 操作方式类似于数据结构中的栈。 …

软链接跟硬链接有什么区别

‌软连接和‌硬连接是‌linux文件系统中的两种不同类型的链接&#xff0c;它们的主要区别在于&#xff1a; 本质不同&#xff1a;硬连接是同一文件的不同名称&#xff0c;而软连接则指向另一个文件或目录的路径。硬连接与原始文件共享相同的inode信息&#xff0c;因此它们指向同…

微软史诗级的蓝屏

本周经历了微软的蓝屏&#xff0c;一直到周末还在加班处理公司的问题。 个人终端受到的影响较大&#xff0c;服务器上也受到了影响。因为蓝屏的事情导致不少麻烦&#xff0c;据同事说因为蓝屏的问题&#xff0c;MGH 的手术安排也受到了影响。 目前我们也在着手处理有部署 Wind…

【Apollo学习笔记】—— Cyber RT之创建组件, test ok

0. 前置知识 这部分内容详见第三章:Component组件认知与实践https://apollo.baidu.com/community/article/1103 0.1 什么是 Component Apollo 的 Cyber RT 框架是基于组件(component)概念来构建的。每个组件都是 Cyber RT 框架的一个特定的算法模块, 处理一组输入并产生其…

Leetcode 3227. Vowels Game in a String

Leetcode 3227. Vowels Game in a String 1. 解题思路2. 代码实现 题目链接&#xff1a;3227. Vowels Game in a String 1. 解题思路 这一题稍微分析一下之后就会发现&#xff0c;这个游戏有且只有一种情况Bob才能够赢&#xff0c;即原始字符串当中不存在元音字母的情况&…

算法:优先级队列(堆)

目录 题目一&#xff1a;最后一块石头重量 题目二&#xff1a;数据流中的第 K 大元素 题目三&#xff1a;前 K 个高频单词 题目四&#xff1a;数据流的中位数 题目一&#xff1a;最后一块石头重量 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c…

基于SpringBoot+Vue的网吧管理系统(带1w+文档)

基于SpringBootVue的网吧管理系统(带1w文档) 基于SpringBootVue的网吧管理系统(带1w文档) 网吧管理系统&#xff0c;为了随时随地查看网吧管理信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理网吧的方式方法&#xff0c;更提供了其他想要了解网吧管理信息及…

Unity如何使摄像机视锥体外的物体不被剔除

在默认情况下&#xff0c;Unity在渲染场景时会剔除掉摄像机视椎体以外的所有物体&#xff0c;这就会导致某些特殊情况下&#xff0c;我们希望显示在场景中的物体反而被剔除了&#xff0c;比如用Shader制作顶点动画时&#xff0c;如果物体本身的位置在摄像机以外&#xff0c;而顶…

【云原生】Prometheus 服务自动发现使用详解

目录 一、前言 二、Prometheus常规服务监控使用现状​​​​​​​ 2.1 Prometheus监控架构图 2.2 Prometheus服务自动发现的解决方案 三、Prometheus服务自动发现介绍 3.1 什么是Prometheus服务自动发现 3.2 Prometheus自动服务发现策略 3.3 Prometheus自动服务发现应用…

SQL39道常见题型

SQL1 查询所有列 现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果。 select * from user_profile 结果&#xff1a; SQL2 查询多列 还是上面那个输入&#xff0c;题目换成&#xff1a;现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#…

Springboot同时支持http和https访问

springboot默认是http的 一、支持https访问 需要生成证书&#xff0c;并配置到项目中。 1、证书 如果公司提供&#xff0c;则直接使用公司提供的证书&#xff1b; 如果公司没有提供&#xff0c;也可自己使用Java自带的命令keytool来生成&#xff1a; &#xff08;1&#x…