german010 发表于 2012-11-6 17:16:07

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,如何实现好?

ab8780000 发表于 2012-11-6 19:17:35

接收的字节为什么要存入缓冲区,当年我做过类似的,接收30几字节的命令都不存缓存区的,直接拿去解析

german010 发表于 2012-11-6 23:14:43

toab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接收的是8位的数据,如果命令长度是比如5个字节,该如何处理?
定义一个 寄存器吗?比如 reg,然后 将数据移位存入,然后解析吗?

ab8780000 发表于 2012-11-6 23:40:08

german010 发表于 2012-11-6 23:14 static/image/common/back.gif
toab8780000,请教一下 ,能否说说你是怎么解析的,
开始我也是想 直接 解析的,但感觉不好处理,因为 接 ...

嗯,对。。。。。。。

german010 发表于 2012-11-6 23:54:13

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同时移位 并且最低位被赋值,会出问题吧?

ab8780000 发表于 2012-11-7 12:25:39

german010 发表于 2012-11-6 23:54 static/image/common/back.gif
可是移位怎么处理好呢?
比如每次来8位 定义为input data1;
用于存储命令的变量定义为: comma ...

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

移的次数控制好来就OK

german010 发表于 2012-11-16 17:38:53

直接 解析了       {:smile:}

Fourier00 发表于 2012-11-16 21:56:14

直接解析了
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

german010 发表于 2012-11-17 09:33:22

thank you               

小大琦 发表于 2013-11-7 17:50:21

ab8780000 发表于 2012-11-7 12:25 static/image/common/back.gif
那样写可以的,也可以这样写
always @(posedge clk)
    begin


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

Fourier00 发表于 2013-11-7 22:12:57

小大琦 发表于 2013-11-7 17:50 static/image/common/back.gif
你好,如果我要接受的数据包比较大,比如1k。那我用FPGA接受每个字节后该怎么处理呢?之后我还要对这个数 ...

存到fifo里面去,然后解析

小大琦 发表于 2013-11-8 18:24:40

Fourier00 发表于 2013-11-7 22:12 static/image/common/back.gif
存到fifo里面去,然后解析

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

Fourier00 发表于 2013-11-8 19:36:51

小大琦 发表于 2013-11-8 18:24 static/image/common/back.gif
嗯,有点明白了。在问一个问题:关于这个解析部分,是不是就跟单片机开发差不多了,定义一个reg寄存器组 ...

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

小大琦 发表于 2013-11-9 11:24:40

Fourier00 发表于 2013-11-8 19:36 static/image/common/back.gif
图像信号,放内部ram可能不合适阿,可能要存到外部存储器,不能用数组

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

Fourier00 发表于 2013-11-9 13:52:36

小大琦 发表于 2013-11-9 11:24 static/image/common/back.gif
其实我整个系统流程是这样的,串口接收图像数据,fpga接到完整的数据后解析,接着将解析的数据通过LVDS方 ...

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

xivisi 发表于 2013-11-9 14:34:08

楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。

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

小大琦 发表于 2013-11-10 14:34:16

Fourier00 发表于 2013-11-9 13:52 static/image/common/back.gif
解析完成后可以近 内部存储器或者外部存储器都可以,这个还是和方案有关系的,外部存储器可以供共享的方 ...

好的。我试试

小大琦 发表于 2013-11-10 14:35:28

xivisi 发表于 2013-11-9 14:34 static/image/common/back.gif
楼主图像多大?怎么用串口传?练习用?FPGA内部有RAM放里面好了。

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

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

Fourier00 发表于 2013-11-10 14:55:20

小大琦 发表于 2013-11-10 14:35 static/image/common/back.gif
图像数据大约1K,是工程项目。数据传输还允许丢失数据。

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

小大琦 发表于 2013-11-11 18:54:33

Fourier00 发表于 2013-11-10 14:55 static/image/common/back.gif
这么小,存在内部ram里面就可以了,

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

wenxin0000 发表于 2013-11-22 14:11:08

学习了我也正在做这一方面的项目 求知道的 多讲解讲解
页: [1]
查看完整版本: fpga接收串口命令并解析 ,如何实现好呢?