目录

  • 1、除法原理
  • 2、除法代码
  • 3、测试代码及结果
  • 4、总结

 在FPGA的开发过程当中,常见的加,减,乘都可以直接用对应的符号表示,用时序逻辑实现,而除法的运算不能直接使用" /" 符号,基于当除数为2的幂次方时,可以用简单的移位符号 " >>"实现,当除数任意时,就需要使用额外的IP模块,固定的算法实现了,除法算法分为两类,分别是基于减法操作和基于乘法操作的算法。此处使用基于减法操作实现除法。

1、除法原理

 对于位宽为N位的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过N位。除法计算的步骤如下:

  1. 当信号使能信号为高,将a转换成高N位为0,低N位为a的temp_a;把b转换成高N位为b,低N位为0的temp_b。初始化迭代次数i=0,进入步骤2。
  2. 当迭代次数i<N时,将temp_a左移一位,末尾补0;否则,结束迭代运算。
  3. 将左移后的temp_a与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行,回到步骤2,继续迭代。
  4. 将输出使能 信号置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无符号除法器-状态机实现相关推荐

  1. Verilog无符号除法器-流水线实现

    文章目录 1.运算模块 2.测试模块 3.仿真结果 4.总结  在前一篇文章中提到了除法器模块的状态机实现,状态机实现可以使用最少的资源实现除法功能,随之带来的是每次只能运算一次结果,下一次除法运算需 ...

  2. verilog 实现8位无符号除法器

    一.算法(非原创) 在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域.并且多数综合工具对于除运算指令不 ...

  3. Verilog 无符号乘法器

    目录 32位简易乘法器,乘数和部分积右移 32位简易乘法器,被乘数左移 32位简易乘法器,乘数和部分积右移 // // //创建日期:2022/10/04 08:00:00 //设计名称:32位简易乘 ...

  4. Verilog除法器(32位无符号+带符号)

    32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从"部分余数"中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a ...

  5. Verilog -- 有符号与无符号的加法和乘法运算

    目录 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 有符号乘法和加法 有符号和无符号运算 参考: https://blog.csdn.net/vivid117/article/de ...

  6. Verilog有符号和无符号运算设计分析

    主要内容是对有符号数和无符号数在设计时,数据是怎样传递的,符号位是怎样来的,以及相关的几种运算设计应当遵循怎样的想法. 最近对加减乘除运算很困惑,主要是对于有符号数的运算的困扰,如果运算出现负数怎么办 ...

  7. verilog - signed 符号数与无符号

    #verilog #FPGA verilog - signed 符号数与无符号数计算 文章目录 verilog - signed 符号数与无符号数计算 原码 .反码 . 补码的关系 verilog 中 ...

  8. 对verilog中有符号数和无符号数的理解

    文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 ​ verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...

  9. Verilog有符号数与无符号数的相互转化

    Verilog有符号数与无符号数的相互转化 最近在使用DA转换时碰到一个问题,DA芯片输入的数值必须是正的,但输出的数据为有符号数,涉及到一个转化的问题,写一篇博客总结一下. 问题描述 一.正数 二. ...

  10. verilog有符号数使用方法简介

    参考: https://www.cnblogs.com/yuandonghua/p/signed.html https://blog.csdn.net/a389085918/article/detai ...

最新文章

  1. day16 递归函数
  2. .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现...
  3. mysql 命令行小结
  4. 009_Gson版本支持
  5. 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据
  6. node.js小技巧——使用 supervisor
  7. Android 编程下 Touch 事件的分发和消费机制
  8. 2、nginx配置文件
  9. python面试题总结(2)--编码规范
  10. 无限式查找-----2013年2月28日
  11. SDN/NFV若干问题
  12. opencv-api matchTemplate
  13. window10 安装出现the error code is 2503错误的解决方法
  14. Python-程序模块化
  15. 外连接OUTER JOIN(三十五)
  16. 粒子滤波(PF:Particle Filter与卡尔曼滤波(Kalman Filter)相比较 (转载)
  17. 20170907wdVBA_ImportPicturesBaseOnExcel
  18. HTML-特效代码大全
  19. 分享一个2.4G无线麦克风音频接收器的成功案例
  20. 三维电子沙盘数字沙盘无人机倾斜摄影三维建模教程第45课

热门文章

  1. lastinsertid mysql_mysql - Go语言中文网 - Golang中文社区
  2. TE银令契约,2019颠覆行业模式,造就大批巨富
  3. 项目管理(PMP)整体介绍
  4. 加拿大的java工程师工资_在加拿大工作,收入有多少呢?
  5. 帝国CMS系统目录结构介绍
  6. 如何获取微信服务号用户的openID
  7. 超频到3200最佳时序_科普教程 :小白超频教程——内存篇
  8. 淘宝客赚钱方式及怎么入门和推广引流详解
  9. python实现oa系统_利用Python实现某OA系统的自动定位功能
  10. 苹果开发者账号变更公司名称