在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1669|回复: 4

[资料] 反推法——破解和上帝一样的技术员代码

[复制链接]
发表于 2018-8-28 17:31:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

刚才介绍了如何通过逆向反推,高效去阅读他人的代码,快速地完成学习或者完成项目这种方法。现在给大家讲一下,在这个基础上,怎么能学习到更好的设计方法,掌握其精髓,从而提高设计水平。我们仍然以实现相同功能“帧率采样计算”的另外一组代码为例。

  

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

  

42

  

43

  

44

  

45

  

46

  

47

  
  

reg [  :0]    cnt0    ;

  

wire         add_cnt0;

  

wire         end_cnt0

  

always @(posedge clk or negedge  rst_n)begin

  

    if(!rst_n)begin

  

        cnt0 <= 0;

  

    end

  

    else if(add_cnt0)begin

  

        if(end_cnt0)

  

            cnt0 <= 0;

  

        else

  

            cnt0 <= cnt0 + 1;

  

    end

  

end

  


  

assign add_cnt0 = 1;      

  

assign end_cnt0 = add_cnt0  && cnt0==26'd25_000000-1 ;

  


  

reg [  :0]    cnt1    ;

  

wire         add_cnt1;

  

wire         end_cnt1;

  

always @(posedge clk or negedge  rst_n)begin

  

    if(!rst_n)begin

  

        cnt1 <= 0;

  

    end

  

     else if(end_cnt0)begin

  

        cnt1 <= 0;

  

    end

  

    else if(add_cnt1)begin

  

        if(end_cnt1)

  

            cnt1 <= 0;

  

        else

  

            cnt1 <= cnt1 + 1;

  

    end

  

end

  


  

assign add_cnt1 =  CMOS_VSYNC_over;      

  

assign end_cnt1 = add_cnt1  && cnt1==100-1 ;

  


  

always  @(posedge clk or negedge rst_n)begin

  

    if(rst_n==1'b0)begin

  

        CMOS_FPS_DATA <= 0;

  

    end

  

    else if(end_cnt0) begin

  

        CMOS_FPS_DATA <= cnt1;

  

    end

  

end

  



同样,通过反推法我们可以得知作者的思路如下:

1.
设定1秒内cnt0,不断+1; 数26'd25_25-000000表示1秒时间到;

2.
接下来对CMOS表示帧,设定值不超过100帧;

3.
设定清零cnt0,用cnt0数1秒的时间;

4.
CMOS_FPS_DATA <= cnt1,信号给出条件end_cnt0,至此功能得到实现。


  OK,我们现在可以简单比较一下。实现相同功能,第一个例子以2秒内'd50_000000条件下计数后除以2,第二个例子用1秒内cnt0作为时间,cnt1计数来实现。第二个例子完全没有使用data等,非常轻松地完成功能要求。

如果再深入去分析,可能会发现第二个例子有个更加奇妙之处。那就是实现了模板化设计,比如上述代码第1行到第17行处,就是一个模板,只需要键入Cnt0;对于这个模块来说,设计者仅仅输入了第16行的“1”和第17行的“26'd25_000000-1”,同时进行几个条件设置,即完成设计。这样的代码,给人的感觉就像武术大师李小龙,简单粗暴但是非常直接有效地击倒对手。

在前言中我们提到,正确的学习方法非常重要。通过思考,掌握其原理,无疑是提高自己水平最好的路径之一。在本案例实现相同功能的不同代码中,不应该是去生搬硬套,看代码后学会实现这个功能,也不仅仅应该学到运用反推法去看懂别人的代码。应该明白的是实现相同功能,有很多种方法,多去比较和思考不同设计的方法、思路、技巧,学习和借鉴其精髓,并运用到实际设计中。随着不断的积累,设计水平会得到不断的提升。

正确的学习方法还有一点是能够举一反三。上文的实例只是引用了一小部分模块,对于整个的项目同样可以运用反推法来实现。反推法看懂代码的核心,是通过功能反推过程,是一个逆向的思维过程,那么我们首先要知道的是功能点。有些同学要说了,那我不知道要实现功能是什么怎么办?功能点是一个设计目标,与什么设计方法、思路、工具完全没有关系。只需要通过看相关的数据手册、问相关的项目负责人,这个项目(模块)需要实现的是什么功能即可。对于一个整体的项目来说,其实方法是一样的。比如,一个摄像头显示的程序,分别有4个模块。我们不需要从头开始向下顺序看下去,事实上也很难看懂。我们知道最后的VGA显示是一定的(最终实现功能),那么需要什么样的VGA时序才能显示出图像呢?根据VGA的时序图、数据手册等资料,导入到模块4VGA时序模块。接着在模块4中继续反推,这个信号接口是从哪里来的?这个信号是从哪里输入的?在过程中再不断参考数据手册等资料,这样每个模块乃至每个信号都能依次推出来。

发表于 2018-8-29 09:18:16 | 显示全部楼层
好文章!!!
发表于 2018-8-29 17:04:35 | 显示全部楼层
回复 1# chop147


    好文章!!!
发表于 2018-8-29 21:14:42 | 显示全部楼层
多谢分享
发表于 2018-8-30 11:16:09 | 显示全部楼层
多谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-18 16:47 , Processed in 0.414771 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表