//PS:由于串口每贞发10bit,所以500k的波特率每秒只发50k个字节(一字节=8bit)
//PS:当counter_1相关数据为217,counter_3相关数据为434时,波特率为115200
//PS:
当counter_1相关数据为100,counter_3相关数据为200时,波特率为250K
module uart_rxd
(rxd,ben_zhen,out_data,int0);//本程序的接收波特率由时钟频率和counter_1及counter_3共同决定,算法见下
input
rxd,ben_zhen;//输入频率的时钟,本例为50Mhz,本例的接收波特率为500k
output[7:0]out_data;//串口数据并行输出
output int0;//串口数据接收中断输出
reg[7:0]out_data;
reg[3:0]counter_2;
reg[8:0]counter_1,counter_3;
reg uart_start;
reg biaozhi;
reg int0;
always @(negedge rxd or negedge biaozhi)
begin
if(rxd==0)
uart_start=1;
else uart_start=0;
end
always @(posedge ben_zhen)
//begin
//if(rxd==0) uart_start=1;
//else
begin
biaozhi=1; //要更改接收波特率,请按说明修改下面这三行的数据:
if((uart_start)&&(counter_1<217))begin
counter_1=counter_1+1;int0=1;end//counter_1取时钟频率除以波特率再除以2,counter_1的作用是保证串口起始位的延时时间
else
if((uart_start)&&(counter_1==217)&&(counter_3<434))
counter_3=counter_3+1;//counter_3取时钟频率除以波特率
else
if((uart_start)&&(counter_1==217)&&(counter_3==434))
begin
case(counter_2)
4'd0:out_data[0]=rxd;
4'd1:out_data[1]=rxd;
4'd2:out_data[2]=rxd;
4'd3:out_data[3]=rxd;
4'd4:out_data[4]=rxd;
4'd5:out_data[5]=rxd;
4'd6:out_data[6]=rxd;
4'd7:out_data[7]=rxd;
4'd8:begin if(!rxd)out_data=8'hff;else
biaozhi=0;counter_1=0;counter_2=0;int0=0;end
//default:;
endcase
counter_2=counter_2+1;
counter_3=0;
end
else begin counter_1=0;counter_2=0;counter_3=0;
end//防止非串口信号的误低电平信号
end
//end
endmodule