FPGA流水线除法器(Verilog)原理及实现

这篇具有很好参考价值的文章主要介绍了FPGA流水线除法器(Verilog)原理及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA流水线除法器(Verilog)原理及实现

流水线除法器原理

  除法器的计算过程如下图所示。
FPGA流水线除法器(Verilog)原理及实现

计算步骤

假设数值的位宽为N。
Step1:分别将被除数和除数扩展至原来2倍位宽(2N),被除数在其左边补N位0,除数在其右边补N位0;
Step2:将被除数依次左移(每次左移1位),末位补数值(该数值为被除数高N位与除数高N位的商),高N位为被除数高N位与除数高N位的余数。移位执行N次,执行N次后,进入Step3;
Step3:此时被除数的低N位为计算得到的商,被除数的高N位为计算得到的余数。

流水线除法器Verilog代码

module pipeline_divider
#(
	parameter		N = 8
)
(
	input					clk		,	//时钟信号
	input					rst_n	,	//复位信号
	input					start	,	//开始信号
	input		[N-1:0]		dividend,	//被除数
	input		[N-1:0]		divisor	,	//除数
	
	output		[N-1:0]		quotient	,	//商
	output		[N-1:0]		remainder	,	//余数
	output					finish			//计算结束信号
);

//============================================
//                  变量声明
//============================================

//------------------内部变量------------------
reg		[2*N-1:0]		dividend_temp ;
reg		[2*N-1:0]		divisor_temp;
reg						finish_temp;
reg						state;
reg		[$clog2(N):0]	cnt;

//-----------------状态机状态-----------------
parameter	Init = 'd0;
parameter	Calc = 'd1;

//============================================
//                流水线除法器
//============================================

always @(posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		dividend_temp <= 0;
		divisor_temp <= 0;
		finish_temp <= 0;
		cnt <= 0;
		state <= Init;
	end
	else begin
		case(state)
			Init:
				begin
					if(start) begin
						cnt <= 0;
						finish_temp <= 0;
						dividend_temp <= {{N{1'b0}},dividend};
						divisor_temp <= {divisor,{N{1'b0}}};
						state <= Calc;
					end
				end
			Calc:
				begin
					if(cnt == N) begin
						finish_temp <= 1'b1;
						state <= Init;
					end
					else begin
						if(dividend_temp[2*N-2:N-1] >= divisor_temp[2*N-1:N]) begin
							dividend_temp <= {dividend_temp[2*N-2:0],1'b0} - divisor_temp + 1'b1;
						end
						else begin
							dividend_temp <= {dividend_temp[2*N-2:0],1'b0};
						end
						cnt <= cnt + 1'b1;
					end
				end
		endcase
	end
	
end

//============================================
//                	模块输出
//============================================
assign	finish = finish_temp;	
assign	quotient = finish ? dividend_temp[N-1:0] : 0;
assign	remainder = finish ? dividend_temp[2*N-1:N] : 0;


endmodule

Test_Bench

   这里简单的写个测试文件对流水线除法器进行功能测试,判断是否符合预期的计算结果。

`timescale 1ns/1ps
module tb_pipeline_divider();

parameter		N = 8;
reg		clk,rst_n,start;
reg		[N-1:0]		dividend;	//被除数
reg		[N-1:0]		divisor	;	//除数
wire	[N-1:0]		quotient;
wire	[N-1:0]		remainder;
wire				finish;

initial begin
	clk = 1'b0;
	rst_n = 1'b0;
	start = 1'b0;
	dividend = 'd23;
	divisor = 'd3;
	#20
	rst_n = 1'b1;
	
	#100
	start = 1'b1;

end


always #10 clk = ~clk;

pipeline_divider
#(
	.N(N)
)
pipeline_divider_inst
(
	.clk		(clk		),	//时钟信号
	.rst_n		(rst_n		),	//复位信号
	.start		(start		),	//开始信号
	.dividend	(dividend	),	//被除数
	.divisor	(divisor	),	//除数
	
	.quotient	(quotient	),	//商
	.remainder	(remainder	),	//余数
	.finish     (finish     )	//结束信号
);

endmodule

仿真结果

FPGA流水线除法器(Verilog)原理及实现
  这里被除数为23,除数为3,得到商为7,余数为2,仿真所得计算结果正确,验证通过。

注:本博客仅为个人学习笔记,如有错误之处,请指正,如有转载请备注出处,谢谢。文章来源地址https://www.toymoban.com/news/detail-505758.html

到了这里,关于FPGA流水线除法器(Verilog)原理及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于verilog的四级流水线实现并行fft16(可计算小数和负数)

    目录 夯实基础--FFT算法 定点运算--verilog实现小数运算 Verilog代码实现  FFT系数 W 的准备  输入数值的初始化 蝶形运算端点处的值 仿真结果展示 总结        FFT是DFT的一种快速算法而不是一种新的变换,他可以在数量级的意义上提高运算速度。它主要有两种实现方法:一种是

    2024年02月05日
    浏览(41)
  • 基于Verilog HDL的FFT算法硬件实现(8点,三级流水线,DIT-FFT)

    关于fft的相关知识,在之前的文章中,有过介绍,这里不再具体介绍,可以参考学习。 从傅里叶级数(FS)到傅里叶变换(FT)最后到离散傅里叶变换(DFT)_小张爱学习哦的博客-CSDN博客_fs傅里叶级数 FFT原理(基2DIT-FFT)及C语言编程思路及实现_小张爱学习哦的博客-CSDN博客_c语言

    2024年02月14日
    浏览(27)
  • Verilog流水线设计——Pipeline

    在工程师实际开发过程中,可能会经常遇到这样的需求:数据从数据源端不断地持续输入FPGA,FPGA需要对数据进行处理,最后将处理好的数据输出至客户端。 在数据处理过程中,可能需要一系列的处理步骤。比如常规的信号进行处理步骤有(这里的处理步骤只是举个例子):

    2024年02月08日
    浏览(35)
  • verilog实例-流水线(Pipeline)

    所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存中间数据。 K级的流水线就是从组合逻辑的输入到输出恰好有K个寄存器组(分为K 级,每一级都有一个寄存器组),上一级的输出是下一级的输入而又无反馈的电路。 流

    2024年02月02日
    浏览(38)
  • 【【verilog典型电路设计之流水线结构】】

    下图是一个4位的乘法器结构,用verilog HDL 设计一个两级流水线加法器树4位乘法器 对于流水线结构 其实需要做的是在每级之间增加一个暂存的数据用来存储 我们得到的东西 我们一般来说会通过在每一级之间插入D触发器来保证数据的联通 通过在第一级和第二级,第二级和第

    2024年02月12日
    浏览(27)
  • 南京观海微电子----Verilog流水线设计——Pipeline

    1.  前言 在工程师实际开发过程中,可能会经常遇到这样的需求:数据从数据源端不断地持续输入FPGA,FPGA需要对数据进行处理,最后将处理好的数据输出至客户端。 在数据处理过程中,可能需要一系列的处理步骤。比如常规的信号进行处理步骤有(这里的处理步骤只是举个

    2024年01月19日
    浏览(32)
  • 6设计指令流水线-1【FPGA模型机课程设计】

    2023-5-25 09:25:05 以下内容源自《【FPGA模型机课程设计】》 仅供学习交流使用 0集中实践环节计划书【FPGA模型机课程设计】 2023-5-30 16:03:03 添加MEM_WB模块 2023-5-30 19:00:25 IF模块添加stall 2023-5-30 21:08:26 修改stall相关的处理 在id ctrl 流水寄存器中修改 因为原来没有理解stall[5:0]是什么

    2024年02月08日
    浏览(42)
  • 【计组实验】基于Verilog的多周期非流水线MIPS处理器设计

    设计多周期非流水线MIPS处理器,包括: 完成多周期MIPS处理器的Verilog代码; 在Vivado软件上进行仿真; 编写MIPS代码验证MIPS处理器; 相关代码及资源的下载地址如下: 本实验的Vivado工程文件和实验文档:Multi-Cycle MIPS Processor.zip(272KB) QtSpim 9.1.23和Vivado 2019.2的安装包:QtSpim Viv

    2024年02月11日
    浏览(36)
  • 处理器流水线——时空图作图原理

    目录 一、基础知识 1、每个阶段的含义  2、为何要产生阻塞 3、何时才能产生阻塞 4、产生阻塞的条件 5、产生阻塞的流程以及后续情况 6、特殊情况 二、具体问题分析 1、每个阶段的含义  2、为何要产生阻塞 上一条需要写寄存器指令的目的寄存器与当前指令的源寄存器相同

    2024年02月08日
    浏览(27)
  • jenkins流水线实现xjar加固

    xjar的定义 功能特性 xjar使用 修改项目中的pom.xml,一般都是开发改 jenkins流水线配置 查看jenkins工作目录 远端服务器配置–☞需要授权的服务器 获取授权服务器信息 执行脚本 脚本内容, 1.判断镜像是否存在 2.把xjar.go解压,需要有go环境 3.制作镜像,然后把镜像制作成tar包

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包