项目名称
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