flashman911 发表于 2009-10-8 17:22:49

求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;
让我费解,这个有什么用啊?求高人解答哈

zkf0100007 发表于 2009-10-8 17:57:49

多次采样,取中间点

flashman911 发表于 2009-10-10 10:25:52

谢谢

hbchf 发表于 2011-1-27 09:24:39

思想太经典了!

liwboy 发表于 2011-1-27 21:20:05

我想说一点的是
这程序是有点问题的
不知道楼主知道不?
页: [1]
查看完整版本: 求FPGA串口通信的接受程序的解答