Verilog无符号除法器-状态机实现
目录
- 1、除法原理
- 2、除法代码
- 3、测试代码及结果
- 4、总结
在FPGA的开发过程当中,常见的加,减,乘都可以直接用对应的符号表示,用时序逻辑实现,而除法的运算不能直接使用" /" 符号,基于当除数为2的幂次方时,可以用简单的移位符号 " >>"实现,当除数任意时,就需要使用额外的IP模块,固定的算法实现了,除法算法分为两类,分别是基于减法操作和基于乘法操作的算法。此处使用基于减法操作实现除法。
1、除法原理
对于位宽为N位的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过N位。除法计算的步骤如下:
- 当信号使能信号为高,将a转换成高N位为0,低N位为a的temp_a;把b转换成高N位为b,低N位为0的temp_b。初始化迭代次数i=0,进入步骤2。
- 当迭代次数i<N时,将temp_a左移一位,末尾补0;否则,结束迭代运算。
- 将左移后的temp_a与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行,回到步骤2,继续迭代。
- 将输出使能 信号置1,商为temp_a的高N位,余数为temp_a的低N位。
将上述的四个步骤分别用状态机实现。
2、除法代码
/*******************************************************************
* ------------------- Module Specification ------------------------** * Name :divider** * Function :无符号除法,状态机实现优点:可以更给数据位宽来实现不同位宽的除法运算,代码复用性高缺点,运算速度较慢,** * Input :** * Output :** * author :彧芯** * Edit time:2021/04/25/17:01:56** *************************************************************/module divider #(
parameter N=8
)(
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 <= 0;tempa <= 0;tempb <= 1;yshang <= 0;yyushu <= 1;done <= 1'b0;temp_a <= 0;temp_b <= 0;status <= s_idle;endelsebegincase (status)s_idle:beginif(enable)begintempa <= a;tempb <= b;status <= s_init;endelsebegini <= 0;tempa <= 0;tempb <= 1;yshang <= 0;yyushu <= 1;done <= 1'b0;status <= s_idle;endends_init:begintemp_a <= {{N{1'b0}},tempa}; //此处0的个数和数据位宽一样temp_b <= {tempb,{N{1'b0}}};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] >= temp_b[S-1:N])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
3、测试代码及结果
`timescale 1 ns/1 ns
module tb();//parameters
parameter CYCLE = 20; //!Clock cycle, 20ns, where the clock cycle can be modified
parameter RST_TIME = 3 ; //Reset time, at this point represents the reset time of 3 clock cycles
localparam N = 8;
//Clock and reset signals
reg clk ;
reg rst_n;//The input signal of the instantiate module
reg enable;
reg [N-1:0] a;
reg [N-1:0] b;//The output signal of the instantiate module
wire [N-1:0] yshang;
wire [N-1:0] yyushu;
wire done;//Instantiate the modules to be tested
divider#(.N( N )
)u_divider(.clk ( clk ),.rst ( rst ),.enable ( enable ),.a ( a ),.b ( b ),.yshang ( yshang ),.yyushu ( yyushu ),.done ( done )
);//Generate the local clock, at 50MHz here
initial beginclk = 0;forever#(CYCLE/2)clk=~clk;
end//Generate the reset signal
initial beginrst_n = 1;#2;rst_n = 0;#(CYCLE*RST_TIME);rst_n = 1;
end//Assign a value to the input signal din0
integer i,j;
integer wrong_timer=0;
integer txt_file;
initial begin#1;//initialiseenable =0;a = 0;b = 0;#(10.5*CYCLE);#(CYCLE*RST_TIME);//Start the assignmentenable =1;a = 201;b = 20;#(CYCLE);enable =0;#(30*CYCLE);enable =1;a = 101;b = 13;#(CYCLE);enable =0;#(30*CYCLE);enable =1;a = 34;b = 3;#(CYCLE);enable =0;#(30*CYCLE);enable =1;a = 34;b = 100;#(CYCLE);enable =0;#(30*CYCLE);$stop();
endendmodule
仿真结果如下:
4、总结
除法器模块是FPGA应用中应用最广泛之一,该本模块采用状态机实现了位宽可定义的除法器模块,通用性较好。缺点是采用状态机实现,速度较慢,算是面积换速度的一个例子,想要实现快速的除法器,可用流水线的方式实现,后续更新。
另外,就有无符号而言,实现的是无符号除法,有符号除法在获取到除数和被除数后,转化成无符号实现即可。
Verilog无符号除法器-状态机实现相关推荐
- Verilog无符号除法器-流水线实现
文章目录 1.运算模块 2.测试模块 3.仿真结果 4.总结 在前一篇文章中提到了除法器模块的状态机实现,状态机实现可以使用最少的资源实现除法功能,随之带来的是每次只能运算一次结果,下一次除法运算需 ...
- verilog 实现8位无符号除法器
一.算法(非原创) 在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域.并且多数综合工具对于除运算指令不 ...
- Verilog 无符号乘法器
目录 32位简易乘法器,乘数和部分积右移 32位简易乘法器,被乘数左移 32位简易乘法器,乘数和部分积右移 // // //创建日期:2022/10/04 08:00:00 //设计名称:32位简易乘 ...
- Verilog除法器(32位无符号+带符号)
32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从"部分余数"中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a ...
- Verilog -- 有符号与无符号的加法和乘法运算
目录 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 有符号乘法和加法 有符号和无符号运算 参考: https://blog.csdn.net/vivid117/article/de ...
- Verilog有符号和无符号运算设计分析
主要内容是对有符号数和无符号数在设计时,数据是怎样传递的,符号位是怎样来的,以及相关的几种运算设计应当遵循怎样的想法. 最近对加减乘除运算很困惑,主要是对于有符号数的运算的困扰,如果运算出现负数怎么办 ...
- verilog - signed 符号数与无符号
#verilog #FPGA verilog - signed 符号数与无符号数计算 文章目录 verilog - signed 符号数与无符号数计算 原码 .反码 . 补码的关系 verilog 中 ...
- 对verilog中有符号数和无符号数的理解
文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...
- Verilog有符号数与无符号数的相互转化
Verilog有符号数与无符号数的相互转化 最近在使用DA转换时碰到一个问题,DA芯片输入的数值必须是正的,但输出的数据为有符号数,涉及到一个转化的问题,写一篇博客总结一下. 问题描述 一.正数 二. ...
- verilog有符号数使用方法简介
参考: https://www.cnblogs.com/yuandonghua/p/signed.html https://blog.csdn.net/a389085918/article/detai ...
最新文章
- day16 递归函数
- .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现...
- mysql 命令行小结
- 009_Gson版本支持
- 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据
- node.js小技巧——使用 supervisor
- Android 编程下 Touch 事件的分发和消费机制
- 2、nginx配置文件
- python面试题总结(2)--编码规范
- 无限式查找-----2013年2月28日
- SDN/NFV若干问题
- opencv-api matchTemplate
- window10 安装出现the error code is 2503错误的解决方法
- Python-程序模块化
- 外连接OUTER JOIN(三十五)
- 粒子滤波(PF:Particle Filter与卡尔曼滤波(Kalman Filter)相比较 (转载)
- 20170907wdVBA_ImportPicturesBaseOnExcel
- HTML-特效代码大全
- 分享一个2.4G无线麦克风音频接收器的成功案例
- 三维电子沙盘数字沙盘无人机倾斜摄影三维建模教程第45课