FPGA串口双字节收发

//本程序设计的目的是为了传输多字节通信,使用时添加一个主程序,把接收和发送模块进行例化就可以使用,程序使用的波特率为115.2K

1
//company:电子科技大学 2 //engineer:昌磊 3 //create data:2017.09.14 4 //Design name :多字节串口收发程序 5 //module name: 6 //descirption:可以实现多字节的串口收发通信 7 8 /**********************************************/ 9 //串口发送程序 10 module tx_module( 11 input clk, 12 input RSTn, 13 14 input TX_En_Sig, 15 output TX_Done_Sig, 16 17 input [15:0]TX_Data, 18 output TX_Pin_Out 19 ); 20 21 /*****************************************************/ 22 23 parameter B115K2=8'd174; //设置波特率为115.2K 24 25 /*******************************************************/ 26 27 reg [4:0]i; 28 reg [7:0]C1; 29 reg [17:0]rData; 30 reg rPin; 31 reg isDone; 32 33 always@(posedge clk or negedge RSTn) 34 if(RSTn==1'b0) 35 begin 36 i<=5'd0; 37 C1<=8'd0; 38 rData<=11'd0; 39 rPin<=1'b0; 40 isDone<=1'b0; 41 end 42 else if(TX_En_Sig) 43 case(i) 44 45 0: 46 begin rData<={2'b11,TX_Data,1'b0};i<=i+1'b1;end //按照串口发送的格式拼接数据 47 48 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18: 49 if(C1==B115K2-1)begin C1<=8'd0;i<=i+1'b1;end 50 else begin rPin<=rData[i-1];C1<=C1+1;end 51 52 19: 53 begin isDone<=1'b1;i<=i+1'b1;end 54 55 20: 56 begin isDone<=1'b0;i<=5'd0;end 57 58 endcase 59 /************************************************************************/ 60 61 assign TX_Pin_Out=rPin; 62 assign TX_Done_Sig=isDone; 63 /***********************************************************/ 64 65 endmodule 66 /********************************************************/ 67 //串口接收程序 68 module rx_module( 69 input clk, 70 input RSTn, 71 72 input rs232_rx, 73 output [15:0]RX_Data, 74 output RX_Done_Sig 75 ); 76 77 parameter B115K2=8'd174; //设置波特率为115.2K 78 /*****************************/ 79 //电平检测部分 80 reg F1; 81 reg F2; 82 reg Low_F; 83 always@(posedge clk or negedge RSTn) 84 if(RSTn==1'b0) 85 begin 86 F1<=1'b1; 87 F2<=1'b1; 88 end 89 else 90 begin 91 F1<=rs232_rx; 92 F2<=F1; 93 end 94 95 assign Low_F=F2&!F1; 96 97 reg [7:0]C1; 98 reg [4:0]i; 99 reg [15:0]rData; 100 always@(posedge clk or negedge RSTn) 101 if(RSTn==1'b0) 102 begin 103 rData<=16'dz; 104 C1<=8'd0; 105 end 106 else if(Low_F) 107 case(i) 108 109 5'd0,5'd1: 110 if(C1==B115K2-1)begin C1<=8'd0;i<=i+1'b1;end 111 else begin C1<=C1+1;end 112 113 114 5'd2,5'd3,5'd4,5'd5,5'd6,5'd7,5'd8,5'd9,5'd10,5'd11,5'd12,5'd13,5'd14,5'd15,5'd16,5'd17: 115 if(C1==B115K2-1)begin C1<=8'd0;i<=i+1'b1;end 116 else begin rData[i-2]<=rs232_rx;C1<=C1+1;end 117 118 5'd18: 119 if(C1==B115K2-1)begin C1<=8'd0;i<=i+1'b1;end 120 else begin C1<=C1+1;end 121 122 5'd19: 123 if(C1==B115K2-1)begin C1<=8'd0;i<=i+1'b1;end 124 else begin C1<=C1+1;end 125 126 5'd20: 127 begin i<=i+1'b1;isDone<=1'b1;end 128 129 5'd21: 130 begin i<=5'd0;isDone<=1'b0;end 131 132 endcase 133 assign RX_Data=rData; 134 assign RX_Done_Sig=isDone; 135 136 /***************************************************/ 137 endmodule

 

posted @ 2017-09-14 11:47  UESTC_CUG  阅读(1323)  评论(0编辑  收藏  举报