UART发送模块

 熟悉了以后看

 波特率计算

  

module uart_tx(
	Clk,
	Rst_n,
	baud_set,
	data_byte,
	send_en,
	
	rs232_tx,
	Tx_Done,
	uart_state //*******
);
	input    Clk;
	input    Rst_n;
	input  [2:0]  baud_set;
	input   [7:0] data_byte;//******[9:0] ---> [7:0]
	input    send_en;
	
	output reg [7:0] rs232_tx;   //******[7:0]
	output reg     Tx_Done;
	output reg     uart_state; //*******
	
	reg [16:0] div_cnt;//分频计数器
	reg bps_clk;//分频计数时钟
	reg [15:0] bps_DR;  //分频计算最大值
	reg [3:0] bps_cnt;//波特率计算时钟
	
	reg [7:0] r_data_byte;//寄存器
	
	localparam START_BIT = 1'b0; 
	localparam STOP_BIT = 1'b1; 
	
	//uart_state
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		uart_state <= 1'b0;
	else if(send_en)
		uart_state <= 1'b1;
	else if(Tx_Done)
		uart_state <= 1'b0;
	else
		uart_state <= uart_state;
	
	//r_data_byte寄存器
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		r_data_byte <= 8'd0;
	else if(send_en)
		r_data_byte <= data_byte;
	else
		r_data_byte <= r_data_byte;
	
	//DR_LUT
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		bps_DR <= 16'd5207;
	else begin
		case(baud_set)
			0:bps_DR <= 16'd5207; //9600
			1:bps_DR <= 16'd2603;
			2:bps_DR <= 16'd1301;
			3:bps_DR <= 16'd867;
			4:bps_DR <= 16'd433;
			default:bps_DR <= 16'd5207;
		endcase
	end
	
	//分频计数器
	always@(posedge Clk or negedge Rst_n) 
	begin
		if(!Rst_n) 
			div_cnt <= 16'd0;
		else if(uart_state)begin  //满足大条件使能时,en_cnt可以用uart_state替换
			if(div_cnt ==  bps_DR) //计数到最大值 
				div_cnt <= 16'd0;
			else
				div_cnt <= div_cnt + 1'd1;
		 end
		 else
		 div_cnt <= 16'd0; //不满足使能时就不计数
	end
	
	//bps_clk;
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		bps_clk <= 1'b0;
	else if(div_cnt == 16'd1)  //计算到1就产生高脉冲
		bps_clk <= 1'b1;
	else
		bps_clk <= 1'b0;  //bps_clk + 1'b1 ---> 1'b0
	
	//bps_cnt
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		bps_cnt <= 4'b0;
	else if(Tx_Done)   //clr等于Tx_Done
		bps_cnt <= 4'b0;
	else if(bps_clk)
		bps_cnt <= bps_cnt + 1'b1;
	else
		bps_cnt <= bps_cnt;
		
	//Tx_Done
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		Tx_Done <= 1'b0;
	else if(bps_cnt == 4'd11)
		Tx_Done <= 1'b1;
	else
		Tx_Done <= 1'b0;
		
	//十选一多路器
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		rs232_tx <=1'b1;
	else begin
		case(bps_cnt)
			 0:rs232_tx <= 1'b1; //高电平输出
			 1:rs232_tx <= START_BIT;
			 2:rs232_tx <= r_data_byte[0];
			 3:rs232_tx <= r_data_byte[1];
			 4:rs232_tx <= r_data_byte[2];
			 5:rs232_tx <= r_data_byte[3];
			 6:rs232_tx <= r_data_byte[4];
			 7:rs232_tx <= r_data_byte[5];
			 8:rs232_tx <= r_data_byte[6]; 
			 9:rs232_tx <= r_data_byte[7];
		   10:rs232_tx <= STOP_BIT;
			default:rs232_tx <=1'b1;
		endcase
	end
	
endmodule

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值