博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

串口发送程序

Posted on 2018-12-26 14:31  沉默改良者  阅读(534)  评论(0编辑  收藏  举报

串口发送程序

以下程序基于KC705开发板,以及猫猫串口网络调试助手验证通过。

1.串口发送

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: chensimin
// 
// Create Date: 2018/12/24 14:06:24
// Design Name: 
// Module Name: tx_funcmod_1
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module tx_funcmod_1 (

    input    wire          clk,
    input    wire          rst,
    output   reg           txd,
    input    wire          enable,
    output   reg           done,
    input    wire   [7:0]  data

    );


//----------------------------------------------------------------------------------

    //50M Hz
    parameter B115K2 = 14'd10416 ; // formula : ( 1/115200 )/( 1/50E+6 )    

//----------------------------------------------------------------------------------

    reg enable_delay_1;
    reg enable_delay_2;

    always @ (posedge clk or posedge rst) 
    begin
        if(rst)
        begin
            enable_delay_1 <= 1'b0;
            enable_delay_2 <= 1'b0;
        end

        else 
        begin
            enable_delay_1 <= enable;
            enable_delay_2 <= enable_delay_1;
        end
    end

//----------------------------------------------------------------------------------

    assign rising = !enable_delay_2 && enable_delay_1;

//----------------------------------------------------------------------------------

    reg send_one_time;
    
    always @ (posedge clk or posedge rst) 
    begin
        if(rst)
            send_one_time <= 1'b0;
        else if(rising)
            send_one_time <= 1'b1;
        else if(i == 13)
            send_one_time <= 1'b0;
    end

//----------------------------------------------------------------------------------

    reg [3:0]   i;
    reg [13:0]  C1;
    reg [10:0]  D1;

    always @ (posedge clk or posedge rst) 
    begin
        if(rst)
        begin
            i    <=  4'd0 ;
            C1   <=  0    ;
            D1   <=  0    ;
            txd  <=  1'b1 ;
            done <=  1'b0 ;
        end

        else if(send_one_time)
        begin
            case(i)

                0:
                begin
                    D1 <= {2'b11, data, 1'b0};
                    i  <= i + 1'b1;
                end

                1,2,3,4,5,6,7,8,9,10,11:
                begin
                    if( C1 == B115K2 -1 ) 
                    begin 
                        C1 <= 8'd0; 
                        i  <= i + 1'b1; 
                    end
                     
                    else 
                    begin 
                        txd <= D1[i-1]; 
                        C1  <= C1 + 1'b1; 
                    end
                end

                12:
                begin 
                       done <= 1'b1; 
                    i    <= i + 1'b1; 
                end
                     
                 13:
                begin 
                    done <= 1'b0; 
                    i    <= 4'd0; 
                end
            endcase    
        end
    end


//----------------------------------------------------------------------------------

    ila_1 U10 (
        .clk(clk),                    // input wire clk

        .probe0(send_one_time),       // input wire [0:0]  probe0  
        .probe1(rising),              // input wire [0:0]  probe1 
        .probe2(enable),              // input wire [0:0]  probe2 
        .probe3(enable_delay_1),      // input wire [0:0]  probe3 
        .probe4(enable_delay_2),      // input wire [0:0]  probe4 
        .probe5(i),                    // input wire [3:0]  probe5
        .probe6(done)                 // input wire [0:0]  probe6
    );


endmodule

2.串口接收

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: chensimin
// 
// Create Date: 2018/12/24 16:33:17
// Design Name: 
// Module Name: rx_funcmod_1
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module rx_funcmod_1 (

    input   wire         clk,
    input   wire         rst,
    input   wire         rxd,
    input   wire         enable,
    output  reg          done,
    output  wire  [7:0]  data

    );


//----------------------------------------------------------------------

    parameter BPS115K2 = 14'd10416 ;
    parameter SAMPLE   = 14'd2604  ;

//----------------------------------------------------------------------

    reg [3 :0]      i;
    reg [13:0]      C1;
    reg [7 :0]      D1;
    reg             done;

    always @ (posedge clk or posedge rst)
    begin
        if(rst)
        begin
            i    <= 4'd0;
            C1   <= 0   ;
            D1   <= 8'd0;
            done <= 1'b0;
        end

        else if(enable)
        begin
            case(i)

                0:
                if( rxd == 1'b0 )
                begin
                    i  <= i  + 1'b1 ;
                    C1 <= C1 + 1'b1 ;
                end

                1:
                if(C1 == BPS115K2 - 1)
                begin
                    C1 <= 8'd0 ;
                    i  <= i + 1'b1;
                end
                else 
                    C1 <= C1 + 1'b1;

                2,3,4,5,6,7,8,9:
                begin
                    if(C1 == SAMPLE) 
                        D1[i-2] <= rxd;

                    if(C1 == BPS115K2-1)
                    begin
                        C1 <= 8'd0;
                        i  <= i + 1'b1;
                    end
                    else 
                        C1 <= C1 + 1'b1; 
                end

                10,11:
                if(C1 == BPS115K2-1) 
                begin 
                    C1 <= 8'd0; 
                    i  <= i + 1'b1; 
                end
                else 
                    C1 <= C1 + 1'b1;

                12:
                begin 
                    done <= 1'b1; 
                    i    <= i + 1'b1; 
                end
                     
                13:
                begin 
                    done <= 1'b0; 
                    i    <= 4'd0; 
                end
            endcase
        end
    end

//----------------------------------------------------------------------

    assign data = D1;

//----------------------------------------------------------------------

    ila_2 U9 (
        .clk(clk),                     // input wire clk

        .probe0(i),                    // input wire [3:0]  probe0  
        .probe1(D1),                   // input wire [7:0]  probe1 
        .probe2(done),                 // input wire [0:0]  probe2 
        .probe3(data),                 // input wire [7:0]  probe3 
        .probe4(enable),               // input wire [0:0]  probe4 
        .probe5(rxd)                   // input wire [0:0]  probe5
    );


endmodule

3.顶层文件

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: chensimin
// 
// Create Date: 2018/12/24 13:40:27
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module top (

    input    wire      clk_in1_p,
    input    wire      clk_in1_n,
    output   wire      txd,
    input    wire      rxd


    );


//---------------------------------------------------------------

wire  clk_out1;
wire  locked;

clk_wiz_0 U0 (
    .clk_out1(clk_out1),     
    .locked(locked),       
    .clk_in1_p(clk_in1_p),    
    .clk_in1_n(clk_in1_n)
);    

//---------------------------------------------------------------

wire        reset;
wire        enable;
wire [7:0]  data;
wire        enable_rx;

vio_0 U1 (
  .clk(clk_out1),                 // input wire clk
  .probe_in0(locked),             // input wire [0 : 0] probe_in0
  .probe_out0(reset),             // output wire [0 : 0] probe_out0
  .probe_out1(enable),            // output wire [0 : 0] probe_out1
  .probe_out2(data),              // output wire [7 : 0] probe_out2
  .probe_out3(enable_rx)          // output wire [0 : 0] probe_out3
);

//---------------------------------------------------------------

wire done;

tx_funcmod_1 U2 (

    .clk(clk_out1),
    .rst(reset),
    .txd(txd),
    .enable(enable),
    .done(done),
    .data(data)
);

//---------------------------------------------------------------

ila_0 U3 (
    .clk(clk_out1),     // input wire clk

    .probe0(done),      // input wire [0:0]  probe0  
    .probe1(txd),       // input wire [0:0]  probe1 
    .probe2(data),      // input wire [7:0]  probe2
    .probe3(rx_done),   // input wire [0:0]  probe3 
    .probe4(rx_data)    // input wire [7:0]  probe4
);

//---------------------------------------------------------------

wire          rx_done;
wire [7:0]    rx_data;


rx_funcmod_1 U4 (

    .clk(clk_out1),
    .rst(reset),
    .rxd(rxd),
    .enable(enable_rx),
    .done(rx_done),
    .data(rx_data)
);


endmodule