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