fpga接收串口命令并解析 ,如何实现好呢?
我的FPGA需要实现如下功能:接收一个两字节的命令,如:16'h8003,8位字节接收,然后解析,我的实现如下,1)一共三个模块,顶层模块uart_top();
2)子模块uart_ctrl( )实现串口接收数据并存入一个16字节的lpm缓冲区;
首先接收到串口数据,
... ...
然后 实现串口接收数据并存入下面的fifo
uart_r_fifo uart_r_fifo(
//存入
.data(rx_data),
.wrclk(clk_25m),
.wrreq(uart_int_rcv),
//读取
.rdclk(clk_1m),//---------------------------------------------------------------------
.rdreq(rd_cmd_sig),//----------------------------------------------
.q(q), //---------------------------------------------------------------------
// 状态指示 //----------------
.wrempty(),
.wrfull(),
.wrusedw(),
.rdempty(rdempty),
.rdfull(),
.rdusedw(),
.aclr()
);
assign cmd_in_sig =~rdempty;
2)从缓冲区内读出数据;
reg command2
moduleuart_decoder()
always @(posedge clk_1m or posedge cmd_in_sig)
if(cmd_in_sig)
begin
test_sig2_r <=1'b1;
rd_cmd_sig_r<=1'b1;
command2 <= command;
end
else
begin
rd_cmd_sig_r<=1'b0;
test_sig2_r <=1'b0;
if(command2 == 8'h80)
test_sig1_r <=1'b1;
end
endmodule
3)现在经过察看示波器,当接收到数据的时候,test_sig2_r 是一个2us的方波,test_sig1_r 信号不变,即:不能判断已经收到8'h80
如何实现这个过程比较好?
其中 cmd_in_sig 是dcfifo 读空标志的取反,只要fifo不空,该信号就会为1,就去置位rd_cmd_sig_r ,而读取fifo,这里是不是做的不好?
直接使用cmd_in_sig来置位 rd_cmd_sig_r 是不是有点问题?两个信号之间是不是有点互锁的意思?
想实现 cmd_in_sig来个上升沿,然后在1m时钟下驱动计数,然后在1m时钟的一个周期置位rd_cmd_sig_r,去读fifo,如何实现好? 接收的字节为什么要存入缓冲区,当年我做过类似的,接收30几字节的命令都不存缓存区的,直接拿去解析 toab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接收的是8位的数据,如果命令长度是比如5个字节,该如何处理?
定义一个 寄存器吗?比如 reg,然后 将数据移位存入,然后解析吗? german010 发表于 2012-11-6 23:14 static/image/common/back.gif
toab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接 ...
嗯,对。。。。。。。 ab8780000 发表于 2012-11-6 23:40 static/image/common/back.gif
嗯,对。。。。。。。
可是移位怎么处理好呢?
比如每次来8位 定义为input data1;
用于存储命令的变量定义为: command;
always @(posedge clk)
begin
command<<40'd8;
comand <=data1;
end
这样写可以吗?感觉不是太对头啊,因为在一个时钟周期内,command同时移位 并且最低位被赋值,会出问题吧? german010 发表于 2012-11-6 23:54 static/image/common/back.gif
可是移位怎么处理好呢?
比如每次来8位 定义为input data1;
用于存储命令的变量定义为: comma ...
那样写可以的,也可以这样写
always @(posedge clk)
begin
command <= {command,data1};
end
移的次数控制好来就OK 直接 解析了 {:smile:} 直接解析了
module cmd_sch
(
input clk ,
input rst_n,
input dat_in ,
output cmd_ind
);
reg dat_reg ;
reg dat_out,
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
dat_reg <= 8'd0;
else
dat_reg <= dat_in;
end
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
dat_out <= 16'd0;
else
dat_out <= {dat_reg,dat_in};
end
assign cmd_ind = (dat_out ==16'h8003)?1'b1:1'b0;
endmodule thank you ab8780000 发表于 2012-11-7 12:25 static/image/common/back.gif
那样写可以的,也可以这样写
always @(posedge clk)
begin
你好,如果我要接受的数据包比较大,比如1k。那我用FPGA接受每个字节后该怎么处理呢?之后我还要对这个数据包进行解码,一直很困惑该怎么办?(我是个FPGA菜,刚刚自己摸索,没人教,求指导) 小大琦 发表于 2013-11-7 17:50 static/image/common/back.gif
你好,如果我要接受的数据包比较大,比如1k。那我用FPGA接受每个字节后该怎么处理呢?之后我还要对这个数 ...
存到fifo里面去,然后解析 Fourier00 发表于 2013-11-7 22:12 static/image/common/back.gif
存到fifo里面去,然后解析
嗯,有点明白了。在问一个问题:关于这个解析部分,是不是就跟单片机开发差不多了,定义一个reg寄存器组?然后把解析的数据都存在里面?
(我这个项目接收的是图像数据,要求解析之后,将每个像素点灰度值都放入的对应的行列,这个我就是不知道怎么在FPGA实现。在单片机开发中,我就定义个二维数组存放数组就行了,不知道在FPGA是怎么处理的) 小大琦 发表于 2013-11-8 18:24 static/image/common/back.gif
嗯,有点明白了。在问一个问题:关于这个解析部分,是不是就跟单片机开发差不多了,定义一个reg寄存器组 ...
图像信号,放内部ram可能不合适阿,可能要存到外部存储器,不能用数组 Fourier00 发表于 2013-11-8 19:36 static/image/common/back.gif
图像信号,放内部ram可能不合适阿,可能要存到外部存储器,不能用数组
其实我整个系统流程是这样的,串口接收图像数据,fpga接到完整的数据后解析,接着将解析的数据通过LVDS方式再发出去。我现在迷惑的就是数据接收后怎么处理。按您的意思,是说:我将串口接收后的数据先依次放入外部存储器,然后再对其进行数据解析,解析完的数据岂不是还要再弄一个外部存储器存放,接着通过LVDS接口发出去?是这个意思吗?请问您有没有什么FPGA数据解析的工程实例,我想学习下。谢谢 小大琦 发表于 2013-11-9 11:24 static/image/common/back.gif
其实我整个系统流程是这样的,串口接收图像数据,fpga接到完整的数据后解析,接着将解析的数据通过LVDS方 ...
解析完成后可以近 内部存储器或者外部存储器都可以,这个还是和方案有关系的,外部存储器可以供共享的方式来进行存储,可以分成不同的块 楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。
对于指令,用状态机就好了,错误数据整帧丢弃(整帧校验,校验字放最后,一般CRC)。
FIFO最小满足即可。 Fourier00 发表于 2013-11-9 13:52 static/image/common/back.gif
解析完成后可以近 内部存储器或者外部存储器都可以,这个还是和方案有关系的,外部存储器可以供共享的方 ...
好的。我试试 xivisi 发表于 2013-11-9 14:34 static/image/common/back.gif
楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。
对于指令,用状态机就好了,错误数据整 ...
图像数据大约1K,是工程项目。数据传输还允许丢失数据。 小大琦 发表于 2013-11-10 14:35 static/image/common/back.gif
图像数据大约1K,是工程项目。数据传输还允许丢失数据。
这么小,存在内部ram里面就可以了, Fourier00 发表于 2013-11-10 14:55 static/image/common/back.gif
这么小,存在内部ram里面就可以了,
今天遇到一个问题,就是串口数据的解析不怎么会编。比如上位机发送FF 12 34 56,数据头就是FF。嗯,单片机写过好多解析代码(这不要考虑时序问题),可是FPGA第一次,不知道咋编,我想看看这方面的代码怎么编的?求指导? 学习了我也正在做这一方面的项目 求知道的 多讲解讲解
页:
[1]