verilog串口没有C语言灵活,用verilog写的串口转并口程序

//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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值