小大琦 发表于 2013-11-11 19:48:05

FPGA串口数据包解析问题

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

wye11083 发表于 2013-11-11 22:50:50

逻辑锁状态机。

小大琦 发表于 2013-11-12 15:30:40

wye11083 发表于 2013-11-11 22:50 static/image/common/back.gif
逻辑锁状态机。

能说的明白点吗?

wye11083 发表于 2013-11-12 16:06:20

case 0: if (bin == a) s <= 1;
case 1: if (bin == b) s <= 2;
xxxxxxxx

Fourier00 发表于 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

wangjun403 发表于 2013-11-14 12:34:38

wye11083 发表于 2013-11-11 22:50 static/image/common/back.gif
逻辑锁状态机。

google都搜索不到这个名词

linjpxt 发表于 2013-11-14 12:57:49

刚好在用的一个模块,你可以参考一下...

module msg_async
        (        // 5a d1 d2 d3 d4 a5
        input        wire        clk_i,reset_i,       
        input        wire                 dat8_i,
        output        wire                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 state;
        reg dtry,dcwr;
       
        reg buf1,buf2,buf3,buf4;
        reg 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<=dat8_i;
                                        state<=4'h2;       
                                end
                               
                                4'h2:
                                begin
                                        buf1<=dat8_i;
                                        state<=4'h3;       
                                end
                               
                                4'h3:
                                begin
                                        buf2<=dat8_i;
                                        state<=4'h4;       
                                end
                               
                                4'h4:
                                begin
                                        buf2<=dat8_i;
                                        state<=4'h5;       
                                end
                               
                                4'h5:
                                begin
                                        buf3<=dat8_i;
                                        state<=4'h6;       
                                end
                               
                                4'h6:
                                begin
                                        buf3<=dat8_i;
                                        state<=4'h7;       
                                end
                               
                                4'h7:
                                begin
                                        buf4<=dat8_i;
                                        state<=4'h8;       
                                end
                               
                                4'h8:
                                begin
                                        buf4<=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

linjpxt 发表于 2013-11-14 13:02:20

本帖最后由 linjpxt 于 2013-11-14 13:10 编辑

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

小大琦 发表于 2013-11-20 17:06:17

Fourier00 发表于 2013-11-13 19:41 static/image/common/back.gif
一般都是用状态机来做,定义几个状态
IDLE
HEAD


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

Fourier00 发表于 2013-11-11 19:48:06

小大琦 发表于 2013-11-20 17:06 static/image/common/back.gif
谢谢,有道理。我再问个问题。如果数据包差不多有1K的数据量。我怎么存放呢。因为最后我还要对着一串的数 ...

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

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

bx2231 发表于 2013-11-20 22:21:35

http://opencores.org/project,uart2bus

看uart_parser.v

小大琦 发表于 2013-11-22 10:53:39

bx2231 发表于 2013-11-20 22:21 static/image/common/back.gif
http://opencores.org/project,uart2bus

看uart_parser.v

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

xmu234 发表于 2014-1-9 13:05:30

谢谢分享,好网站

kongethan 发表于 2014-1-10 09:51:36

项目也用到了,学习中

lgzskywolf 发表于 2015-4-6 14:24:35

正好项目遇到这方面的问题,仿真没有问题,但是实测出现问题,怀疑是实时解析时丢包导致的,正在改成缓存后进行解析的方式进行处理。
页: [1]
查看完整版本: FPGA串口数据包解析问题