记录一下32位串行加法器的实现

adder.xdc 约束条件 是不需要变动的

lcd_module.dcp    是 LCD 触摸屏调用接口也不需要变动

adder.v文件

module adder(A,B,Cin,S,Cout);
parameter N=32;
input wire [N-1:0] A;
input wire [N-1:0] B;
input wire Cin;
output wire [N-1:0] S;
output wire Cout;
wire [N-2:0]C;

FullAdder FA0 (A[0],B[0],Cin,S[0],C[0]);
FullAdder FA1 (A[1],B[1],C[0],S[1],C[1]);
FullAdder FA2 (A[2],B[2],C[1],S[2],C[2]);
FullAdder FA3 (A[3],B[3],C[2],S[3],C[3]);
FullAdder FA4 (A[4],B[4],C[3],S[4],C[4]);
FullAdder FA5 (A[5],B[5],C[4],S[5],C[5]);
FullAdder FA6 (A[6],B[6],C[5],S[6],C[6]);
FullAdder FA7 (A[7],B[7],C[6],S[7],C[7]);
FullAdder FA8 (A[8],B[8],C[7],S[8],C[8]);
FullAdder FA9 (A[9],B[9],C[8],S[9],C[9]);
FullAdder FA10 (A[10],B[10],C[9],S[10],C[10]);
FullAdder FA11 (A[11],B[11],C[10],S[11],C[11]);
FullAdder FA12 (A[12],B[12],C[11],S[12],C[12]);
FullAdder FA13 (A[13],B[13],C[12],S[13],C[13]);
FullAdder FA14 (A[14],B[14],C[13],S[14],C[14]);
FullAdder FA15 (A[15],B[15],C[14],S[15],C[15]);
FullAdder FA16 (A[16],B[16],C[15],S[16],C[16]);
FullAdder FA17 (A[17],B[17],C[16],S[17],C[17]);
FullAdder FA18 (A[18],B[18],C[17],S[18],C[18]);
FullAdder FA19 (A[19],B[19],C[18],S[19],C[19]);
FullAdder FA20 (A[20],B[20],C[19],S[20],C[20]);
FullAdder FA21 (A[21],B[21],C[20],S[21],C[21]);
FullAdder FA22 (A[22],B[22],C[21],S[22],C[22]);
FullAdder FA23 (A[23],B[23],C[22],S[23],C[23]);
FullAdder FA24 (A[24],B[24],C[23],S[24],C[24]);
FullAdder FA25 (A[25],B[25],C[24],S[25],C[25]);
FullAdder FA26 (A[26],B[26],C[25],S[26],C[26]);
FullAdder FA27 (A[27],B[27],C[26],S[27],C[27]);
FullAdder FA28 (A[28],B[28],C[27],S[28],C[28]);
FullAdder FA29 (A[29],B[29],C[28],S[29],C[29]);
FullAdder FA30 (A[30],B[30],C[29],S[30],C[30]);
FullAdder FA31 (A[31],B[31],C[30],S[31],Cout);
endmodule

module FullAdder(A,B,CarryIn,Sum,CarryOut);
	input wire A;
	input wire B;
	input wire CarryIn;
	output wire Sum;
	output wire CarryOut;
	assign Sum=A^B^CarryIn;
	assign CarryOut=(A&B)|(A&CarryIn)|(B&CarryIn);
endmodule

testbench

module testbench;
    reg clk;
	reg [31:0] A;
	reg [31:0] B;
	reg Cin;
	wire Cout;
	wire [31:0] S;
	adder adder_0(A,B,Cin,S,Cout);//实例化
	always #10 clk=~clk;

	initial //初始化仿真
	begin
	   clk=1'b0;
		     A=32'h232234;B=32'h3013121;Cin=1'b0;//32表位数,h 16进制
		#100;A=32'h543;B=32'h171234;Cin=1'b0;
		#100;A=32'h2554;B=32'h18122;Cin=1'b0;
		#100;A=32'h3456;B=32'h193112;Cin=1'b0;
		#100;A=32'h4765;B=32'h20321;Cin=1'b0;
		#100;A=32'h5784;B=32'h30412;Cin=1'b1;
		#100;A=32'h622;B=32'h40421;Cin=1'b1;
		#100;A=32'h7999;B=32'h5032;Cin=1'b1;
		#100;A=32'h8532;B=32'h630;Cin=1'b1;
		//其他测试用例
		$finish;
	end
endmodule

adder_display.v    👇

module adder_display(
    //时钟与复位信号
     input clk,
    input resetn,    //后缀n表示低电平有效

    //拨码开关,用于选择输入数 和 产生 cin(你试过的,动了之后结果多了1嘛)
    input input_sel, //0 输入加数1, 1:输入加数2
    input sw_cin,

    //led灯显示cout
    output led_cout,

    //触摸屏相关借口,无需更改
    output lcd_rst,
    output lcd_cs,
    output lcd_rs,
    output lcd_wr,
    output lcd_rd,
    inout[15:0] lcd_data_io,
    output lcd_bl_ctr,
    inout ct_int,
    inout ct_sda,
    output ct_scl,
    output ct_rstn
    );

//--调用加法模块begin
    reg  [31:0] adder_A;
    reg  [31:0] adder_B;
    wire        adder_Cin;
    wire [31:0] adder_S  ;
    wire        adder_C;
    adder adder_module(
    //需要补充的部分
    .A(adder_A),
     .B(adder_B),
     .Cin (adder_Cin ),
     .S (adder_S),
     .Cout (adder_Cout ) 
    );
    assign adder_Cin = sw_cin;
    assign led_cout  = adder_Cout;
//---加法模块end

//---------------------调用触摸屏模块begin--------------------//
//---实例化触摸屏begin
//这小节无需更改
    reg         display_valid;
    reg  [39:0] display_name;
    reg  [31:0] display_value;
    wire [5 :0] display_number;
    wire        input_valid;
    wire [31:0] input_value;

    lcd_module lcd_module(
        .clk            (clk           ),   //10Mhz
        .resetn         (resetn        ),

        //调用触摸屏的接口
        .display_valid  (display_valid ),
        .display_name   (display_name  ),
        .display_value  (display_value ),
        .display_number (display_number),
        .input_valid    (input_valid   ),
        .input_value    (input_value   ),

        //lcd触摸屏相关接口,不需要更改
        .lcd_rst        (lcd_rst       ),
        .lcd_cs         (lcd_cs        ),
        .lcd_rs         (lcd_rs        ),
        .lcd_wr         (lcd_wr        ),
        .lcd_rd         (lcd_rd        ),
        .lcd_data_io    (lcd_data_io   ),
        .lcd_bl_ctr     (lcd_bl_ctr    ),
        .ct_int         (ct_int        ),
        .ct_sda         (ct_sda        ),
        .ct_scl         (ct_scl        ),
        .ct_rstn        (ct_rstn       )
    ); 
//----实例化触摸屏end

//-----从触摸屏获取输入begin
//根据实际需要输入的数 修改此小节
//建议对每一个数的输入,编写单独一个always块
    //input_sel 为0时,表 输入数为加数1即operand1
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            adder_A <= 32'd0;
        end
        else if (input_valid && !input_sel)
        begin
            adder_A <= input_value;
        end
    end

    //input_sel 为1时,表 输入数为加数2即operand2
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            adder_B <= 32'd0;
        end
        else if (input_valid && input_sel)
        begin
            adder_B <= input_value;
        end
    end
//----从触摸屏获取输入end

//---输出到触摸屏显示begin

//根据需要显示的数修改此小节

//触摸屏44块区域,可显示44组 32位数据 区域从1开始编号1-44
    always @(posedge clk)
    begin
        case(display_number)
            6'd1 :
            begin
                display_valid <= 1'b1;
                display_name  <= "ADD_1";
                display_value <= adder_A;
            end
            6'd2 :
            begin
                display_valid <= 1'b1;
                display_name  <= "ADD_2";
                display_value <= adder_B;
            end
            6'd3 :
            begin
                display_valid <= 1'b1;
                display_name  <= "RESUL";
                display_value <= adder_S;
            end
            default :
            begin
                display_valid <= 1'b0;
                display_name  <= 40'd0;
                display_value <= 32'd0;
            end
        endcase
    end
//-----输出到触摸屏显示end
//--------------------调用触摸屏模块end---------------------//
endmodule

一些学习:

以全加器为基础,实现32位行波进位加法器。

顶层模块adder_display 调用adder.v 也调用显示屏lcd_moudle 

 所谓约束文件就是将顶层模块的输入输出端口与FPGA板上的IO接口引脚绑定,以完成在板上的输入输出   约束文件  .xdc 这里是addernew.xdc


当你完成了一个设计之后,查看原理图,可以看下电路图(虽然我现在也看不懂。。

在这里呢哦


关于模块的调用可以看下  Verilog数字系统设计教程(第2版) 的p45页

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值