verilog实现简单的除法运算
设计思路:
通过verilog实现除法有两大类,分别是:
基于减法操作。
基于乘法操作的算法。
8bit/8bit的除法实现
附录:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/07/29 16:11:22
// Design Name:
// Module Name: test_div
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
// testbench //
module test_div(); reg I_clk;
reg I_rst_p;
reg I_data_valid; //输入有效信号
reg [7:0] I_data_a; //被除数
reg [7:0] I_data_b; //除数
wire O_data_valid;
wire [7:0] O_data_shang;
wire [7:0] O_data_yushu;
c u_c(.I_clk(I_clk),.I_rst_p(I_rst_p),.I_data_valid(I_data_valid),.I_data_a(I_data_a),.I_data_b(I_data_b),.O_data_valid(O_data_valid),.O_data_shang(O_data_shang),.O_data_yushu(O_data_yushu)
);
always #3.125 I_clk <= ~I_clk;
initial beginI_clk = 0;I_rst_p = 1;I_data_valid = 0;I_data_a = 0;I_data_b = 0;#10;I_rst_p = 0;#30;@(posedge I_clk ) begin I_data_valid = 1;I_data_a = {$random}%256; I_data_b = {$random}%20;endrepeat(18) @(posedge I_clk) I_data_valid = 0;@(posedge I_clk ) begin I_data_valid = 1;I_data_a = {$random}%256; I_data_b = {$random}%20;endrepeat(18) @(posedge I_clk) I_data_valid = 0;@(posedge I_clk ) begin I_data_valid = 1;I_data_a = {$random}%256; I_data_b = {$random}%20;endrepeat(10) @(posedge I_clk) I_data_valid = 0; @(posedge I_clk ) begin I_data_valid = 1;I_data_a = {$random}%256; I_data_b = {$random}%20;endrepeat(18) @(posedge I_clk) I_data_valid = 0;;
endendmodule
module c(input I_clk,input I_rst_p,input I_data_valid,input [7:0] I_data_a,input [7:0] I_data_b,output reg O_data_valid,output reg [7:0] O_data_shang,output reg [7:0] O_data_yushu);
reg [7:0] tempa;
reg [7:0] tempb;
reg [15:0] temp_a;
reg [15:0] temp_b;
reg div_start;
reg div_start_d1;
wire div_start_neg;
reg [4:0] div_cnt;
always@(posedge I_clk or posedge I_rst_p)beginif(I_rst_p)begintempa <= 8'h0; tempb <= 8'h0; endelse if(I_data_valid)begintempa <= I_data_a; tempb <= I_data_b; endelsebegintempa <= tempa; tempb <= tempb; endendalways@(posedge I_clk or posedge I_rst_p)beginif(I_rst_p)div_start <= 1'b0;else if(I_data_valid && div_start == 1'b0)div_start <= 1'b1; //开始计算else if(div_cnt == 5'd16 ) //每16个时钟后开始下一次计算div_start <= 1'b0;elsediv_start <= div_start;end
//========================================================div_cnt 计数器
always@(posedge I_clk or posedge I_rst_p)if(I_rst_p)div_cnt <= 5'd0;else if(div_start)div_cnt <= div_cnt + 1;elsediv_cnt <= 5'd0;
//=======================================================
always@(posedge I_clk or posedge I_rst_p)beginif(I_rst_p)begintemp_a <= 16'h0;temp_b <= 16'h0; endelse if(div_start )if(div_cnt == 4'd0)begintemp_a <= {8'h0,tempa};temp_b <= {tempb,8'h0};endelse if(div_cnt[0] == 1'b1)begintemp_a <= {temp_a[14:0],1'b0}; //相当于乘2 或者左移一位elsebegintemp_a <= (temp_a[15:8] >= temp_b[15:8])?(temp_a - temp_b + 1):temp_a;//判断temp_a乘2之后取高8位与输入的除数比较大小 , 8次移动完temp_a[15:8]<temp_b[15:8])//结果就是左边高temp_a[15:8]是余数,右边temp_a[7:0]是商endelsebegintemp_a <= 16'h0;temp_b <= 16'h0; endend
always@(posedge I_clk)begindiv_start_d1 <= div_start; //延一拍end
assign div_start_neg = div_start_d1 & (~div_start); //产生一个脉冲always@(posedge I_clk or posedge I_rst_p)beginif(I_rst_p)beginO_data_valid <= 1'b0;O_data_shang <= 1'b0;O_data_yushu <= 1'b0; endelse if(div_start_neg)beginO_data_valid <= 1'b1;O_data_shang <= temp_a[7:0];O_data_yushu <= temp_a[15:8]; endelsebeginO_data_valid <= 1'b0;O_data_shang <= 1'b0;O_data_yushu <= 1'b0; endend
endmodule
仿真结果:
verilog实现简单的除法运算相关推荐
- java简单的除法运算_Java除法运算的陷阱
3.求余:和除法差不多. System.out.println(23%4); System.out.println(23%-4); System.out.println(-23%4); System. ...
- 数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数)
数字电路基础知识--组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数) 在数字逻辑设计中,本节介绍绝对值运算函数如何用Ve ...
- 2.4 定点除法运算
学习目标: 学习如何实现一个基于余数查商法的定点除法运算,并能够正确地进行除法计算,包括处理舍入误差和溢出等问题.具体要求包括: 熟悉定点数的表示方法和定点数的基本运算法则,理解定点除法运算的基本概念 ...
- 1.14 实例:完善除法运算的错误信息
本次实例的目的很简单,就是由用户输入两个数字,然后进行相除并输出结果.但是要求程序对除法运算过程中的各种异常进行捕捉并提示用户,例如除数是字符.被除数是零等. 在这个实例中定义了一个数组来存放要执行运 ...
- (34)Verilog HDL算术运算:加减乘除运算
(34)Verilog HDL算术运算:加减乘除运算 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL算术运算:加减乘除运算 5)结语 1.2 FP ...
- python除法保留两位小数_Python对小数进行除法运算的正确方法示例
Python对小数进行除法运算的正确方法示例 求一个算式 代码如下: a=1 b=2 c=3 print c*(a/b) 运行结果总是0,反复检查拆开以后,发现在Python里,整数初整数,只能得出整 ...
- c语言for循环除法运算,C语言入门这一篇就够了
c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...
- 定点数的除法C语言,FPGA定点小数计算(二)——除法运算
0 引言 在四则运算中,除法最为复杂,在时间上和空间上的开销都比较大.因此很多算法都极力避免进行除法运算,或者采用其他的方案来代替除法运算.但是,除法运算作为基本的四则运算之一,在很多情况下依旧是不可 ...
- Java除法运算(保留小数)
编程的人都知道,java中的"/"."%"运算,其中前者为取整,后者取余数.那么有没有快捷的运算方法取正常的运算结果呢? 查了资料,发现很简单.代码如下: /* ...
最新文章
- javaweb回顾第十二篇监听器
- jbpm_工作流框架笔记
- angular2 如何使用websocket
- 碎片时间学习前端,我推荐这些~
- slope one 推荐算法python 代码_基于协同的SlopeOne推荐算法原理介绍和实现
- python注册登陆程序未响应_SpringBoot实现登录注册常见问题解决方案
- 【好文链接】环形队列、串口数据处理
- Html前端基础(select下拉选标签、table表格标签)
- WebSocket 实现原理
- 关于协程和 ES6 中的 Generator
- tcp总结与简单实现
- iweboffice之word——功能简介
- 计算机用固态硬盘无法启动不了,windows10系统安装固态硬盘开启AHCI后开不了机怎么办...
- c++用贪心算法解决汽车加油问题
- 什么是雅可比矩阵?利用雅可比矩阵分析动力学
- theano环境配置
- linux中的dns中的hint,DNS问题
- 长沙有哪些点餐系统服务商?长沙点菜软件哪家好?
- 电子化时代到来,电子印章助力构建网络时代互信环境
- 软考高级 真题 2009年下半年 信息系统项目管理师 综合知识