FPGA串口数据包解析问题
最近刚刚因为项目的原因,刚刚接触FPGA。学会了串口发送和接受的程序。现在就是一个问题:上位机给FPGA发送的是一个数据包,需要识别数据头等(比如数据格式为:FF 12 34 56-----)FF就是数据头。因此我编写一段识别数据头然后存储的代码,可是刚刚接触FPGA,能力有限,不知道哪位大神点化一二。如果有类似的工程实例就更好了。求知中---------------{:tongue:} 逻辑锁状态机。 wye11083 发表于 2013-11-11 22:50 static/image/common/back.gif逻辑锁状态机。
能说的明白点吗? case 0: if (bin == a) s <= 1;
case 1: if (bin == b) s <= 2;
xxxxxxxx 一般都是用状态机来做,定义几个状态
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 wye11083 发表于 2013-11-11 22:50 static/image/common/back.gif
逻辑锁状态机。
google都搜索不到这个名词 刚好在用的一个模块,你可以参考一下...
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:10 编辑
用的是串口,所以是以字节写的,16位的参数...
dc_wr_i 是字节写信号, 配置完后,dt_rdy_o 会有一个高表示数据准备好,dt_cry_i,用于清降该标志位. Fourier00 发表于 2013-11-13 19:41 static/image/common/back.gif
一般都是用状态机来做,定义几个状态
IDLE
HEAD
谢谢,有道理。我再问个问题。如果数据包差不多有1K的数据量。我怎么存放呢。因为最后我还要对着一串的数据进行校验,校验通过了才能使用。校验后的数据又如何存放呢? 小大琦 发表于 2013-11-20 17:06 static/image/common/back.gif
谢谢,有道理。我再问个问题。如果数据包差不多有1K的数据量。我怎么存放呢。因为最后我还要对着一串的数 ...
一般采用多fifo方案,解析 -〉 FIFO1 -〉校验 -〉FIFO2或者在解析的时候 直接就可以校验完成,直接丢入fifo就可以了,如果数据书一帧一帧 连续不断的来,可以使用乒乓ram,也可以使用fifo,如果带宽构的话,具体的方案还是要具体分析
比如说一般的以太网包 都可以解析和校验在进第一个fifo之前全部都做完,如果需要修改包,如根据包尾的的校验来丢包,就需要存入fifo,然后根据校验的结果来决定是否读这个包
你的是图像信号,应该是定长的,定长的处理起来要简单一些,在包尾的时候,读侧可以得到所有的信息,然后根据信息去读这个fifo就可以了 http://opencores.org/project,uart2bus
看uart_parser.v bx2231 发表于 2013-11-20 22:21 static/image/common/back.gif
http://opencores.org/project,uart2bus
看uart_parser.v
又认识一个好网站,就是注册还等个1-2天,还下载不了代码。 谢谢分享,好网站 项目也用到了,学习中 正好项目遇到这方面的问题,仿真没有问题,但是实测出现问题,怀疑是实时解析时丢包导致的,正在改成缓存后进行解析的方式进行处理。
页:
[1]