搜索
bottom↓
回复: 4

求FPGA串口通信的接受程序的解答

[复制链接]

出0入0汤圆

发表于 2009-10-8 17:22:49 | 显示全部楼层 |阅读模式
//摘抄自周立功的程序
//功能:实现串口接收数据
/*****************串口接收模块********************/
/**                                                **/
/**                                                **/
module rec(clk,clkout,Dataout,RXD,RI);
input            clk,RXD;
output            clkout,RI;
output[7:0]        Dataout;            //并行数据输出
reg                StartF,RI;
reg[9:0]        UartBuff;            //接收缓存区
reg[3:0]        count,count_bit;
reg[15:0]        cnt;
reg[2:0]        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[0]&bit_collect[1];
assign    bit2=bit_collect[1]&bit_collect[2];
assign    bit3=bit_collect[0]&bit_collect[2];
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[0]=RXD;    //数据采集
            if(count==4'd7)
                bit_collect[1]=RXD;    //数据采集
            if(count==4'd8)
            begin   
                bit_collect[2]=RXD;    //数据采集
                UartBuff[count_bit]=bit4;
                count_bit=count_bit+1'b1;    //位计数器加1
                if((count_bit==4'd1)&&(UartBuff[0]==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[8:1];
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其中
assign    bit1=bit_collect[0]&bit_collect[1];
assign    bit2=bit_collect[1]&bit_collect[2];
assign    bit3=bit_collect[0]&bit_collect[2];
assign    bit4=bit1|bit2|bit3;
以及
            if(count==4'd6)
                bit_collect[0]=RXD;    //数据采集
            if(count==4'd7)
                bit_collect[1]=RXD;    //数据采集
            if(count==4'd8)
            begin   
                bit_collect[2]=RXD;    //数据采集
                UartBuff[count_bit]=bit4;
让我费解,这个有什么用啊?求高人解答哈

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

发表于 2009-10-8 17:57:49 | 显示全部楼层
多次采样,取中间点

出0入0汤圆

 楼主| 发表于 2009-10-10 10:25:52 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2011-1-27 09:24:39 | 显示全部楼层
思想太经典了!

出0入0汤圆

发表于 2011-1-27 21:20:05 | 显示全部楼层
我想说一点的是
这程序是有点问题的
不知道楼主知道不?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 21:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表