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
相关推荐
我送炭你添花7 小时前
电子世界的奇妙冒险:从一个电阻开始(系列目录)
人工智能·单片机·嵌入式硬件·fpga开发
知识充实人生9 小时前
FPGA设计杂谈之九:HRIO/HPIO/HDIO
fpga开发·xilinx·hr i/o·hp i/o·hd i/o·io类型
maverick_11117 小时前
【FPGA】 在Verilog中,! 和 ~ 的区别
fpga开发
黄埔数据分析2 天前
QDMA把描述符当数据搬移, 不用desc engine
fpga开发
南檐巷上学2 天前
基于FPGA的正弦信号发生器、滤波器的设计(DAC输出点数受限条件下的完整正弦波产生器)
fpga开发·数字信号处理·dsp·dds
嵌入式-老费2 天前
Linux Camera驱动开发(fpga + csi rx/csi tx)
fpga开发
ALINX技术博客3 天前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
JJRainbow3 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
s9123601013 天前
FPGA眼图
fpga开发
北京青翼科技3 天前
【PCIe732】青翼PCIe采集卡-优质光纤卡- PCIe接口-万兆光纤卡
图像处理·人工智能·fpga开发·智能硬件·嵌入式实时数据库