除法器的verilog实现
网上转载,参考链接:https://www.cnblogs.com/Dinging006/p/9382657.html
除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。
在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。即使可以综合,也需要比较多的资源。对于这种情况,一般使用相应的算法来实现除法,分为两类,基于减法操作和基于乘法操作的算法。
1.1 组合逻辑
基于减法的除法器的算法:
对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。
verilog代码:
module div
(
input[31:0] a,
input[31:0] b,
input enable,
output reg [31:0] yshang,
output reg [31:0] yyushu,
output reg done
); reg[31:0] tempa;
reg[31:0] tempb;
reg[63:0] temp_a;
reg[63:0] temp_b; integer i; always @(a or b)
begin tempa <= a; tempb <= b;
end always @(tempa or tempb)
begin
if(enable)begintemp_a = {32'h00000000,tempa}; temp_b = {tempb,32'h00000000}; done = 0; for(i = 0;i < 32;i = i + 1) begin temp_a = {temp_a[62:0],1'b0}; if(temp_a[63:32] >= tempb) temp_a = temp_a - temp_b + 1'b1; else temp_a = temp_a; end yshang = temp_a[31:0]; yyushu = temp_a[63:32]; done = 1; end
end endmodule
test_bench代码:
`timescale 1ns/1ns module test(); reg [31:0] a;
reg [31:0] b;
reg enable;
wire [31:0] yshang;
wire [31:0] yyushu;
wire done;
initial
begin
enable=1;#10 a = $random()%10000; b = $random()%1000; #100 a = $random()%1000; b = $random()%100; #100 a = $random()%100; b = $random()%10; #1000 $stop;
end div DIV_RILL
(
.a (a),
.b (b),
.enable(enable),
.yshang (yshang),
.yyushu (yyushu),
.done(done)
); endmodule
1.2时序逻辑
1)将组合逻辑改成时序逻辑,用32个clk实现计算。
2)计算位宽可以配置,具有扩展性。
附录:算法推倒(非原创):
假设4bit的两数相除 a/b,商和余数最多只有4位 (假设1101/0010也就是13除以2得6余1)
我们先自己做二进制除法,则首先看a的MSB,若比除数小则看前两位,大则减除数,然后看余数,以此类推直到最后看到LSB;而上述算法道理一样,a左移进前四位目的就在于从a本身的MSB开始看起,移4次则是看到LSB为止,期间若比除数大,则减去除数,注意减完以后正是此时所剩的余数。而商呢则加到了这个数的末尾,因为只要比除数大,商就是1,而商0则是直接左移了,因为会自动补0。这里比较巧因为商可以随此时的a继续左移,然后新的商会继续加到末尾。经过比对会发现移4位后左右两边分别就是余数和商。
画个简单的图:
verilog代码:
`timescale 1ns / 1ps
module div_rill #( parameter N=21)
(
input clk,
input rst,
input enable,
input [N-1:0] a,
input [N-1:0] b,
output reg [N-1:0] yshang,
output reg [N-1:0] yyushu,
output reg done
);
parameter S=N<<1;
reg[N-1:0] tempa;
reg[N-1:0] tempb;
reg[S-1:0] temp_a;
reg[S-1:0] temp_b;
reg [5:0] status;
parameter s_idle = 6'b000000;
parameter s_init = 6'b000001;
parameter s_calc1 = 6'b000010;
parameter s_calc2 = 6'b000100;
parameter s_done = 6'b001000;reg [N-1:0] i;always @(posedge clk)
beginif(rst)begini <= 21'h0;tempa <= 21'h1;tempb <= 21'h1;yshang <= 21'h1;yyushu <= 21'h1;done <= 1'b0;status <= s_idle;endelsebegincase (status)s_idle:beginif(enable)begintempa <= a;tempb <= b;status <= s_init;endelsebegini <= 21'h0;tempa <= 21'h1;tempb <= 21'h1;yshang <= 21'h1;yyushu <= 21'h1;done <= 1'b0;status <= s_idle;endends_init:begintemp_a <= {21'h00000000,tempa};temp_b <= {tempb,21'h00000000};status <= s_calc1;ends_calc1:beginif(i < N)begintemp_a <= {temp_a[S-2:0],1'b0};status <= s_calc2;endelsebeginstatus <= s_done;endends_calc2:beginif(temp_a[S-1:N] >= tempb)begintemp_a <= temp_a - temp_b + 1'b1;endelsebegintemp_a <= temp_a;endi <= i + 1'b1; status <= s_calc1;ends_done:beginyshang <= temp_a[N-1:0];yyushu <= temp_a[S-1:N];done <= 1'b1;status <= s_idle;enddefault:beginstatus <= s_idle;endendcaseendendendmodule
test_bench代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2018/07/27 22:16:33
// Design Name:
// Module Name: test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module test();reg clk;
reg rst;
reg enable;
reg [20:0] a;
reg [20:0] b;
wire [20:0] yshang;
wire [20:0] yyushu;
wire done;initial
beginclk = 0;#10rst = 1;#20rst = 0;#15enable =1;a = $random()%10000;b = $random()%1000;#10enable =0;#1000enable =1;a = $random()%1000;b = $random()%100;#10enable =0;#1000enable =1;a = $random()%100;b = $random()%10; #10enable =0;#1000 $stop;
endalways # 5 clk = ~clk;
always #1000 a=a+8;
always #1000 b=b+9;
div_rill DIV_RILL
(
.clk (clk),
.rst (rst),
.enable (enable),
.a (a),
.b (b),
.yshang (yshang),
.yyushu (yyushu),
.done (done)
);endmodule
结论:可以看出我们通常的设计中一般建议采用时序电路的实现方法而不是组合逻辑,虽然时序逻辑的实现方法会导致计算延时,但是因为组合逻辑占资源较多而且可能在时序约束部分出现错误,要远远大于延时的错误。
除法器的verilog实现相关推荐
- <Verilog实现除法器> Verilog实现不恢复余数(non-restoring)除法器
一,内容介绍 除法器是数字电路中的基础电路之一,也是CPU计算单元的核心功能之一.下面我们用verilog实现三种常用的除法器. Verilog实现恢复余数(restoring)除法器 目前:Veri ...
- FPGA实现除法器(verilog)
前言 Verilog语法中有"/"和"%"运算符,分别表示除法运算和取余运算,但是FPGA实现除法器时,是否可以直接使用这两个运算符呢?答案是否定的. FGPA ...
- <Verilog实现除法器> Verilog实现恢复余数(restoring)除法器
一,内容介绍 除法器是数字电路中的基础电路之一,也是CPU计算单元的核心功能之一.下面我们用verilog实现三种常用的除法器. 目前:Verilog实现恢复余数(restoring)除法器 Veri ...
- [转]常用数字处理算法的Verilog实现
2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自 ...
- 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现
2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自低位 ...
- 数字IC手撕代码--小米科技(除法器设计)
前言: 本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析.代码及波形,所有代码均经过本人验证. 目录如下: 1.数字IC手撕代码-分频器(任意偶数分频) 2.数字IC手 ...
- verilog基础设计8-小米2022数字ic笔试编程题 16bit数除以8bit数 rtl实现
目录 1.除法器原理 2.无符号的除法器的实现 3.书写tb 4.仿真结果分析 题目:除法器的verilog实现,16bit A,8bit B.C = A/B: 1.除法器原理 摘自别的博客,这里除法 ...
- 数字ic笔试2022小米提前批
单选题 (3分) 1.当一个乘法器需要10个cycle才能完成计算任务,对其需要设置multicycle,setup会设置为10,hold设置为() A.9 B.不需要设置 C.10 D.1 解.A ...
- verilog 除法器
verilog 除法器:利用二进制的除法翻译过来的硬件电路 1.1 实现算法 基于减法的除法器的算法: 对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位.首先将a转换成高32 ...
最新文章
- 利用T-SQL语句快速清理ZBLOG程序的SQL SERVER2012数据库内容
- jquery submit()不能提交表单的解决方法
- 再见乱码:5分钟读懂MySQL字符集设置
- STL源代码分析(ch 1)组态1
- 吐血整理:Java线程池源码分析(基于JDK1.8建议收藏)
- 为ActiveX制作数字签名 -- 介绍 (引)
- Android照片墙完整版,完美结合 内存方案 LruCache 和 硬盘方案 DiskLruCache
- swiper轮播插件的使用
- 超好看倒计时特效单页html模板源码下载
- STL之partial_sum
- 对象流java_Java中的对象流总结(必看篇)
- hdu 1284 钱币兑换问题
- 自学python编程免费教程-python编程入门 零基础学习Python基础(附带最新免费教程)...
- 杭电计算机接口实验报告,杭电新闻
- opengl画三维点_[500行代码学懂OpenGL]之一画点
- Android Scroll实现弹性滑动 一 列表下拉弹性滑动
- Spark开发环境的搭建(一)
- win2003 服务器设置 完全版 作者:冰盾防火墙
- LoRaWAN协议-物理层(PHY)详解
- python在园林中的应用_攀缘植物在园林中的应用
热门文章
- 【线性代数基础进阶】矩阵-part2
- 企业智能化转型“1+N”新范式
- Qoo10上7款月销售额在$10K的单品,你会选择卖什么?
- 88S5自己网站所许扩展笔记
- UBOOT学习之DDR3
- Longines浪琴手表型号解释
- 功能性癫痫中内在网络连接与精神症状严重程度的关系
- 留言提交成功页面html,织梦自定义表单自动获取用户IP、提交时间、留言页面的方法...
- 计算机类短视频论文,论新媒体环境下短视频平台的发展--以秒拍为例.docx
- 【青松资讯】2018年第四季度DDoS攻击报告