UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx 和Tx)就可以完成通信过程,因此也称为异步串行通信。

                          

起始位:每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。

数据位:起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。

奇偶校验位:

   数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:

  1、奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。

  2、偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。

  3、mark parity:校验位始终为1。

  4、parity:校验位始终为0。

  5、无校验(no parity)。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。

空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。

波特率:数据传输速率使用波特率来表示。单位bps(bits per second),常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,115200等等。

  代码如下:

  顶层文件AXI4_UART.v

  1 //**************************************************************************
2 // *** file name : AXI4_UART.v
3 // *** version : 1.0
4 // *** Description : AXI4_UART
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.09.14
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module AXI4_UART
12 #(
13 parameter SYS_FRE = 100_000_000 ,
14 parameter TX_FIFO_DEPTH = 2048 ,
15 parameter RX_FIFO_DEPTH = 2048
16 )
17 (
18 input wire i_s_axi_aclk ,
19 input wire i_s_axi_aresetn ,
20 input wire [31:0] i_s_axi_awaddr ,
21 input wire [2:0] i_s_axi_awprot ,
22 input wire i_s_axi_awvalid ,
23 output wire o_s_axi_awready ,
24 input wire [31:0] i_s_axi_wdata ,
25 input wire [3:0] i_s_axi_wstrb ,
26 input wire i_s_axi_wvalid ,
27 output wire o_s_axi_wready ,
28 output wire [1:0] o_s_axi_bresp ,
29 output wire o_s_axi_bvalid ,
30 input wire i_s_axi_bready ,
31 input wire [31:0] i_s_axi_araddr ,
32 input wire [2:0] i_s_axi_arprot ,
33 input wire i_s_axi_arvalid ,
34 output wire o_s_axi_arready ,
35 output wire [31:0] o_s_axi_rdata ,
36 output wire [1:0] o_s_axi_rresp ,
37 output wire o_s_axi_rvalid ,
38 input wire i_s_axi_rready ,
39 input wire i_uart_rx ,
40 output wire o_uart_tx
41 );
42
43 wire w_module_en ;
44 wire [31:0] w_fre_cnt ;
45 wire [3:0] w_uart_data_bit ;
46 wire [2:0] w_uart_parity_mode ;
47 wire [2:0] w_uart_stop_bit ;
48 wire [7:0] w_tx_fifo_din ;
49 wire w_tx_fifo_wr ;
50 wire [8:0] w_rx_fifo_dout ;
51 wire w_rx_fifo_rd ;
52 wire [15:0] w_uart_wr_cnt ;
53 wire [15:0] w_uart_rd_cnt ;
54 wire w_fifo_rest ;
55 wire w_fifo_clr ;
56 wire [7:0] w_tx_data ;
57 wire w_tx_valid ;
58 wire w_tx_req ;
59 wire [8:0] w_rx_data ;
60 wire w_rx_valid ;
61 wire w_tx_fifo_empty ;
62
63 /******************************************************************************\
64 Uart control
65 \******************************************************************************/
66 Uart_ctrl
67 #(
68 .SYS_FRE (SYS_FRE )
69 )
70 u_Uart_ctrl
71 (
72 .i_s_axi_aclk (i_s_axi_aclk ),
73 .i_s_axi_aresetn (i_s_axi_aresetn ),
74 .i_s_axi_awaddr (i_s_axi_awaddr ),
75 .i_s_axi_awprot (i_s_axi_awprot ),
76 .i_s_axi_awvalid (i_s_axi_awvalid ),
77 .o_s_axi_awready (o_s_axi_awready ),
78 .i_s_axi_wdata (i_s_axi_wdata ),
79 .i_s_axi_wstrb (i_s_axi_wstrb ),
80 .i_s_axi_wvalid (i_s_axi_wvalid ),
81 .o_s_axi_wready (o_s_axi_wready ),
82 .o_s_axi_bresp (o_s_axi_bresp ),
83 .o_s_axi_bvalid (o_s_axi_bvalid ),
84 .i_s_axi_bready (i_s_axi_bready ),
85 .i_s_axi_araddr (i_s_axi_araddr ),
86 .i_s_axi_arprot (i_s_axi_arprot ),
87 .i_s_axi_arvalid (i_s_axi_arvalid ),
88 .o_s_axi_arready (o_s_axi_arready ),
89 .o_s_axi_rdata (o_s_axi_rdata ),
90 .o_s_axi_rresp (o_s_axi_rresp ),
91 .o_s_axi_rvalid (o_s_axi_rvalid ),
92 .i_s_axi_rready (i_s_axi_rready ),
93 .o_module_en (w_module_en ),
94 .o_fifo_clr (w_fifo_clr ),
95 .o_fre_cnt (w_fre_cnt ),
96 .o_uart_data_bit (w_uart_data_bit ),
97 .o_uart_parity_mode (w_uart_parity_mode ),
98 .o_uart_stop_bit (w_uart_stop_bit ),
99 .o_tx_data (w_tx_fifo_din ),
100 .o_tx_valid (w_tx_fifo_wr ),
101 .i_rx_data (w_rx_fifo_dout ),
102 .o_rx_req (w_rx_fifo_rd ),
103 .i_tx_fifo_wr_cnt (w_uart_wr_cnt ),
104 .i_rx_fifo_rd_cnt (w_uart_rd_cnt )
105
106 );
107
108 assign w_fifo_rest = w_fifo_clr & (~i_s_axi_aresetn);
109 /******************************************************************************\
110 Uart tx
111 \******************************************************************************/
112 Uart_tx u_Uart_tx
113 (
114 .i_sys_clk (i_s_axi_aclk ),
115 .i_sys_rstn (i_s_axi_aresetn & w_module_en),
116 .i_fre_cnt (w_fre_cnt ),
117 .i_tx_data_bit (w_uart_data_bit ),
118 .i_parity_mode (w_uart_parity_mode ),
119 .i_stop_bit (w_uart_stop_bit ),
120 .i_tx_data (w_tx_data ),
121 .i_tx_valid (w_tx_valid ),
122 .o_tx_req (w_tx_req ),
123 .o_uart_tx (o_uart_tx )
124 );
125
126 /******************************************************************************\
127 Uart rx
128 \******************************************************************************/
129 Uart_rx u_Uart_rx
130 (
131 .i_sys_clk (i_s_axi_aclk ),
132 .i_sys_rstn (i_s_axi_aresetn & w_module_en),
133 .i_fre_cnt (w_fre_cnt ),
134 .i_rx_data_bit (w_uart_data_bit ),
135 .i_parity_mode (w_uart_parity_mode[2] ),
136 .i_stop_bit (w_uart_stop_bit ),
137 .o_rx_data (w_rx_data ),
138 .o_rx_valid (w_rx_valid ),
139 .i_uart_rx (i_uart_rx )
140 );
141 /******************************************************************************\
142 Uart tx fifo
143 \******************************************************************************/
144 xpm_fifo_sync
145 #(
146 .DOUT_RESET_VALUE ("0" ),
147 .ECC_MODE ("no_ecc" ),
148 .FIFO_MEMORY_TYPE ("block" ),
149 .FIFO_READ_LATENCY (1 ),
150 .FIFO_WRITE_DEPTH (TX_FIFO_DEPTH ),
151 .FULL_RESET_VALUE (0 ),
152 .PROG_EMPTY_THRESH (10 ),
153 .PROG_FULL_THRESH (10 ),
154 .RD_DATA_COUNT_WIDTH (1 ),
155 .READ_DATA_WIDTH (8 ),
156 .READ_MODE ("fwft" ),
157 .SIM_ASSERT_CHK (0 ),
158 .USE_ADV_FEATURES ("0707" ),
159 .WAKEUP_TIME (0 ),
160 .WRITE_DATA_WIDTH (8 ),
161 .WR_DATA_COUNT_WIDTH (1 )
162 )
163 u_uart_tx_fifo
164 (
165 .wr_clk (i_s_axi_aclk ),
166 .rst (w_fifo_rest ),
167 .rd_en (w_tx_req ),
168 .dout (w_tx_data ),
169 .din (w_tx_fifo_din ),
170 .wr_en (w_tx_fifo_wr ),
171 .wr_data_count (w_uart_wr_cnt ),
172 .rd_data_count ( ),
173 .empty (w_tx_fifo_empty ),
174 .almost_empty ( ),
175 .almost_full ( ),
176 .data_valid ( ),
177 .dbiterr ( ),
178 .full ( ),
179 .overflow ( ),
180 .prog_empty ( ),
181 .prog_full ( ),
182 .rd_rst_busy ( ),
183 .sbiterr ( ),
184 .underflow ( ),
185 .wr_ack ( ),
186 .wr_rst_busy ( ),
187 .injectdbiterr ( ),
188 .injectsbiterr ( ),
189 .sleep (1'b0 )
190
191 );
192 assign w_tx_valid = ~w_tx_fifo_empty;
193 /******************************************************************************\
194 Uart rx fifo
195 \******************************************************************************/
196 xpm_fifo_sync
197 #(
198 .DOUT_RESET_VALUE ("0" ),
199 .ECC_MODE ("no_ecc" ),
200 .FIFO_MEMORY_TYPE ("block" ),
201 .FIFO_READ_LATENCY (1 ),
202 .FIFO_WRITE_DEPTH (RX_FIFO_DEPTH ),
203 .FULL_RESET_VALUE (0 ),
204 .PROG_EMPTY_THRESH (10 ),
205 .PROG_FULL_THRESH (10 ),
206 .RD_DATA_COUNT_WIDTH (1 ),
207 .READ_DATA_WIDTH (9 ),
208 .READ_MODE ("fwft" ),
209 .SIM_ASSERT_CHK (0 ),
210 .USE_ADV_FEATURES ("0707" ),
211 .WAKEUP_TIME (0 ),
212 .WRITE_DATA_WIDTH (9 ),
213 .WR_DATA_COUNT_WIDTH (1 )
214 )
215 u_uart_rx_fifo
216 (
217 .wr_clk (i_s_axi_aclk ),
218 .rst (w_fifo_rest ),
219 .rd_en (w_rx_fifo_rd ),
220 .dout (w_rx_fifo_dout ),
221 .din (w_rx_data ),
222 .wr_en (w_rx_valid ),
223 .wr_data_count ( ),
224 .rd_data_count (w_uart_rd_cnt ),
225 .almost_empty ( ),
226 .almost_full ( ),
227 .data_valid ( ),
228 .dbiterr ( ),
229 .empty ( ),
230 .full ( ),
231 .overflow ( ),
232 .prog_empty ( ),
233 .prog_full ( ),
234 .rd_rst_busy ( ),
235 .sbiterr ( ),
236 .underflow ( ),
237 .wr_ack ( ),
238 .wr_rst_busy ( ),
239 .injectdbiterr ( ),
240 .injectsbiterr ( ),
241 .sleep (1'b0 )
242 );
243
244 endmodule

Uart_ctrl.v

  1 //**************************************************************************
2 // *** file name : Uart_ctrl.v
3 // *** version : 1.0
4 // *** Description : Uart_ctrl
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.09.14
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Uart_ctrl
12 #(
13 parameter SYS_FRE = 100_000_000
14 )
15 (
16 input wire i_s_axi_aclk ,
17 input wire i_s_axi_aresetn ,
18 input wire [31:0] i_s_axi_awaddr ,
19 input wire [2:0] i_s_axi_awprot ,
20 input wire i_s_axi_awvalid ,
21 output wire o_s_axi_awready ,
22 input wire [31:0] i_s_axi_wdata ,
23 input wire [3:0] i_s_axi_wstrb ,
24 input wire i_s_axi_wvalid ,
25 output wire o_s_axi_wready ,
26 output wire [1:0] o_s_axi_bresp ,
27 output wire o_s_axi_bvalid ,
28 input wire i_s_axi_bready ,
29 input wire [31:0] i_s_axi_araddr ,
30 input wire [2:0] i_s_axi_arprot ,
31 input wire i_s_axi_arvalid ,
32 output wire o_s_axi_arready ,
33 output wire [31:0] o_s_axi_rdata ,
34 output wire [1:0] o_s_axi_rresp ,
35 output wire o_s_axi_rvalid ,
36 input wire i_s_axi_rready ,
37 output reg o_module_en ,
38 output reg o_fifo_clr ,
39 output reg [31:0] o_fre_cnt ,
40 output reg [3:0] o_uart_data_bit ,
41 output reg [2:0] o_uart_parity_mode ,
42 output reg [2:0] o_uart_stop_bit ,
43 output wire [7:0] o_tx_data ,
44 output wire o_tx_valid ,
45 input wire [8:0] i_rx_data ,
46 input wire o_rx_req ,
47 input wire [15:0] i_tx_fifo_wr_cnt ,
48 input wire [15:0] i_rx_fifo_rd_cnt
49 );
50
51 wire [31:0] w_ctrl_wr_addr ;
52 wire w_ctrl_wr_en ;
53 wire [31:0] w_ctrl_wr_data ;
54 wire [3:0] w_ctrl_wr_mask ;
55 wire [31:0] w_ctrl_rd_addr ;
56 reg [31:0] w_ctrl_rd_data ;
57 wire w_fifo_rstn ;
58
59 wire [31:0] w_reg_00_rd ;
60 wire [31:0] w_reg_01_rd ;
61 wire [31:0] w_reg_02_rd ;
62 wire [31:0] w_reg_03_rd ;
63 wire [31:0] w_reg_04_rd ;
64 wire [31:0] w_reg_05_rd ;
65
66
67 /******************************************************************************\
68 Axi4_lite_slave interface
69 \******************************************************************************/
70 Uart_Axi4_lite_slave u_Uart_Axi4_lite_slave
71 (
72 .i_s_axi_aclk (i_s_axi_aclk ),
73 .i_s_axi_aresetn (i_s_axi_aresetn ),
74 .i_s_axi_awaddr (i_s_axi_awaddr ),
75 .i_s_axi_awprot (i_s_axi_awprot ),
76 .i_s_axi_awvalid (i_s_axi_awvalid ),
77 .o_s_axi_awready (o_s_axi_awready ),
78 .i_s_axi_wdata (i_s_axi_wdata ),
79 .i_s_axi_wstrb (i_s_axi_wstrb ),
80 .i_s_axi_wvalid (i_s_axi_wvalid ),
81 .o_s_axi_wready (o_s_axi_wready ),
82 .o_s_axi_bresp (o_s_axi_bresp ),
83 .o_s_axi_bvalid (o_s_axi_bvalid ),
84 .i_s_axi_bready (i_s_axi_bready ),
85 .i_s_axi_araddr (i_s_axi_araddr ),
86 .i_s_axi_arprot (i_s_axi_arprot ),
87 .i_s_axi_arvalid (i_s_axi_arvalid ),
88 .o_s_axi_arready (o_s_axi_arready ),
89 .o_s_axi_rdata (o_s_axi_rdata ),
90 .o_s_axi_rresp (o_s_axi_rresp ),
91 .o_s_axi_rvalid (o_s_axi_rvalid ),
92 .i_s_axi_rready (i_s_axi_rready ),
93 .o_ctrl_wr_addr (w_ctrl_wr_addr ),
94 .o_ctrl_wr_en (w_ctrl_wr_en ),
95 .o_ctrl_wr_data (w_ctrl_wr_data ),
96 .o_ctrl_wr_mask (w_ctrl_wr_mask ),
97 .o_ctrl_rd_addr (w_ctrl_rd_addr ),
98 .i_ctrl_rd_data (w_ctrl_rd_data )
99 );
100 /******************************************************************************\
101 Register 0x00~0x03
102 \******************************************************************************/
103 assign w_reg_00_rd = SYS_FRE;
104 /******************************************************************************\
105 Register 0x04~0x07
106 \******************************************************************************/
107 always @ (posedge i_s_axi_aclk)
108 begin
109 if(~i_s_axi_aresetn)
110 begin
111 o_module_en <= 'd0;
112 end
113 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h01) & w_ctrl_wr_mask[0])
114 begin
115 o_module_en <= w_ctrl_wr_data[0];
116 end
117 end
118
119 always @ (posedge i_s_axi_aclk)
120 begin
121 if(~i_s_axi_aresetn)
122 begin
123 o_fifo_clr <= 'd0;
124 end
125 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h01) & w_ctrl_wr_mask[1])
126 begin
127 o_fifo_clr <= w_ctrl_wr_data[8];
128 end
129 else
130 begin
131 o_fifo_clr <= 'd0;
132 end
133 end
134
135 always @ (posedge i_s_axi_aclk)
136 begin
137 if(~i_s_axi_aresetn)
138 begin
139 o_uart_data_bit <= 'd0;
140 o_uart_parity_mode <= 'd0;
141 end
142 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h01) & w_ctrl_wr_mask[2])
143 begin
144 o_uart_data_bit <= w_ctrl_wr_data[23:20];
145 o_uart_parity_mode <= w_ctrl_wr_data[18:16];
146 end
147 end
148
149 always @ (posedge i_s_axi_aclk)
150 begin
151 if(~i_s_axi_aresetn)
152 begin
153 o_uart_stop_bit <= 'd0;
154 end
155 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h01) & w_ctrl_wr_mask[3])
156 begin
157 o_uart_stop_bit <= w_ctrl_wr_data[26:24];
158 end
159 end
160
161 assign w_reg_01_rd = {{5'd0,o_uart_stop_bit},{o_uart_data_bit,1'b0,o_uart_parity_mode},8'd0,{7'd0,o_module_en}};
162 /******************************************************************************\
163 Register 0x08~0x0b
164 \******************************************************************************/
165 always @ (posedge i_s_axi_aclk)
166 begin
167 if(~i_s_axi_aresetn)
168 begin
169 o_fre_cnt[7:0] <= 'd0;
170 end
171 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h02) & w_ctrl_wr_mask[0])
172 begin
173 o_fre_cnt[7:0] <= w_ctrl_wr_data[7:0];
174 end
175 end
176 always @ (posedge i_s_axi_aclk)
177 begin
178 if(~i_s_axi_aresetn)
179 begin
180 o_fre_cnt[15:8] <= 'd0;
181 end
182 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h02) & w_ctrl_wr_mask[1])
183 begin
184 o_fre_cnt[15:8] <= w_ctrl_wr_data[15:8];
185 end
186 end
187 always @ (posedge i_s_axi_aclk)
188 begin
189 if(~i_s_axi_aresetn)
190 begin
191 o_fre_cnt[23:16] <= 'd0;
192 end
193 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h02) & w_ctrl_wr_mask[2])
194 begin
195 o_fre_cnt[23:16] <= w_ctrl_wr_data[23:16];
196 end
197 end
198 always @ (posedge i_s_axi_aclk)
199 begin
200 if(~i_s_axi_aresetn)
201 begin
202 o_fre_cnt[31:24] <= 'd0;
203 end
204 else if(w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h02) & w_ctrl_wr_mask[3])
205 begin
206 o_fre_cnt[31:24] <= w_ctrl_wr_data[31:24];
207 end
208 end
209
210 assign w_reg_02_rd = o_fre_cnt;
211
212 /******************************************************************************\
213 Register 0x0c~0x0f
214 \******************************************************************************/
215 assign o_tx_valid = (w_ctrl_wr_en & (w_ctrl_wr_addr[7:2] == 6'h03) & w_ctrl_wr_mask[0]);
216 assign o_tx_data = w_ctrl_wr_data[7:0];
217
218 /******************************************************************************\
219 Register 0x10~0x13
220 \******************************************************************************/
221 assign o_rx_req = i_s_axi_arvalid & o_s_axi_arready & (i_s_axi_araddr[11:0] == 12'h010);
222 assign w_reg_04_rd = {23'd0,i_rx_data};
223
224 /******************************************************************************\
225 缓存状态 0x14~0x17
226 \******************************************************************************/
227 assign w_reg_05_rd = {i_tx_fifo_wr_cnt,i_rx_fifo_rd_cnt};
228 /******************************************************************************\
229 Read Register
230 \******************************************************************************/
231 always @ (*)
232 begin
233 case(w_ctrl_rd_addr[7:2])
234 6'h00 : w_ctrl_rd_data = w_reg_00_rd ;
235 6'h01 : w_ctrl_rd_data = w_reg_01_rd ;
236 6'h02 : w_ctrl_rd_data = w_reg_02_rd ;
237 6'h04 : w_ctrl_rd_data = w_reg_04_rd ;
238 6'h05 : w_ctrl_rd_data = w_reg_05_rd ;
239 default : w_ctrl_rd_data = 32'h0000;
240 endcase
241 end
242
243 endmodule

Uart_tx.v

  1 //**************************************************************************
2 // *** file name : Uart_tx.v
3 // *** version : 1.0
4 // *** Description : Uart_tx
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.09.14
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Uart_tx
12 (
13 input i_sys_clk ,
14 input i_sys_rstn ,
15
16 input [31:0] i_fre_cnt ,
17 input [3:0] i_tx_data_bit ,
18 input [2:0] i_parity_mode ,
19 input [2:0] i_stop_bit ,
20 input [7:0] i_tx_data ,
21 input i_tx_valid ,
22 output reg o_tx_req ,
23 output reg o_uart_tx
24 );
25 localparam S_IDLE = 5'h01;
26 localparam S_START = 5'h02;
27 localparam S_DATA = 5'h04;
28 localparam S_PARITY = 5'h08;
29 localparam S_STOP = 5'h10;
30
31 reg [31:0] r_fre_cnt ;
32 reg [3:0] r_tx_data_bit ;
33 reg [2:0] r_parity_mode ;
34 reg [2:0] r_stop_bit ;
35 reg [31:0] r_fre_sum ;
36 reg r_baud_fre ;
37 reg [4:0] r_cur_state ;
38 reg [4:0] r_next_state ;
39 reg [7:0] r_uart_tx_data ;
40 reg [7:0] r_tx_data ;
41 reg [3:0] r_cnt_tx_bit ;
42 reg [2:0] r_cnt_stop_bit ;
43 reg r_parity ;
44 reg r_tx_data_en ;
45 wire w_baud_pos ;
46 wire w_baud_neg ;
47 wire w_tx_start_en ;
48 wire w_tx_data_en ;
49 wire w_tx_data_end ;
50 wire w_parity_end ;
51 wire w_tx_stop_en ;
52 wire w_tx_stop_end ;
53
54
55 function oneadd;
56 input [7:0] i_data;
57 begin
58 oneadd = i_data[7] + i_data[6] + i_data[5] + i_data[4] + i_data[3] + i_data[2] + i_data[1] + i_data[0];
59 end
60 endfunction
61 /******************************************************************************\
62 Synchronous signal
63 \******************************************************************************/
64 always@(posedge i_sys_clk)
65 begin
66 if(~i_sys_rstn)
67 begin
68 r_fre_cnt <= 'd0;
69 r_tx_data_bit <= 'd0;
70 r_parity_mode <= 'd0;
71 r_stop_bit <= 'd0;
72 end
73 else
74 begin
75 r_fre_cnt <= i_fre_cnt ;
76 r_tx_data_bit <= i_tx_data_bit ;
77 r_parity_mode <= i_parity_mode ;
78 r_stop_bit <= i_stop_bit ;
79 end
80 end
81 /******************************************************************************\
82 Generate sample baud rate signal
83 \******************************************************************************/
84 always@(posedge i_sys_clk)
85 begin
86 if(~i_sys_rstn)
87 begin
88 r_fre_sum <= 32'hffffffff;
89 end
90 else
91 begin
92 r_fre_sum <= r_fre_sum + r_fre_cnt;
93 end
94 end
95 always@(posedge i_sys_clk)
96 begin
97 r_baud_fre <= r_fre_sum[31];
98 end
99
100 assign w_baud_pos = ~r_baud_fre & r_fre_sum[31];
101 assign w_baud_neg = ~r_fre_sum[31] & r_baud_fre ;
102
103 /******************************************************************************\
104 State machine
105 \******************************************************************************/
106 always@(posedge i_sys_clk)
107 begin
108 if(~i_sys_rstn)
109 begin
110 r_cur_state <= S_IDLE;
111 end
112 else
113 begin
114 r_cur_state <= r_next_state;
115 end
116 end
117
118 always@(*)
119 begin
120 r_next_state = 'd1;
121 case(r_cur_state)
122 S_IDLE:
123 begin
124 if(i_tx_valid & w_baud_neg)
125 begin
126 r_next_state = S_START;
127 end
128 else
129 begin
130 r_next_state = S_IDLE;
131 end
132 end
133 S_START:
134 begin
135 if(w_tx_start_en)
136 begin
137 r_next_state = S_DATA;
138 end
139 else
140 begin
141 r_next_state = S_START;
142 end
143 end
144 S_DATA:
145 begin
146 if(w_tx_data_end)
147 begin
148 if(r_parity_mode[2])
149 begin
150 r_next_state = S_STOP;
151 end
152 else
153 begin
154 r_next_state = S_PARITY;
155 end
156 end
157 else
158 begin
159 r_next_state = S_DATA;
160 end
161 end
162 S_PARITY:
163 begin
164 if(w_parity_end)
165 begin
166 r_next_state = S_STOP;
167 end
168 else
169 begin
170 r_next_state = S_PARITY;
171 end
172 end
173 S_STOP:
174 begin
175 if(w_tx_stop_end)
176 begin
177 r_next_state = S_IDLE;
178 end
179 else
180 begin
181 r_next_state = S_STOP;
182 end
183 end
184 default: r_next_state = S_IDLE;
185 endcase
186 end
187
188 /******************************************************************************\
189 Uart tx data
190 \******************************************************************************/
191 assign w_tx_start_en = (r_cur_state == S_START) & w_baud_neg;
192 assign w_tx_data_en = (r_cur_state == S_DATA) & w_baud_neg;
193 assign w_tx_data_end = (r_cur_state == S_DATA) & (r_cnt_tx_bit == r_tx_data_bit);
194 assign w_parity_end = (r_cur_state == S_PARITY) & w_baud_neg;
195 assign w_tx_stop_en = (r_cur_state == S_STOP) & (w_baud_neg | w_baud_pos);
196 assign w_tx_stop_end = (r_cur_state == S_STOP) & (r_cnt_stop_bit == r_stop_bit);
197
198 always@(posedge i_sys_clk)
199 begin
200 r_tx_data_en <= w_tx_data_en;
201 end
202
203 always@(posedge i_sys_clk)
204 begin
205 if(~i_sys_rstn)
206 begin
207 r_uart_tx_data <= 8'hff;
208 end
209 else if(w_tx_start_en)
210 begin
211 r_uart_tx_data <= r_tx_data;
212 end
213 else if(r_tx_data_en)
214 begin
215 r_uart_tx_data <= {1'b1,r_uart_tx_data[7:1]};
216 end
217 end
218
219 always@(posedge i_sys_clk)
220 begin
221 if(~i_sys_rstn | w_tx_data_end)
222 begin
223 r_cnt_tx_bit <= 'd0;
224 end
225 else if(w_tx_data_en)
226 begin
227 r_cnt_tx_bit <= r_cnt_tx_bit + 1'b1;
228 end
229 end
230
231 always@(posedge i_sys_clk)
232 begin
233 if(~i_sys_rstn | w_tx_stop_end)
234 begin
235 r_cnt_stop_bit <= 'd0;
236 end
237 else if(w_tx_stop_en)
238 begin
239 r_cnt_stop_bit <= r_cnt_stop_bit + 1'b1;
240 end
241 end
242
243 always@(*)
244 begin
245 case(r_cur_state)
246 S_START:
247 if(w_baud_pos & i_tx_valid)
248 o_tx_req = 1'b1;
249 else
250 o_tx_req = 1'b0;
251 default:
252 o_tx_req = 1'b0;
253 endcase
254 end
255 assign w_deal_en = i_tx_valid & o_tx_req;
256
257 /******************************************************************************\
258 Uart tx parity
259 \******************************************************************************/
260 always@(posedge i_sys_clk)
261 begin
262 if(w_deal_en)
263 begin
264 r_tx_data <= i_tx_data;
265 end
266 end
267
268 always@(*)
269 begin
270 case(r_parity_mode)
271 3'd0 : r_parity = oneadd(r_tx_data) ? 1'b0 : 1'b1; //Odd parity
272 3'd1 : r_parity = oneadd(r_tx_data) ? 1'b1 : 1'b0; //Even parity
273 3'd2 : r_parity = 'd1; //Mark parity
274 3'd3 : r_parity = 'd0; //Space parity
275 default : r_parity = 'd0; //No parity
276 endcase
277 end
278 /******************************************************************************\
279 Uart tx serial port
280 \******************************************************************************/
281 always@(*)
282 begin
283 case(r_cur_state)
284 S_START : o_uart_tx = 'd0;
285 S_DATA : o_uart_tx = r_uart_tx_data[0];
286 S_PARITY : o_uart_tx = r_parity;
287 S_STOP : o_uart_tx = 'd1;
288 default : o_uart_tx = 'd1;
289 endcase
290 end
291
292 endmodule

Uart_rx.v

  1 //**************************************************************************
2 // *** file name : Uart_tx.v
3 // *** version : 1.0
4 // *** Description : Uart_tx
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.09.14
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Uart_rx
12 (
13 input i_sys_clk ,
14 input i_sys_rstn ,
15
16 input [31:0] i_fre_cnt ,
17 input [3:0] i_rx_data_bit ,
18 input i_parity_mode ,
19 input [2:0] i_stop_bit ,
20 output [8:0] o_rx_data ,
21 output o_rx_valid ,
22 input i_uart_rx
23
24 );
25 localparam S_IDLE = 6'h01;
26 localparam S_START = 6'h02;
27 localparam S_DATA = 6'h04;
28 localparam S_PARITY = 6'h08;
29 localparam S_STOP = 6'h10;
30 localparam S_END = 6'h20;
31
32 reg [31:0] r_fre_cnt ;
33 reg [3:0] r_rx_data_bit ;
34 reg r_parity_mode ;
35 reg [2:0] r_stop_bit ;
36 reg [2:0] r_uart_rx ;
37 reg [31:0] r_fre_sum ;
38 reg r_rx_enable ;
39 reg [1:0] r_baud_fre ;
40 reg [5:0] r_current_state ;
41 reg [5:0] r_next_state ;
42 reg [3:0] r_cnt_rx_bit ;
43 reg [7:0] r_rx_data ;
44 reg [7:0] r_rx_data1 ;
45 reg r_cnt_parity_bit ;
46 reg r_parity_er ;
47 reg r_parity_er1 ;
48 reg [2:0] r_cnt_stop_bit ;
49
50 wire w_uart_rx_pos ;
51 wire w_uart_rx_neg ;
52 wire w_data_sample_en ;
53 wire w_data_sample_end ;
54 wire w_parity_sample_en ;
55 wire w_parity_sample_end;
56 wire w_stop_sample_en ;
57 wire w_stop_sample_end ;
58 /******************************************************************************\
59 Synchronous signal
60 \******************************************************************************/
61 always@(posedge i_sys_clk)
62 begin
63 if(~i_sys_rstn)
64 begin
65 r_fre_cnt <= 'd0;
66 r_rx_data_bit <= 'd0;
67 r_parity_mode <= 'd0;
68 r_stop_bit <= 'd0;
69 end
70 else
71 begin
72 r_fre_cnt <= i_fre_cnt ;
73 r_rx_data_bit <= i_rx_data_bit;
74 r_parity_mode <= i_parity_mode;
75 r_stop_bit <= i_stop_bit ;
76 end
77 end
78
79 always@(posedge i_sys_clk)
80 begin
81 if(~i_sys_rstn)
82 begin
83 r_uart_rx <= 'd0;
84 end
85 else
86 begin
87 r_uart_rx <= {r_uart_rx[1:0],i_uart_rx};
88 end
89 end
90
91 assign w_uart_rx_pos = ~r_uart_rx[2] & r_uart_rx[1];
92 assign w_uart_rx_neg = ~r_uart_rx[1] & r_uart_rx[2];
93
94 /******************************************************************************\
95 Generate sample baud rate signal
96 \******************************************************************************/
97 always@(posedge i_sys_clk)
98 begin
99 if(~i_sys_rstn)
100 begin
101 r_fre_sum <= 'd0;
102 end
103 else if(r_rx_enable)
104 begin
105 r_fre_sum <= r_fre_sum + r_fre_cnt;
106 end
107 end
108 always@(posedge i_sys_clk)
109 begin
110 r_baud_fre <= {r_baud_fre[0],r_fre_sum[31]};
111 end
112
113 assign w_baud_pos = ~r_baud_fre[1] & r_baud_fre[0];
114 assign w_baud_neg = ~r_baud_fre[0] & r_baud_fre[1];
115
116 always@(*)
117 begin
118 case(r_current_state)
119 S_IDLE: r_rx_enable <= 'd0;
120 S_END : r_rx_enable <= 'd0;
121 default:r_rx_enable <= 1'b1;
122 endcase
123 end
124
125 /******************************************************************************\
126 State machine
127 \******************************************************************************/
128 always@(posedge i_sys_clk)
129 begin
130 if(~i_sys_rstn)
131 begin
132 r_current_state <= S_IDLE;
133 end
134 else
135 begin
136 r_current_state <= r_next_state;
137 end
138 end
139
140 always@(*)
141 begin
142 r_next_state <= 'd1;
143 case(r_current_state)
144 S_IDLE:
145 begin
146 if(w_uart_rx_neg)
147 begin
148 r_next_state <= S_START;
149 end
150 else
151 begin
152 r_next_state <= S_IDLE;
153 end
154 end
155 S_START:
156 begin
157 if(w_baud_pos & (r_uart_rx[2] == 1'b0))
158 begin
159 r_next_state <= S_DATA;
160 end
161 else if(w_baud_pos & (r_uart_rx[2] == 1'b1))
162 begin
163 r_next_state <= S_IDLE;
164 end
165 else
166 begin
167 r_next_state <= S_START;
168 end
169 end
170 S_DATA:
171 begin
172 if(w_data_sample_end)
173 begin
174 if(r_parity_mode)
175 begin
176 r_next_state <= S_STOP;
177 end
178 else
179 begin
180 r_next_state <= S_PARITY;
181 end
182 end
183 else
184 begin
185 r_next_state <= S_DATA;
186 end
187 end
188 S_PARITY:
189 begin
190 if(w_parity_sample_end)
191 begin
192 r_next_state <= S_STOP;
193 end
194 else
195 begin
196 r_next_state <= S_PARITY;
197 end
198 end
199 S_STOP:
200 begin
201 if(w_stop_sample_end)
202 begin
203 r_next_state <= S_END;
204 end
205 else
206 begin
207 r_next_state <= S_STOP;
208 end
209 end
210 S_END:
211 begin
212 r_next_state <= S_IDLE;
213 end
214 default: r_next_state <= S_IDLE;
215 endcase
216 end
217 /******************************************************************************\
218 Uart rx data sample
219 \******************************************************************************/
220 assign w_data_sample_en = (r_current_state == S_DATA) && w_baud_pos;
221 assign w_data_sample_end = (r_current_state == S_DATA) && (r_cnt_rx_bit == r_rx_data_bit);
222
223 always@(posedge i_sys_clk)
224 begin
225 if(~i_sys_rstn | w_data_sample_end)
226 begin
227 r_cnt_rx_bit <= 'd0;
228 end
229 else if(w_data_sample_en)
230 begin
231 r_cnt_rx_bit <= r_cnt_rx_bit + 1'b1;
232 end
233 end
234
235 always@(posedge i_sys_clk)
236 begin
237 if(~i_sys_rstn | w_data_sample_end)
238 begin
239 r_rx_data <= 'd0;
240 end
241 else if(w_data_sample_en)
242 begin
243 r_rx_data <= {r_uart_rx[2],r_rx_data[7:1]};
244 end
245 end
246
247 always@(posedge i_sys_clk)
248 begin
249 if(~i_sys_rstn)
250 begin
251 r_rx_data1 <= 'd0;
252 end
253 else if(w_data_sample_end)
254 begin
255 r_rx_data1 <= r_rx_data;
256 end
257 end
258
259 /******************************************************************************\
260 Uart rx parity sample
261 \******************************************************************************/
262 assign w_parity_sample_en = (r_current_state == S_PARITY) && w_baud_pos;
263 assign w_parity_sample_end = (r_current_state == S_PARITY) && (r_cnt_parity_bit == 1'b1);
264
265 always@(posedge i_sys_clk)
266 begin
267 if(~i_sys_rstn | w_parity_sample_end)
268 begin
269 r_cnt_parity_bit <= 'd0;
270 r_parity_er <= 'd0;
271 end
272 else if(w_parity_sample_en)
273 begin
274 r_cnt_parity_bit <= r_cnt_parity_bit + 1'b1;
275 r_parity_er <= r_uart_rx[2];
276 end
277 end
278
279 always@(posedge i_sys_clk)
280 begin
281 if(~i_sys_rstn)
282 begin
283 r_parity_er1 <= 'd0;
284 end
285 else if(w_parity_sample_end)
286 begin
287 r_parity_er1 <= r_parity_er;
288 end
289 end
290 /******************************************************************************\
291 Uart rx stop sample
292 \******************************************************************************/
293 assign w_stop_sample_en = (r_current_state == S_STOP) && (w_baud_pos | w_baud_neg);
294 assign w_stop_sample_end = (r_current_state == S_STOP) && (r_cnt_stop_bit == r_stop_bit);
295
296 always@(posedge i_sys_clk)
297 begin
298 if(~i_sys_rstn | w_stop_sample_end)
299 begin
300 r_cnt_stop_bit <= 'd0;
301 end
302 else if(w_stop_sample_en)
303 begin
304 r_cnt_stop_bit <= r_cnt_stop_bit + 1'b1;
305 end
306 end
307
308 assign o_rx_data = {r_rx_data1,r_parity_er1};
309 assign o_rx_valid = w_stop_sample_end;
310
311 endmodule

  以上是笔者根据时序写的代码,只是简单的跑了下仿真,没有实际上板调试。笔者是比较懒的人,因此以上代码也只是仅供参考的

仿真代码Uart_sim.v,这里把UART的tx,rx引脚直接相连。对于收发数据的位宽处理以及接收的校验位这里都应当交由软件驱动来处理。

  1 //**************************************************************************
2 // *** file name : Uart_sim.v
3 // *** version : 1.0
4 // *** Description : Uart_sim
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.09.14
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Uart_sim();
12
13 /******************************************************************************\
14 Define AXI4-lite interface port
15 \******************************************************************************/
16 wire w_axi_aclk ;
17 wire w_axi_aresetn ;
18
19 wire [31:0] w_axi_awaddr ;
20 wire w_axi_awvalid ;
21 wire w_axi_awready ;
22
23 wire [31:0] w_axi_wdata ;
24 wire [3:0] w_axi_wstrb ;
25 wire w_axi_wvalid ;
26 wire w_axi_wready ;
27
28 wire [1:0] w_axi_bresp ;
29 wire w_axi_bvalid ;
30 wire w_axi_bready ;
31
32 wire [31:0] w_axi_araddr ;
33 wire w_axi_arvalid ;
34 wire w_axi_arready ;
35
36 wire [31:0] w_axi_rdata ;
37 wire [1:0] w_axi_rresp ;
38 wire w_axi_rvalid ;
39 wire w_axi_rready ;
40
41 /******************************************************************************\
42 Instantiate AXI4-lite master module
43 \******************************************************************************/
44 m_axi4_lite_if u_m_axi4_lite_if
45 (
46 .o_sys_clk (w_axi_aclk ),
47 .o_sys_rstn (w_axi_aresetn ),
48 .o_m_axi_awaddr (w_axi_awaddr ),
49 .o_m_axi_awvalid (w_axi_awvalid ),
50 .i_m_axi_awready (w_axi_awready ),
51 .o_m_axi_wdata (w_axi_wdata ),
52 .o_m_axi_wstrb (w_axi_wstrb ),
53 .o_m_axi_wvalid (w_axi_wvalid ),
54 .i_m_axi_wready (w_axi_wready ),
55 .i_m_axi_bresp (w_axi_bresp ),
56 .i_m_axi_bvalid (w_axi_bvalid ),
57 .o_m_axi_bready (w_axi_bready ),
58 .o_m_axi_araddr (w_axi_araddr ),
59 .o_m_axi_arvalid (w_axi_arvalid ),
60 .i_m_axi_arready (w_axi_arready ),
61 .i_m_axi_rdata (w_axi_rdata ),
62 .i_m_axi_rresp (w_axi_rresp ),
63 .i_m_axi_rvalid (w_axi_rvalid ),
64 .o_m_axi_rready (w_axi_rready )
65 );
66
67 /******************************************************************************\
68 Instantiate AXI4-lite slave IP core
69 \******************************************************************************/
70 wire w_uart_data;
71
72 AXI4_UART
73 #(
74 .SYS_FRE (100_000_000 ),
75 .TX_FIFO_DEPTH (2048 ),
76 .RX_FIFO_DEPTH (2048 )
77 )
78 u_AXI4_UART
79 (
80 .i_s_axi_aclk (w_axi_aclk ),
81 .i_s_axi_aresetn (w_axi_aresetn ),
82 .i_s_axi_awaddr (w_axi_awaddr ),
83 .i_s_axi_awprot ('d0 ),
84 .i_s_axi_awvalid (w_axi_awvalid ),
85 .o_s_axi_awready (w_axi_awready ),
86 .i_s_axi_wdata (w_axi_wdata ),
87 .i_s_axi_wstrb (w_axi_wstrb ),
88 .i_s_axi_wvalid (w_axi_wvalid ),
89 .o_s_axi_wready (w_axi_wready ),
90 .o_s_axi_bresp (w_axi_bresp ),
91 .o_s_axi_bvalid (w_axi_bvalid ),
92 .i_s_axi_bready (w_axi_bready ),
93 .i_s_axi_araddr (w_axi_araddr ),
94 .i_s_axi_arprot ('d0 ),
95 .i_s_axi_arvalid (w_axi_arvalid ),
96 .o_s_axi_arready (w_axi_arready ),
97 .o_s_axi_rdata (w_axi_rdata ),
98 .o_s_axi_rresp (w_axi_rresp ),
99 .o_s_axi_rvalid (w_axi_rvalid ),
100 .i_s_axi_rready (w_axi_rready ),
101 .i_uart_rx (w_uart_data ),
102 .o_uart_tx (w_uart_data )
103 );
104
105 /******************************************************************************\
106 Perform the steps of IP core in sequence
107 \******************************************************************************/
108 reg [31:0] r_cpu_rd_data;
109 initial r_cpu_rd_data = 0;
110
111
112 initial
113 begin
114 $display("start");
115 #2000;
116 u_m_axi4_lite_if.arm_write_data(32'h00000004,32'h00810101,4'hf);//set stop bit 1/set data bit 8/set parity_mode odd/ clear fifo/enable the IP module
117 #200;
118 u_m_axi4_lite_if.arm_write_data(32'h00000008,32'd4947802,4'hf);//set the clk as 115200
119 #200;
120 u_m_axi4_lite_if.arm_write_data(32'h0000000c,{28'd0,8'h5a},4'hf);//tx data 8'h5a
121 #200;
122 u_m_axi4_lite_if.arm_write_data(32'h0000000c,{28'd0,8'h85},4'hf);//tx data 8'h85
123 #200;
124 u_m_axi4_lite_if.arm_write_data(32'h0000000c,{28'd0,8'h6f},4'hf);//tx data 8'h6f
125 #200000;
126 u_m_axi4_lite_if.arm_read_data(32'h00000010,r_cpu_rd_data);
127
128 $display("sim complete");
129 end
130
131
132 endmodule

仿真结果如下:

tx:

rx:这里的接收数据把校验位也包括了,因此这里输出的数据为9bit,实际的接收数据可以看r_rx_data1。

基于Axi4_lite的UART串口Verilog代码实现的更多相关文章

  1. Linux下读写UART串口的代码

    Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- //////////////// ...

  2. 基于STM32之UART串口通信协议(四)Printf发送

    一.前言 1.简介 前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或 ...

  3. 基于STM32之UART串口通信协议(二)发送

    一.前言 1.简介 在上一篇UART详解中,已经有了关于UART的详细介绍了,也有关于如何使用STM32CubeMX来配置UART的操作了,而在该篇博客,主要会讲解一下如何实现UART串口的发送功能. ...

  4. 基于STM32之UART串口通信协议(一)详解

    一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...

  5. 基于STM32之UART串口通信协议(三)接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  6. UART 串口示例代码

    /* uart_tx.c */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #i ...

  7. 【接口时序】3、UART串口收发的原理与Verilog实现

    一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...

  8. 串口接收端verilog代码分析

    串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

  9. 串口发送端verilog代码分析

    串口发送端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

  10. 基于ZYNQ 的UART中断实验之串口写数据到DDR3中

    1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...

随机推荐

  1. JZOJ 5346. 【NOIP2017提高A组模拟9.5】NYG的背包

    题目 分析 很神奇的贪心 \(Code\) #include<cstdio> #include<algorithm> using namespace std; typedef ...

  2. Blender插件:水滴生成器(Droplet Generator)

    推荐:将 NSDT场景编辑器 加入你的3D开发工具链. 原文地址:https://www.mvrlink.com/droplet-generator/ 1.官方介绍: 适用于Blender 3.1及更 ...

  3. 使用vscode编辑markdown

    目录 markdown在vscode中的使用 标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 列表 图片 表格 网址 代码 文本样式 引用 目录 vscode中使用的插件推荐 截图工 ...

  4. 路飞项目使用mysql数据库详细讲解

    目录 一.首先需要彻底删除原有的数据库步骤 二.去官网下载mysql步骤 三.安装mysql数据库步骤 四.一管理员身份进去cmd进行一系列命令启动 五.接下来为路飞项目创建数据库 六.luffy项目 ...

  5. Sidecar-详解 JuiceFS CSI Driver 新模式

    近期发布的 JuiceFS CSI Driver v0.18 版本中,我们提供了一种全新的方式访问文件系统,即 JuiceFS 客户端以 Sidecar 方式运行于应用 Pod 中,且客户端与应用同生 ...

  6. ModuleNotFoundError: No module named 'flask._compat'

    出现 "ModuleNotFoundError: No module named 'flask._compat'" 提示的解决办法: 参考 https://zhuanlan.zhi ...

  7. yak远程服务端搭

    前言 yak有本地模式和远端模式,本地模式是yakit客户端和核心引擎服务都在一台机器上,比如你自己的电脑 远端模式是将yak核心引擎部署到远端服务器,比如阿里云.腾讯云等 yakit只作为客户端,所 ...

  8. mysql版本升级 5.7.21-8.0.30

    当前MySQL版本为:5.7.21 升级前准备,了解5.7和8.0版本有何区别,本文主要为升级操作文档,具体建议参考官方文档,概括性的有以下几点: >默认字符集由latin1变为utf8mb4 ...

  9. MySQL 修改字段子表中的顺序

    修改字段排列位置 ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST|AFTER 字段名2 参数说明 FIRST,可选参数 将字段1,修改为表的第一个字段. AFTER 字段名 ...

  10. Go指南:方法和接口

    方法与指针重定向 带指针参数的函数必须接受一个指针: func ScaleFunc(v *Vertex, f float64) { v.X = v.X * f v.Y = v.Y * f} 以指针为接 ...