搜索
bottom↓
回复: 20

fpga接收串口命令并解析 ,如何实现好呢?

[复制链接]

出0入0汤圆

发表于 2012-11-6 17:16:07 | 显示全部楼层 |阅读模式
我的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    [7:0] command2
module  uart_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,如何实现好?

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

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

出0入0汤圆

发表于 2012-11-6 19:17:35 | 显示全部楼层
接收的字节为什么要存入缓冲区,当年我做过类似的,接收30几字节的命令都不存缓存区的,直接拿去解析

出0入0汤圆

 楼主| 发表于 2012-11-6 23:14:43 | 显示全部楼层
to  ab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接收的是8位的数据,如果命令长度是比如5个字节,该如何处理?
定义一个 寄存器吗?比如 reg  [39:0],然后 将数据移位存入,然后解析吗?

出0入0汤圆

发表于 2012-11-6 23:40:08 | 显示全部楼层
german010 发表于 2012-11-6 23:14
to  ab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接 ...

嗯,对。。。。。。。

出0入0汤圆

 楼主| 发表于 2012-11-6 23:54:13 | 显示全部楼层
ab8780000 发表于 2012-11-6 23:40
嗯,对。。。。。。。

可是移位怎么处理好呢?
比如每次来8位 定义为input [7:0]data1;
用于存储命令的变量定义为: [39:0]command;
always @(posedge clk)
    begin
       command<<40'd8;
      comand[7:0] <=data1;
    end
这样写可以吗?感觉不是太对头啊,因为在一个时钟周期内,command同时移位 并且最低位被赋值,会出问题吧?

出0入0汤圆

发表于 2012-11-7 12:25:39 | 显示全部楼层
german010 发表于 2012-11-6 23:54
可是移位怎么处理好呢?
比如每次来8位 定义为input [7:0]data1;
用于存储命令的变量定义为: [39:0]comma ...

那样写可以的,也可以这样写
always @(posedge clk)
    begin
     command <= {command[31:0],data1};
    end

移的次数控制好来就OK

出0入0汤圆

 楼主| 发表于 2012-11-16 17:38:53 | 显示全部楼层
直接 解析了      

出0入0汤圆

发表于 2012-11-16 21:56:14 | 显示全部楼层
直接解析了
module cmd_sch
(
        input              clk    ,
        input              rst_n  ,
        input       [7 :0] dat_in ,
    output             cmd_ind
);
reg [7:0] dat_reg ;
reg  [15:0] 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

出0入0汤圆

 楼主| 发表于 2012-11-17 09:33:22 | 显示全部楼层
thank you               

出0入0汤圆

发表于 2013-11-7 17:50:21 | 显示全部楼层
ab8780000 发表于 2012-11-7 12:25
那样写可以的,也可以这样写
always @(posedge clk)
    begin

你好,如果我要接受的数据包比较大,比如1k。那我用FPGA接受每个字节后该怎么处理呢?之后我还要对这个数据包进行解码,一直很困惑该怎么办?(我是个FPGA菜,刚刚自己摸索,没人教,求指导)

出0入0汤圆

发表于 2013-11-7 22:12:57 | 显示全部楼层
小大琦 发表于 2013-11-7 17:50
你好,如果我要接受的数据包比较大,比如1k。那我用FPGA接受每个字节后该怎么处理呢?之后我还要对这个数 ...

存到fifo里面去,然后解析

出0入0汤圆

发表于 2013-11-8 18:24:40 | 显示全部楼层
Fourier00 发表于 2013-11-7 22:12
存到fifo里面去,然后解析

嗯,有点明白了。在问一个问题:关于这个解析部分,是不是就跟单片机开发差不多了,定义一个reg寄存器组?然后把解析的数据都存在里面?
(我这个项目接收的是图像数据,要求解析之后,将每个像素点灰度值都放入的对应的行列,这个我就是不知道怎么在FPGA实现。在单片机开发中,我就定义个二维数组存放数组就行了,不知道在FPGA是怎么处理的)

出0入0汤圆

发表于 2013-11-8 19:36:51 | 显示全部楼层
小大琦 发表于 2013-11-8 18:24
嗯,有点明白了。在问一个问题:关于这个解析部分,是不是就跟单片机开发差不多了,定义一个reg寄存器组 ...

图像信号,放内部ram可能不合适阿,可能要存到外部存储器,不能用数组

出0入0汤圆

发表于 2013-11-9 11:24:40 | 显示全部楼层
Fourier00 发表于 2013-11-8 19:36
图像信号,放内部ram可能不合适阿,可能要存到外部存储器,不能用数组

其实我整个系统流程是这样的,串口接收图像数据,fpga接到完整的数据后解析,接着将解析的数据通过LVDS方式再发出去。我现在迷惑的就是数据接收后怎么处理。按您的意思,是说:我将串口接收后的数据先依次放入外部存储器,然后再对其进行数据解析,解析完的数据岂不是还要再弄一个外部存储器存放,接着通过LVDS接口发出去?是这个意思吗?请问您有没有什么FPGA数据解析的工程实例,我想学习下。谢谢

出0入0汤圆

发表于 2013-11-9 13:52:36 | 显示全部楼层
小大琦 发表于 2013-11-9 11:24
其实我整个系统流程是这样的,串口接收图像数据,fpga接到完整的数据后解析,接着将解析的数据通过LVDS方 ...

解析完成后可以近 内部存储器或者外部存储器都可以,这个还是和方案有关系的,外部存储器可以供共享的方式来进行存储,可以分成不同的块

出0入0汤圆

发表于 2013-11-9 14:34:08 来自手机 | 显示全部楼层
楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。

对于指令,用状态机就好了,错误数据整帧丢弃(整帧校验,校验字放最后,一般CRC)。
FIFO最小满足即可。

出0入0汤圆

发表于 2013-11-10 14:34:16 | 显示全部楼层
Fourier00 发表于 2013-11-9 13:52
解析完成后可以近 内部存储器或者外部存储器都可以,这个还是和方案有关系的,外部存储器可以供共享的方 ...

好的。我试试

出0入0汤圆

发表于 2013-11-10 14:35:28 | 显示全部楼层
xivisi 发表于 2013-11-9 14:34
楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。

对于指令,用状态机就好了,错误数据整 ...

图像数据大约1K,是工程项目。数据传输还允许丢失数据。

出0入0汤圆

发表于 2013-11-10 14:55:20 | 显示全部楼层
小大琦 发表于 2013-11-10 14:35
图像数据大约1K,是工程项目。数据传输还允许丢失数据。

这么小,存在内部ram里面就可以了,

出0入0汤圆

发表于 2013-11-11 18:54:33 | 显示全部楼层
Fourier00 发表于 2013-11-10 14:55
这么小,存在内部ram里面就可以了,

今天遇到一个问题,就是串口数据的解析不怎么会编。比如上位机发送FF 12 34 56,数据头就是FF。嗯,单片机写过好多解析代码(这不要考虑时序问题),可是FPGA第一次,不知道咋编,我想看看这方面的代码怎么编的?求指导?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:13

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

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