向李小龙学FPGA

2018年09月03日 10:56    发布者:luckyb1
还是从李小龙说起。伴随着一声“哟嚯”,飞出一脚后张开双臂身体半蹲的招牌式动作,被全球各地无数人模仿过。可是我们知道,全世界只有一个李小龙。无论你把“招式”模仿得多么惟妙惟肖,都无法达到那个效果。原因其实很简单,我们不具备他的速度和力量。采用反推法逆向思维,如果具备了他的速度与力量,任何一个招式都会威力无穷。由此可知,基本功是多么重要。前几节的内容,我们讲的是怎么“减负”,尽量卸下对于完成项目来说没有必要的学习部分。本节内容要讲的就是,对于核心知识点,必须下苦功完全掌握。我们经常会遇到这样的情况,“感觉”已经懂了,会了,但是一进入实际项目束手无策。为什么?这种情形,绝大部分时候,都是因为基本核心知识点还没有完全学通,处于半懂不懂的状态。例如:搞不清楚 add_flag和sel_flag的区别 ,不清楚变量使用的条件,不清楚计数器需要用几个已经计数器之间的关系。那么对于核心知识点,应该达到什么样的标准,才算是真正掌握了呢?例 :当收到en1=1时,执行一下操作a.间隔2个时钟周期后,dout产生宽度为5的高电平脉冲,然后b.间隔2个时钟周期后,dout产生宽度为7的高电平脉冲,然后c.间隔2个时钟周期后,dout产生宽度为3的高电平脉冲,然后d.间隔2个时钟周期后,dout产生宽度为6的高电平脉冲。当收到en2=1时,执行一下操作a.间隔4个时钟周期后,dout产生宽度为3的高电平脉冲,然后b.间隔1个时钟周期后,dout产生宽度为6的高电平脉冲,然后c.间隔6个时钟周期后,dout产生宽度为3的高电平脉冲,然后d.间隔2个时钟周期后,dout产生宽度为5的高电平脉冲。(答案如下)
    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  4142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899    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 = add_flag ;         assign end_cnt0 = add_cnt0 && cnt0==x-1 ;   always @(posedge clk or negedge rst_n)begin       if(!rst_n)begin          cnt1  <= 0;      end      else  if(add_cnt1)begin           if(end_cnt1)              cnt1  <= 0;          else              cnt1  <= cnt1 + 1;      end  end  assign add_cnt1 = end_cnt0;         assign end_cnt1 = add_cnt1 && cnt1==4-1 ;  always  @(posedge  clk or negedge rst_n)begin      if(rst_n==1'b0)begin          dout  <= 0;      end      else  if(en_dout)begin          dout  <= 1;      end      else  if(end_cnt0)begin          dout  <= 0;      end  end  assign en_dout = add_cnt0 && cnt0 == y-1;  always  @(posedge  clk or negedge rst_n)begin       if(rst_n==1'b0)begin          add_flag  <= 0;      end      else  if(en1||en2)begin          add_flag  <= 1;      end      else  if(end_cnt1)begin          add_flag  <= 0;      end  end     always  @(posedge  clk or negedge rst_n)begin       if(rst_n==1'b0)begin          sel_flag  <= 0;      end      else  if(en1)begin          sel_flag  <= 0;      end      else  if(en2)begin          sel_flag  <= 1;      end  end  always  @(*)begin       if(sel_flag==0)begin          if(cnt==0)begin          x = 7;          y = 2;         end         else if  (cnt1==1)begin          x = 9;          y = 2;         end         else if (cnt1==2)begin          x = 5;          y = 2;         end         else begin          x = 8;          y = 2;         end      end      else begin           if(cnt==0)begin          x = 7;          y = 4;         end         else if  (cnt1==1)begin          x = 7;          y = 1;         end         else if (cnt1==2)begin          x = 9;          y = 6;         end         else begin          x = 7;          y = 2;         end     end  end
类似这些习题,一直要练习到不需要思考的过程,而是形成类似于条件反射式的自然反应。掌握的要领就是不停练习反复练习。在这一点上,没有捷径可走。唯一可依托的,就是——勤奋。高深的内容都是由最基本的要素组合而成。一旦有了扎实的基本功底,就有了“李小龙的速度与力量”,很多“招式”方面的高深问题就迎刃而解了。本节中我们通过借喻“功夫”,来说明基本功的重要性以及和高深内容的关系。
该文章有附件资料,如需下载请访问 电脑版