


module uart_rx
#(
parameter UART_BPS = 'd9600 ,
CLK_FREQ = 'd50_000_000
)(
input wire sys_clk ,
input wire sys_rst_n ,
input wire rx ,
output reg [7:0] po_data ,
output reg po_flag
);
parameter BAUD_CNT_MAX = CLK_FREQ / UART_BPS ;
// reg define signal
reg rx_reg1 ;
reg rx_reg2 ;
reg rx_reg3 ;
reg start ;
reg work_en ;
reg [12:00] baud_cnt ;
reg bit_flag ;
reg [ 3: 0] bit_cnt ;
reg [ 7: 0] rx_data ;
reg rx_flag ;
// rx_reg1 ;rx_reg2 ;rx_reg3 ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
rx_reg1 <= 1'b1 ;
rx_reg2 <= 1'b1 ;
rx_reg3 <= 1'b1 ;
end else begin
rx_reg1 <= rx ;
rx_reg2 <= rx_reg1 ;
rx_reg3 <= rx_reg2 ;
end
end
// start ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
start <= 1'b0 ;
end else begin
if(rx_reg3 == 1'b1 && rx_reg2 == 1'b0 && bit_cnt == 4'd0) begin // 或者bit_cnt换成 work_en == 0
start <= 1'b1 ;
end else begin
start <= 1'b0 ;
end
end
end
// work_en ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
work_en <= 1'b0 ;
end else begin
if(start == 1'b1) begin
work_en <= 1'b1 ;
end else begin
if((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin
work_en <= 1'b0 ;
end else begin
work_en <= work_en ;
end
end
end
end
// [12:00] baud_cnt ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
baud_cnt <= 13'd0 ;
end else begin
if(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1) begin
baud_cnt <= 13'd0 ;
end else begin
if(work_en == 1'b1) begin
baud_cnt <= baud_cnt + 1'b1 ;
end else begin
baud_cnt <= 13'd0 ;
end
end
end
end
// always @(posedge sys_clk or negedge sys_rst_n) begin
// if(~sys_rst_n) begin
// baud_cnt <= 13'd

文章详细描述了两个UART收发模块的实现,包括接收端的采样、计数器控制、数据处理和标志位生成,以及发送端的同步、数据发送和停止位设置。还展示了两个测试模块如何使用这些接口进行数据传输。
最低0.47元/天 解锁文章
3815

被折叠的 条评论
为什么被折叠?



