搜索
bottom↓
回复: 14

FPGA串口数据包解析问题

[复制链接]

出0入0汤圆

发表于 2013-11-11 19:48:05 | 显示全部楼层 |阅读模式
      最近刚刚因为项目的原因,刚刚接触FPGA。学会了串口发送和接受的程序。现在就是一个问题:上位机给FPGA发送的是一个数据包,需要识别数据头等(比如数据格式为:FF 12 34 56-----)FF就是数据头。因此我编写一段识别数据头然后存储的代码,可是刚刚接触FPGA,能力有限,不知道哪位大神点化一二。如果有类似的工程实例就更好了。求知中---------------

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入442汤圆

发表于 2013-11-11 22:50:50 | 显示全部楼层
逻辑锁状态机。

出0入0汤圆

 楼主| 发表于 2013-11-12 15:30:40 | 显示全部楼层
wye11083 发表于 2013-11-11 22:50
逻辑锁状态机。

能说的明白点吗?

出0入442汤圆

发表于 2013-11-12 16:06:20 | 显示全部楼层
case 0: if (bin == a) s <= 1;
case 1: if (bin == b) s <= 2;
xxxxxxxx

出0入0汤圆

发表于 2013-11-13 19:41:13 | 显示全部楼层
一般都是用状态机来做,定义几个状态
IDLE
HEAD

alway@(*)
begin
    case(sta_curr)
          IDLE   
      if(dat == 8’hff)
     sta_next = HEAD;
    else
       sta_next = IDLE;
        HEAD:
     if(dat == 0x01)
        sta_next = TYPE ;
     else
       sta_next = IDLE;
end

always@(posedge clk )
begin
  sta_cur <= sta_next
end

出0入0汤圆

发表于 2013-11-14 12:34:38 | 显示全部楼层
wye11083 发表于 2013-11-11 22:50
逻辑锁状态机。

google都搜索不到这个名词

出0入0汤圆

发表于 2013-11-14 12:57:49 | 显示全部楼层
刚好在用的一个模块,你可以参考一下...

module msg_async
        (        // 5a d1 d2 d3 d4 a5
        input        wire        clk_i,reset_i,       
        input        wire         [7:0]        dat8_i,
        output        wire        [15:0]        kp_o,ki_o,k2_o,k3_o,
        input wire dc_wr_i,dt_cr_i,
        output wire dc_wc_o,dt_ry_o       
        );
       
        reg [3:0] state;
        reg dtry,dcwr;
       
        reg [15:0] buf1,buf2,buf3,buf4;
        reg [15:0] msg1,msg2,msg3,msg4;
       
        assign dc_wc_o=dcwr;
        assign dt_ry_o=dtry;
       
        assign kp_o=msg1;
        assign ki_o=msg2;
        assign k2_o=msg3;
        assign k3_o=msg4;
       
        always @ (posedge clk_i or posedge reset_i)
        begin
                if (reset_i == 1'b1)
                begin
                        state<=0;
                        dcwr<=0;
                        dtry<=0;
                        msg1<=0;
                        msg2<=0;
                        msg3<=0;
                        msg4<=0;
                end
                else
                begin
                        if((dtry==1'b1)&&(dt_cr_i==1'b1))        dtry<=0;
                       
                        if((dc_wr_i==1'b1)&&(dcwr==1'b0))
                        begin
                                dcwr<=1'b1;
                                case (state)
                                4'h0:
                                begin                               
                                        if(dat8_i==8'h5a)
                                        begin                                               
                                                state<=4'h1;                                       
                                        end
                                end
                               
                                4'h1:
                                begin
                                        buf1[15:8]<=dat8_i;
                                        state<=4'h2;       
                                end
                               
                                4'h2:
                                begin
                                        buf1[7:0]<=dat8_i;
                                        state<=4'h3;       
                                end
                               
                                4'h3:
                                begin
                                        buf2[15:8]<=dat8_i;
                                        state<=4'h4;       
                                end
                               
                                4'h4:
                                begin
                                        buf2[7:0]<=dat8_i;
                                        state<=4'h5;       
                                end
                               
                                4'h5:
                                begin
                                        buf3[15:8]<=dat8_i;
                                        state<=4'h6;       
                                end
                               
                                4'h6:
                                begin
                                        buf3[7:0]<=dat8_i;
                                        state<=4'h7;       
                                end
                               
                                4'h7:
                                begin
                                        buf4[15:8]<=dat8_i;
                                        state<=4'h8;       
                                end
                               
                                4'h8:
                                begin
                                        buf4[7:0]<=dat8_i;
                                        state<=4'h0f;       
                                end
                               
                                4'h0f:
                                begin
                                        if(dat8_i==8'ha5)
                                        begin
                                                dtry<=1;
                                                msg1<=buf1;
                                                msg2<=buf2;
                                                msg3<=buf3;       
                                                msg4<=buf4;
                                        end
                                        state<=4'h0;       
                                end                       
                                endcase
                        end
                        else
                        begin
                                dcwr<=dc_wr_i;
                        end
                end
        end
endmodule

出0入0汤圆

发表于 2013-11-14 13:02:20 | 显示全部楼层
本帖最后由 linjpxt 于 2013-11-14 13:10 编辑

用的是串口,所以是以字节写的,16位的参数...
dc_wr_i 是字节写信号, 配置完后,  dt_rdy_o 会有一个高表示数据准备好,dt_cry_i,用于清降该标志位.

出0入0汤圆

 楼主| 发表于 2013-11-20 17:06:17 | 显示全部楼层
Fourier00 发表于 2013-11-13 19:41
一般都是用状态机来做,定义几个状态
IDLE
HEAD

谢谢,有道理。我再问个问题。如果数据包差不多有1K的数据量。我怎么存放呢。因为最后我还要对着一串的数据进行校验,校验通过了才能使用。校验后的数据又如何存放呢?

出0入0汤圆

发表于 2013-11-11 19:48:06 | 显示全部楼层
小大琦 发表于 2013-11-20 17:06
谢谢,有道理。我再问个问题。如果数据包差不多有1K的数据量。我怎么存放呢。因为最后我还要对着一串的数 ...

一般采用多fifo方案,解析 -〉 FIFO1 -〉校验 -〉FIFO2  或者在解析的时候 直接就可以校验完成,直接丢入fifo就可以了,如果数据书一帧一帧 连续不断的来,可以使用乒乓ram,也可以使用fifo,如果带宽构的话,具体的方案还是要具体分析
比如说一般的以太网包 都可以解析和校验在进第一个fifo之前全部都做完,如果需要修改包,如根据包尾的的校验来丢包,就需要存入fifo,然后根据校验的结果来决定是否读这个包

你的是图像信号,应该是定长的,定长的处理起来要简单一些,在包尾的时候,读侧可以得到所有的信息,然后根据信息去读这个fifo就可以了

出0入0汤圆

发表于 2013-11-20 22:21:35 | 显示全部楼层
http://opencores.org/project,uart2bus

看uart_parser.v

出0入0汤圆

 楼主| 发表于 2013-11-22 10:53:39 | 显示全部楼层
bx2231 发表于 2013-11-20 22:21
http://opencores.org/project,uart2bus

看uart_parser.v

又认识一个好网站,就是注册还等个1-2天,还下载不了代码。

出0入0汤圆

发表于 2014-1-9 13:05:30 | 显示全部楼层
谢谢分享,好网站

出0入0汤圆

发表于 2014-1-10 09:51:36 | 显示全部楼层
项目也用到了,学习中

出0入0汤圆

发表于 2015-4-6 14:24:35 | 显示全部楼层
正好项目遇到这方面的问题,仿真没有问题,但是实测出现问题,怀疑是实时解析时丢包导致的,正在改成缓存后进行解析的方式进行处理。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:24

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

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