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

【Verilog】布斯算法(Booth Algorithm)乘法器的 Verilog 实现

目录布斯算法介绍计算步骤计算流程图举个栗子Verilog 实现设计思想Verilog 代码TestBench 代码仿真波形布斯算法介绍Booth 的算法检查有符号二的补码表示中 N位乘数Y的相邻位对包括低于最低有效位y−1 0 的隐式位。对于每个位yi对于从 0 到N− 1 的i考虑位yi和yi−1。当这两个位相等时乘积累加器P保持不变。其中yi 0 且yi−1 1乘以 2i添加到P;其中yi 1 且yi−1 0则从P中减去乘以 2i。P的最终值为有符号产品。未指定乘数和乘积的表示形式;通常这些也都在二的补码表示中就像乘数一样但是任何支持加法和减法的数字系统也可以工作。如此处所述步骤的顺序尚未确定。通常它从LSB到MSB从i 0开始;然后乘以2i通常被P累加器在步长之间向右的增量移位所取代;低位可以移出然后可以在P的最高N位上进行后续的加法和减法。该算法通常被描述为将乘数中 1 的字符串转换为字符串末端的高阶 1 和低阶 −1。当字符串通过 MSB 运行时没有高阶 1并且净效应被解释为相应值的负数。计算步骤使用的寄存器AMQQresQres是Q右移后的残余位n计数器第 1 步加载寄存器的初始值。A 0累加器Qres 0M 乘法Q 乘法器n是等于乘法器位数的计数值。第 2 步检查 {Q0Qres} 的值。如果为 00 或 11请转到步骤 5。如果为01转到步骤3。如果为 10转到步骤 4。第 3 步执行 A A M转到步骤 5。第 4 步执行 A A - M。第 5 步执行 {AQQres} 的算术位移和递减计数。第 6 步检查计数器值 n 是否为零。如果是请转到下一步。否则转到步骤 2。第 7 步停止计算输出计算结果。计算流程图以下是布斯计算的流程图从图中可以清楚的看出计算的过程简单的来说就是判定乘数的最低位和次低位如果两位相同则直接执行移位操作如果两者不同如为“10”则将原始值减去被乘数如为“01”则将原始值加上被乘数举个栗子下面就以被乘数为6乘数为-4为例做一个计算过程的举例。将所有寄存器初始化累加器A初始化为0乘数加载寄存最低位移出位设定位0。判定最低位和移出位为“00”不进行加减操作将结果结果值右移一位。判定最低位和移出位为“00”不进行加减操作将结果结果值右移一位。判定最低位和移出位为“10”对累加器减去被乘数并将结果结果值右移一位注意此时累加器A为负数。判定最低位和移出位为“10”不进行加减操作将结果结果值右移一位此时累加器为负数因此右移最高位补1。判定最低位和移出位为“10”不进行加减操作将结果结果值右移一位此时累加器为负数因此右移最高位补1。计数器为0表示计算完成停止计算并输出计算结果值。Verilog 实现设计思想总的来说和上面提到的计算步骤是一致的利用三段状态机实现分别为空闲状态、计算状态和完成状态其中空闲状态等待开始计算信号的到来计算状态完成布斯计算步骤完成状态输出结果数据以及同步的有效标志信号。Verilog 代码/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* Engineer : Linest-5 /* File : booth_multiple.v /* Create : 2022-08-27 16:40:34 /* Revise : 2022-08-27 16:40:34 /* Module Name : booth_multiple /* Description : 基于布斯算法的乘法器设计 /* Editor : sublime text3, tab size (4) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ module booth_multiple( input clk, input rst, input start, input signed [3:0] X, input signed [3:0] Y, output reg signed [7:0] Z, output valid ); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* 参数和信号申明 */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ parameter IDLE 3b001; parameter CACULATE 3b010; parameter FINISH 3b100; reg [2:0] state; reg [2:0] next_state; reg [1:0] q_reg; //右移最后两位寄存 reg [2:0] cnt; //右移次数计数信号 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* 三段状态机 */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //状态机第一段状态初始化时序逻辑非阻塞赋值 always (posedge clk or posedge rst) begin if (rst) begin state IDLE; end else begin state next_state; end end //状态机第二段状态跳转组合逻辑阻塞赋值 always (*) begin next_state state; case(state) IDLE: begin if (start) begin next_state CACULATE; end else begin next_state IDLE; end end CACULATE: begin if (cnt d3) begin next_state FINISH; end else begin next_state CACULATE; end end FINISH: begin next_state IDLE; end endcase end //状态机第三段结果输出时序逻辑非阻塞赋值 always (posedge clk or posedge rst) begin if (rst) begin cnt d0; q_reg d0; Z d0; end else begin case(state) IDLE: begin cnt d0; q_reg {Y[cnt],1b0}; Z {4b0000,Y}; end CACULATE: begin cnt cnt d1; q_reg {Y[cnt1],Y[cnt]}; case(q_reg) 2b00,2b11: begin Z $signed(Z)1; end 2b10: begin Z $signed({Z[7:4]-X,Z[3:0]})1; end 2b01: begin Z $signed({Z[7:4]X,Z[3:0]})1; end endcase end FINISH: begin cnt d0; q_reg d0; Z Z; end endcase end end assign valid (stateFINISH); endmoduleTestBench 代码/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* Engineer : Linest-5 /* File : tb_booth_multiple.v /* Create : 2022-08-27 19:22:46 /* Revise : 2022-08-27 20:21:49 /* Module Name : tb_booth_multiple /* Description : 基于布斯算法的乘法器仿真模块 /* Editor : sublime text3, tab size (4) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ timescale 1ns/1ns module tb_booth_multiple(); reg clk; reg rst; reg start; reg signed [3:0] X; reg signed [3:0] Y; wire signed [7:0] Z; wire valid; initial begin clk d0; rst d1; #20 rst d0; end always #10 clk ~clk; initial begin #20 X 6; Y -4; start d0; #50 start d1; #20 start d0; #200 X 7; Y -5; start d1; #20 start d0; #200 X 7; Y 5; start d1; #20 start d0; end booth_multiple inst_booth_multiple ( .clk (clk), .rst (rst), .start (start), .X (X), .Y (Y), .Z (Z), .valid (valid) ); endmodule仿真波形分别进行有符号的乘法6和-4、7和-5、7和5可以看到仿真波形中正确的得到了计算结果并且有效标志信号也同步输出。验证成功

相关文章:

【Verilog】布斯算法(Booth Algorithm)乘法器的 Verilog 实现

目录 布斯算法介绍 计算步骤 计算流程图 举个栗子 Verilog 实现 设计思想 Verilog 代码 TestBench 代码 仿真波形 布斯算法介绍 Booth 的算法检查有符号二的补码表示中 N位乘数 Y 的相邻位对,包括低于最低有效位 y−1 0 的隐式位。对于每个位 yi&#xf…...

【HDLBits 刷题 13】Buliding Larger Circuits

目录 写在前面 Buliding Larger Circuits count1k shiftcount fsm seq fsmshift fsm fancytimer fsm onehot 写在前面 以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步! Buliding Larger …...

无符号类型给有符号类型赋值符号位的问题

记一次bug问题分析问题 再写modbus通信协议解析的时候遇到一个问题,计算CRC的时候返回值是一个unsigned short,接受的时候我定义的结构体里的CRC是一个有符号 short,也是头一次遇到有无符号位的问题。下面我把具体代码贴出来。 if(pModbusWr…...

【HDLBits 刷题 9】Circuits(5)Finite State Manchines 1-9

目录 写在前面 Finite State Manchines Fsm1 Fsm1s Fsm2 Fsm2s Fsm3comb Fsm3onehot Fsm3 Fsm3s Design a Moore FSM 写在前面 HDLBits 刷题来到了最为重要的一部分---有限状态机,都说 Verilog 设计的精髓就是状态机的设计,可见状态机设计的重…...

【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 60060Hz,分别显示三种颜色。 实验环境 开发环境:vivado 2021.2 FPGA 器件&a…...

【接口协议】FPGA 驱动 VGA 显示实验(一)原理部分

目录 VGA介绍 VGA 接口管脚 VGA 色彩原理 VGA 工作原理 VGA 时序 VGA介绍 VGA(Video Graphics Array)视频图形阵列是 IBM 于 1987 年提出的一个使用模拟信号的电脑显示标准。VGA 接口即电脑采用 VGA 标准输出数据的专用接口。VGA 接口共有 15 针&am…...

COMSOL单相变压器温度场三维模型:解析热点温度与流体流速分布

comsol单相变压器温度场三维模型,可以得到变压器热点温度,流体流速分布 搞变压器温度场仿真最头疼的就是三维流固耦合。去年做配电变压器温升项目时,硬是跟COMSOL死磕了两周才摸到门道。今天给大家分享下怎么用非等温流接口抓取热点温度和油…...

【牛客网刷题】VL3 奇偶校验

👉 写在前面 👉 本系列博客记录牛客网刷题记录 👉 日拱一卒,功不唐捐! 目录 题目描述 奇偶校验 题目分析 仿真结果 题目描述 现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验&a…...

【牛客网刷题】VL2 异步复位的串联T触发器

👉 写在前面 👉 本系列博客记录牛客网刷题记录 👉 日拱一卒,功不唐捐! 目录 题目描述 题目分析 Verilog 代码 testbench 代码 仿真结果 题目描述 用verilog实现两个串联的异步复位的T触发器的逻辑&#x…...

minio安装 后台自启动

1:下载miniowget https://dl.min.io/server/minio/release/linux-amd64/minio2:授权chmod x minio3:设置开机自启动进入该目录下cd /etc/systemd/system/ 创建minio.service文件1: cd /etc/systemd/system/ 2:touch mi…...

【BBF系列协议】Data Models Library数据模型库设计与实现

目录Data Models Library (dmlib)dmlib的设计dmlib 的代码结构:dmlib 主要数据结构操作上下文对象(dmctx)对象定义(DMOBJ)参数定义(DMLEAF)多实例遍历函数实现(browseinstobj)参数树…...

基于JS实现的鸿蒙游戏——二十四点纸牌

目录 前言 概述 正式开始 一、创建项目 二、编码 1.项目结构 2.实现思路 3.主要代码块 三、页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩过纸牌游戏,本项目是基于JS实现的鸿蒙小游戏二十四点纸牌&…...

vue截取字符串(商城系统非常常用的小知识)

1.截取指定字符串{{row.real_name.substr(2, 3)}}2.截取字符串最后一位{{row.real_name.charAt(row.real_name.length - 1)}}3.看一下效果如何...

【BBF系列协议】TR-140 TR-069支持存储服务的设备的数据模型

目录TR-140 TR-069支持存储服务的设备的数据模型执行摘要1.目的和范围目的范围2 案例2.1 BASIC MANAGED STORAGE SERVICE(基本托管存储服务)2.2 REMOTE STORAGE BACK-UP SERVICE(远程存储备份服务)2.3 Remote access of Storage S…...

【BBF系列协议】TR-135 支持TR-069的STB的数据模型

TR-135 支持TR-069的STB的数据模型 执行摘要 TR-135,启用TR-069的STB的数据模型,定义了用于通过TR-069和TR-106中定义的CWMP远程管理机顶盒(STB)设备上的数字电视(IPTV或广播)功能的数据模型。它包括用于…...

【BBF系列协议】TR-106 CWMP端点和USP代理的数据模型模板

目录TR-106 CWMP端点和USP代理的数据模型模板执行摘要1 介绍CWMPUSP规范结构2 架构2.1 数据层次结构2.2 对象版本控制2.3 配置文件2.4 DEPRECATED 和 OBSOLETED 条目3 对象定义3.1 通用符号3.2 数据类型和表示3.3 供应商特定要素A参数:单个实例对象:单个命令:单个事…...

【亲测免费】【推荐】基于Vue3的全能H5模板:vue3-h5-template

标题:【推荐】基于Vue3的全能H5模板:vue3-h5-template 【免费下载链接】vue3-h5-template My starter template for Vue3, with vite, quark design, sass(含viewport 适配方案, axios 封装) 项目地址: https://gitcode.com/gh_mirrors/vue3/vue3-h5-t…...

Scalding执行模型揭秘:从Job到Execution的演进之路

Scalding执行模型揭秘:从Job到Execution的演进之路 【免费下载链接】scalding A Scala API for Cascading 项目地址: https://gitcode.com/gh_mirrors/sc/scalding Scalding是一个基于Scala的Cascading API,专为大规模数据处理而设计。这个强大的…...

探索DockerGS:一键启动动漫游戏服务器的利器

探索DockerGS:一键启动动漫游戏服务器的利器 【免费下载链接】DockerGS DockerGC is a container that run Grasscutter (anime game) with just a single command. 项目地址: https://gitcode.com/gh_mirrors/do/DockerGS 在数字娱乐的世界中,各…...

推荐项目:IdentityServer4.AccessTokenValidation - 混合型JWT和参考令牌验证利器

推荐项目:IdentityServer4.AccessTokenValidation - 混合型JWT和参考令牌验证利器 【免费下载链接】IdentityServer4.AccessTokenValidation IdentityServer Access Token Validation for ASP.NET Core 项目地址: https://gitcode.com/gh_mirrors/id/IdentityServ…...

推荐:用Flowershow打造你的优雅知识分享网站

推荐:用Flowershow打造你的优雅知识分享网站 【免费下载链接】flowershow 💐 Publish your obsidian digital garden or any markdown site easily and elegantly. 项目地址: https://gitcode.com/gh_mirrors/fl/flowershow 1、项目介绍 &#x…...

RITM 交互式分割项目使用教程

RITM 交互式分割项目使用教程 【免费下载链接】ritm_interactive_segmentation 项目地址: https://gitcode.com/gh_mirrors/rit/ritm_interactive_segmentation 1. 项目的目录结构及介绍 RITM 交互式分割项目的目录结构如下: ritm_interactive_segmentati…...

RITM交互式分割算法实战指南

RITM交互式分割算法实战指南 【免费下载链接】ritm_interactive_segmentation 项目地址: https://gitcode.com/gh_mirrors/rit/ritm_interactive_segmentation 项目介绍 RITM(Real-Time Interactive Image Segmentation with Memory-Augmented U-Net&#…...

从论文到代码:Performer核心公式的PyTorch逐行实现

从论文到代码:Performer核心公式的PyTorch逐行实现 【免费下载链接】performer-pytorch An implementation of Performer, a linear attention-based transformer, in Pytorch 项目地址: https://gitcode.com/gh_mirrors/pe/performer-pytorch Performer是一…...

Jupyter Notify 使用教程

Jupyter Notify 使用教程 【免费下载链接】jupyter-notify A Jupyter Notebook magic for browser notifications of cell completion 项目地址: https://gitcode.com/gh_mirrors/ju/jupyter-notify 项目介绍 Jupyter Notify 是一个为 Jupyter Notebook 设计的扩展&…...

react-shimmer自定义加载效果:打造属于你的独特加载动画

react-shimmer自定义加载效果:打造属于你的独特加载动画 【免费下载链接】react-shimmer 🌠 Async loading, performant Image component for React.js 项目地址: https://gitcode.com/gh_mirrors/re/react-shimmer react-shimmer是一个为React.j…...

diffvg底层原理揭秘:可微光栅化技术如何让矢量图形支持梯度下降优化

diffvg底层原理揭秘:可微光栅化技术如何让矢量图形支持梯度下降优化 【免费下载链接】diffvg Differentiable Vector Graphics Rasterization 项目地址: https://gitcode.com/gh_mirrors/di/diffvg diffvg是一个创新的开源项目,它实现了可微矢量图…...

系统颜色选择器:macOS 的色彩控制强化版

系统颜色选择器:macOS 的色彩控制强化版 【免费下载链接】System-Color-Picker 🎨 The macOS color picker as an app with more features 项目地址: https://gitcode.com/gh_mirrors/sy/System-Color-Picker 项目介绍 🎨 系统颜色选…...

微型Lisp开源项目指南

微型Lisp开源项目指南 【免费下载链接】micro-lisp 🎄A very small Lisp programming language 😀that used to be under 200 lines of C🎄 项目地址: https://gitcode.com/gh_mirrors/mi/micro-lisp 项目介绍 🌟 微型Lis…...

RLS历史回顾:Rust IDE工具链的演进之路

RLS历史回顾:Rust IDE工具链的演进之路 【免费下载链接】rls Repository for the Rust Language Server (aka RLS) 项目地址: https://gitcode.com/gh_mirrors/rl/rls 作为Rust语言的官方IDE工具链,RLS(Rust Language Server&#xff…...