[FPGA] FPGA设计进阶技巧(一)-FPGA帧率采样计算

[复制链接]
413|0
 楼主 | 2018-9-5 10:41 | 显示全部楼层 |阅读模式
我们知道,实现功能可能有很多种方法,所以不同的人写出的代码不相同。通过看代码去知道它要实现的是什么功能是一件很困难的事情。有些初学者会想到采取仿真一下、看电路图、流程图、时序图、注释等等方法,都是不可取的,通过这些你还是无法知道它的功能,以及有没有错误。
那么正确的方法是什么呢?我们采取一种可称之为“反推法”或是“逆向法”的方式,这个问题就迎刃而解了。要知道,代码的目的是实现功能。无论你用那种代码,有一点完全相同的就是“实现功能”这个最终结果。了解到这一点,我们就可以通过结果(功能)去反推过程(代码),代码的思路、流程、用途就抽丝剥茧清晰的显露出来。好的,下面我们举个实例来说明怎么通过反推法有步骤的去看懂别人的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//-------------------------------------------
//帧率采样计算
reg                        fps_state;
reg        [7:0]        fps_data;
always@(posedge iCLK or negedge iRST_N)
begin
        if(!iRST_N)
                begin
                fps_data <= 0;
                fps_state <= 0;
                CMOS_FPS_DATA <= 0;
                end
        else if(Frame_valid)
                begin
                case(fps_state)
                0:        begin
                        CMOS_FPS_DATA <= CMOS_FPS_DATA;
                        if(delay_2s == 0)
                                begin
                                fps_state <= 0;
                                if(CMOS_VSYNC_over == 1'b1)        //VS上升沿,1帧写入完毕
                                        fps_data <= fps_data + 1'b1;
                                end
                        else
                                fps_state <= 1;
                        end
                1:        begin
                        fps_state <= 0;
                        fps_data <= 0;
                        CMOS_FPS_DATA <= fps_data >>1;
                        end
                endcase
                end
        else
                begin
                fps_data <= 0;
                fps_state <= 0;
                CMOS_FPS_DATA <= 0;
                end
end
endmodule
如果我们按照自上而下的顺序去看这个代码,通过代码的过程去看实现的功能会是很困难的事,甚至看不明白它要实现的是什么功能。Ok,我们现在从功能看起,这个代码要实现的是“帧率采样计算”这个功能,可以理解为图片每秒显示多少帧数。
1. 从代码中我们可以看出,CMOS_FPS_DATA 这个信号是我们所要求的信号(一秒内的帧数率);
2. CMOS_FPS_DATA <= fps_data >>1在一段时间内保持不变,才是我们所要的结果;
3. CMOS_FPS_DATA <= fps_data >>1中可以看出,CMOS_FPS_DATA是通过fps_data 这个信号来实现;
4. fps_data这个信号是怎么来的?反推到fps_data <= 0和fps_data <= fps_data + 1'b1这两个信号。fps_data复位为零,在else if(Frame_valid)条件下加1;因此fps_data为帧数率标志信号;
5. CMOS_FPS_DATA <= fps_data >>1中可以看出是通过<= fps_data >>1右移一位,也就是说除以2得到这个值的;
6. 为什么要fps_data除以2来得到这个值?于是反推到if(delay_2s == 0)这个条件。

详细文章请查看附件 FPGA设计进阶技巧(一)-FPGA帧率采样计算.pdf (105.54 KB, 下载次数: 4)
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

在线客服 快速回复 返回顶部 返回列表