前言
uart的发送和接收已经告一段落。在数字世界中,传输的就是0和1,所以串口通信这种传输方式是非常常见的,看来也需要了解I2C和SPI。
00.串口发送模块
01.串口接收模块
02.串口接收模块仿真
`timescale 1ns/1ns
`define clock_period 20
module uart_byte_rx_tb;
reg Clk ;
reg Rst_n ;
reg send_en ;
reg [2:0] baud_set ;
reg [7:0] data_byte ;
wire rs232_tx ;
wire tx_done ;
wire tx_state ;
wire [7:0] data_byte_r ;
wire rx_done;
uart_byte_rx uart_byte_rx_inst(
.Clk (Clk ),
.Rst_n (Rst_n ),
.rs232_rx (rs232_tx ),
.baud_set (baud_set ),
.data_byte (data_byte_r),
.rx_done (rx_done )
);
uart_byte_tx uart_byte_tx_inst(
.Clk (Clk ),
.Rst_n (Rst_n ),
.send_en (send_en ),
.baud_set (baud_set ),
.data_byte (data_byte ),
.rs232_tx (rs232_tx ),
.tx_done (tx_done ),
.tx_state (tx_state )
);
//产生时钟
initial Clk = 1'b1;
always #(`clock_period/2) Clk = ~Clk;
//产生激励信号
initial begin
Rst_n = 1'b0;
data_byte = 8'b0;
send_en = 1'b0;
baud_set = 3'd0;
#(`clock_period*20 + 1);
Rst_n = 1'b1;
#(`clock_period*50);
data_byte = 8'haa;
send_en = 1'd1;
#`clock_period;
send_en = 1'd0;
@(posedge rx_done);
#(`clock_period*5000);
data_byte = 8'h55;
send_en = 1'd1;
#`clock_period;
send_en = 1'd0;
@(posedge rx_done);
#(`clock_period*5000);
data_byte = 8'hdc;
send_en = 1'd1;
#`clock_period;
send_en = 1'd0;
@(posedge rx_done);
#(`clock_period*5000);
data_byte = 8'hcd;
send_en = 1'd1;
#`clock_period;
send_en = 1'd0;
@(posedge rx_done);
#(`clock_period*5000);
$stop;
end
endmodule
03.功能仿真如下
后记
后面打算做一个较为复杂的uart回环测试。