Verilog divide

复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 
// Design Name: 
// Module Name: DIV
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module division
    (
        input   wire    [31:0]  dividend            ,
        input   wire    [31:0]  divisor             ,
        input   wire            start               ,
        input   wire            sys_clk             ,
        input   wire            sys_rst_n           ,
        output  wire    [31:0]  q                   ,
        output  wire    [31:0]  r                   , 
        output  wire            busy                ,
        output  wire            valid
);
    reg [4:0] count;
    reg [31:0] reg_q;
    reg [31:0] reg_r;
    reg [31:0] reg_b;
    reg busy2,r_sign;
    reg out_busy    ;
    reg flag1,flag2;
    wire ready;
    wire [32:0] add_sub;
    wire [31:0] r_temp;
    wire [31:0] q_temp;
    assign  busy    =   out_busy    ;
    assign  valid   =   ~out_busy   ;
    assign ready=~out_busy&busy2;
    assign add_sub=r_sign?({reg_r,q_temp[31]}+{1'b0,reg_b}):({reg_r,q_temp[31]}-{1'b0,reg_b});
    assign q_temp=reg_q;
    assign q=flag1?(~q_temp+1):q_temp;
    assign r_temp=r_sign?reg_r+reg_b:reg_r;
    assign r=flag2?(~r_temp+1):r_temp;
    always @ (posedge sys_clk or negedge sys_rst_n)
    begin
        if( sys_rst_n == 1'b0 ) 
        begin
            count <=  5'b0;
            out_busy  <=  1'b0;
            busy2 <=  1'b0;
        end
        else
        begin
            busy2 <=  out_busy;
            if( start == 1'b1 )
            begin
                reg_r<=32'b0;
                count<=5'b0;
                r_sign<=1'b0;
                out_busy<=1'b1;
                flag1<=dividend[31]^divisor[31];
                flag2<=dividend[31];
                reg_q<=dividend[31]?~(dividend-1):dividend;
                reg_b<=divisor[31]?~(divisor-1):divisor;
            end
            else if( out_busy == 1'b1 )
            begin
                reg_q  <=  { reg_q[30:0],~add_sub[32] }    ;
                reg_r  <=  add_sub[31:0];
                r_sign <=  add_sub[32];
                count  <=  count+5'b1;
                if( count == 5'b11111 ) 
                begin
                   out_busy    <=  0;
                end
            end
        end
    end
endmodule

tb

复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/10 11:24:59
// Design Name: 
// Module Name: tb_division
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_division();

	// Inputs
	reg [31:0] dividend;
	reg [31:0] divisor;
	reg start;
	reg sys_clk;
	reg sys_rst_n;

	// Outputs
	wire [31:0] q;
	wire [31:0] r;
	wire busy;
	wire   valid   ;

	// Instantiate the Unit Under Test (UUT)
	division division_inst (
		.dividend(dividend), 
		.divisor(divisor), 
		.start(start), 
		.sys_clk(sys_clk), 
		.sys_rst_n(sys_rst_n), 
		.q(q), 
		.r(r), 
		.busy(busy),
		.valid(valid)
	);

	initial 
	begin
		dividend = 0;
		divisor = 0;
		start = 0;
		sys_clk = 0;
		sys_rst_n = 0;
		#100;
		sys_rst_n =   1'b1    ;
		start = 1;
		dividend = 32'd1_0000_0000;
		divisor = 32'd10;
		#200;
		start = 0;
		#4000;
		
		start = 1; 
		dividend = 32'd1_0000_0000;
		divisor = 32'd100;
		#200;
		start = 0;
		#4000;
		
		start = 1; 
		dividend = 32'd1_0000_0000;
		divisor = 32'd1000;
		#200;
		start = 0;
		#4000;
		  
		start = 1; 
		dividend = 32'd1_0000_0000;
		divisor = 32'd1_0000;
		#200;
		start = 0;
		#4000;
		
		start = 1; 
		dividend = 32'd1_0000_0000;
		divisor = 32'd10_0000;
		#200;
		start = 0;
		#4000;
		
		start = 1; 
		dividend = 32'd1_0000_0000;
		divisor = 32'd100_0000;
		#200;
		start = 0;
		#4000;
		
		$finish;	

	end
	
	always 
	begin
		#50;
		sys_clk = ~sys_clk;
	end 

endmodule
相关推荐
步达硬件1 天前
【FPGA】FPGA开发流程
fpga开发
我爱C编程2 天前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
s09071362 天前
ZYNQ DMA to UDP 数据传输系统设计文档
网络协议·fpga开发·udp
燎原星火*2 天前
QSPI IP核 基本参数
fpga开发
XINVRY-FPGA2 天前
XCVU9P-2FLGC2104I Xilinx AMD Virtex UltraScale+ FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
FPGA_小田老师2 天前
FPGA Debug:PCIE一直自动重启(link up一直高低切换)
fpga开发·pcie debug·pcie初始化问题
hexiaoyan8272 天前
视频信号检测板卡:208-Base Camera Link 图像信号模拟器
fpga开发·图像信号模拟器·视频信号检测·视频信号分析·智能图像分析
竹君子2 天前
新能源知识库(151) RTDS和RT-LAB比较
fpga开发
brave and determined3 天前
可编程逻辑器件学习(day34):半导体编年史:从法拉第的意外发现到塑造现代文明的硅基浪潮
人工智能·深度学习·fpga开发·verilog·fpga·设计规范·嵌入式设计
FPGA_Linuxer3 天前
RFSOC PCIE 4.0读写测试
fpga开发