UART发送模块设计

项目名称

UART发送模块设计

具体要求

按下四个独立按键,在上位机上可以接收到按键的数据

项目说明

经过了接收模块设计,这个模块就比较简单了。直接进行设计。

tx_flag_start:开始接收发送标志

tx_data:需要发送的数据

tx_data_r:发送的数据进行寄存

tx_flag:发送数据标志

bps_cnt:波特率计数

bit_flag:发送数据位数标志

data_cnt:发送数据位数计数

rs232_tx:数据线上的数据

                                   

代码设计

顶层模块设计

module uart_tx_top(
	input				clk,
	input				rst_n,
	input 	[3:0]	 	key_data,
	output			rs232_tx//发送的数据
);

wire [3:0] key_value;
uart_tx uart_tx3(
	.clk(clk),
	.rst_n(rst_n),
	.tx_data({2{key_value}}),//需要发送的数据
	.tx_flag_start(key_flag),//发送标志信号

	.rs232_tx(rs232_tx)//发送的数据
);


key_jitter_scan	
#(
	.KEY_WIDTH(4)
)
u_key_jitter_scan
(

	.clk			(clk),
	.rst_n			(rst_n),
	.key_data		(key_data),		
	.key_flag		(key_flag),
	.key_value		(key_value)	
);
endmodule

发送模块设计

module uart_tx(
	input				clk,
	input				rst_n,
	input	[7:0]		tx_data,//需要发送的数据
	input				tx_flag_start,//发送标志信号
	
	output	reg	rs232_tx//发送的数据
);

reg [7:0] tx_data_r;
reg tx_flag;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		tx_data_r<=0;
	else if(tx_flag_start && tx_flag==0)
		tx_data_r<=tx_data;

reg bit_flag;
reg [3:0] data_cnt;		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		tx_flag<=0;
	else if(tx_flag_start && tx_flag==0)
		tx_flag<=1;
	else if(data_cnt==8 && bit_flag)
		tx_flag<=0;

reg [12:0] bps_cnt;		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		bps_cnt<=0;
	else if(bps_cnt==5207)
		bps_cnt<=0;
	else if(tx_flag)
		bps_cnt<=bps_cnt+1;
	else
		bps_cnt<=0;
		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		bit_flag<=0;
	else if(tx_flag && bps_cnt==5207)
		bit_flag<=1;
	else
		bit_flag<=0;
		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		data_cnt<=0;
	else if(data_cnt==8  &&  bit_flag)
		data_cnt<=0;
	else if(bit_flag && tx_flag)
		data_cnt<=data_cnt+1;
	else
		data_cnt<=data_cnt;
		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		rs232_tx<=1;
	else if(tx_flag)
		case(data_cnt)
			0:rs232_tx<=0;
			1:rs232_tx<=tx_data_r[0];
			2:rs232_tx<=tx_data_r[1];
			3:rs232_tx<=tx_data_r[2];
			4:rs232_tx<=tx_data_r[3];
			5:rs232_tx<=tx_data_r[4];
			6:rs232_tx<=tx_data_r[5];
			7:rs232_tx<=tx_data_r[6];
			8:rs232_tx<=tx_data_r[7];
			default:rs232_tx<=1;
		endcase
	else
		rs232_tx<=1;
endmodule

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值