求FPGA串口通信的接受程序的解答
//摘抄自周立功的程序//功能:实现串口接收数据
/*****************串口接收模块********************/
/** **/
/** **/
module rec(clk,clkout,Dataout,RXD,RI);
input clk,RXD;
output clkout,RI;
output Dataout; //并行数据输出
reg StartF,RI;
reg UartBuff; //接收缓存区
reg count,count_bit;
reg cnt;
reg bit_collect; //采集数据缓存区
wire clk_equ,bit1,bit2,bit3,bit4;
parameter cout=312; //始终是48MHz,所以16*9600的分频数为312.5,这里取整数
/****************波特率发生进程*******************/
always@(posedge clk)
begin
if(clk_equ)
cnt=16'd0;
else
cnt=cnt+1'b1;
end
assign clk_que=(cnt==cout);
assign clkout=clk_que;
/****************串口接收主进程*******************/
assign bit1=bit_collect&bit_collect;
assign bit2=bit_collect&bit_collect;
assign bit3=bit_collect&bit_collect;
assign bit4=bit1|bit2|bit3;
always@(posedge clk)
begin
if(clk_equ)
begin
if(!StartF) //是否处于接收状态
begin
if(!RXD)
begin
count=4'b0; //复位计数器
count_bit=4'b0;
RI=1'b0;
StartF=1'b1;
end
else RI=1'b1;
end
else
begin
count=count+1'b1; //位接收状态加1
if(count==4'd6)
bit_collect=RXD; //数据采集
if(count==4'd7)
bit_collect=RXD; //数据采集
if(count==4'd8)
begin
bit_collect=RXD; //数据采集
UartBuff=bit4;
count_bit=count_bit+1'b1; //位计数器加1
if((count_bit==4'd1)&&(UartBuff==1'b1))//判断起始位是否为0
begin
StartF=1'b0; //标志开始接受
end
RI=1'b0; //中断标志位低
end
if(count_bit>4'd9) //检测是否接受完毕
begin
RI=1'b1; //中断标志位为高标志转换结束
StartF=1'b0;
end
end
end
end
assign Dataout=UartBuff;
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其中
assign bit1=bit_collect&bit_collect;
assign bit2=bit_collect&bit_collect;
assign bit3=bit_collect&bit_collect;
assign bit4=bit1|bit2|bit3;
以及
if(count==4'd6)
bit_collect=RXD; //数据采集
if(count==4'd7)
bit_collect=RXD; //数据采集
if(count==4'd8)
begin
bit_collect=RXD; //数据采集
UartBuff=bit4;
让我费解,这个有什么用啊?求高人解答哈 多次采样,取中间点 谢谢 思想太经典了! 我想说一点的是
这程序是有点问题的
不知道楼主知道不?
页:
[1]