关于第五章的总结 FPGA Prototyping By Verilog Examples 技巧

这一章让我明白了一些以前没有真正理解的细节,真的还是需要去细细的把细节给弄清楚,多动手去写一些测试代码--这才是王道~~

关于状态机,也是fpga用来控制大型系统的常用手段--·~所以关于fsm的写法,有一些类似于潜规则一样的东西~~~~
同样类似于上一章的编程规则,先将存储器件的给挑出来,然后剩下的用组合逻辑给写出来。
主要有两个定义
Moore machine和Mealy machine
上网查资料,解释说是Moore machine为在每个状态中输出结果~~
Mealy machine为在每个转移的时候输出结果~~~

这个咋一看没有什么特别的含义~~~其实真正的测试结果是不一样的~·、
看下面的图片
关于第五章的总结 FPGA Prototyping By Verilog Examples 技巧_第1张图片

能很明显看出两者的差异~~从状态转移图上能看出来~~另外我们能够更好的从代码中感受到状态机的强大~~~~~再看仿真结果,mealy的输出明显比moore输出地实时性能更好~~代码的话,我就不敲进去了~~等下面有个上升沿和下降沿的测验,写代码仔细分析一下~~

然后有个一非常好用检测上升沿的方法~~个人觉得这个方法好牛~·而且还直接~~这接上图~~~
关于第五章的总结 FPGA Prototyping By Verilog Examples 技巧_第2张图片

输出地结果也是反映迅速·~~很强大~~

接下来就是一个关于去抖的实例~~
关于去抖我们一直都有硬件和软件两种方法~~硬件我们都是一种常用的方法,用一个低通滤波器~~串连一个电阻,然后再并联一个电阻~~这样能够达到简单滤波效果,但是实际上对原始的波形还是有影响的~~
所以一般都是软件滤波~~
书上的软件滤波·~~是连续采样采样3次~~如果是稳定的输出,的话,就说明可以稳定了,如果输出没有稳定的话,那么说明还在都抖动~~

然后就介绍下上升沿和下降沿的检测吧~~要求在一个周期内·~
module dual_edge(clk,in,reset,tick);
input clk;
input in;
input reset;

output tick;
reg tick;

localparam state_00=2'b00,//分成四个状态
                   state_01=2'b01,
                   state_11=2'b11,
                   state_10=2'b10;
               
reg [2:0]reg_state;
reg [2:0]reg_next;               

always@(posedge clk or posedge reset)
begin
       if(reset)
              reg_state<=state_00;
       else
              reg_state<=reg_next;//相当于一个d触发器
end

always@*
begin
       tick=1'b0;
       reg_next=reg_state;
       case(reg_state)
       state_00:
       begin
              if(in)//首先输入有突变,则进入这个case,reg_next=state_01,
              reg_next=state_01;
              else
              reg_next=state_00;
       end
       state_01:
       begin
              if(in)
              reg_next=state_11;//然后当clk上升沿,吧reg_next读到reg_state中取,然后此时in为1,那么reg_next变成state_11
              else
              begin     
                     reg_next=state_10;
              end
       end
       state_11:
       begin
              if(in)
                     reg_next=state_11;//然后当in变成0了,而reg_state还是等于state_01,所以reg_next变成state_10,而在下一时刻,in又变成了1,这样reg_state还是等于state_01,而reg_next变成了11,
              else
              begin
                     reg_next=state_10;
              end
       end
       state_10:
       begin     
              if(in)
                     reg_next=state_01;//只有在最有一个时钟,才有输出,这样才是正确的~~
              else
              begin
                     reg_next=state_00;
                     tick=1'b1;
              end
       end
       default: reg_next=state_00;
     endcase
   end
endmodule

这是moore输出地输出地测试结果~很明显,反应迟钝,不能在一个周期内相应~~hoho~~~~~
关于第五章的总结 FPGA Prototyping By Verilog Examples 技巧_第3张图片


关于mealy 输出地东西,代码如下:
module dual_edge(clk,in,reset,tick);
input clk;
input in;
input reset;

output tick;
reg tick;

localparam state_00=2'b00,
                   state_01=2'b01,
                   state_10=2'b10;
               
reg [2:0]reg_state;
reg [2:0]reg_next;               

always@(posedge clk or posedge reset)
begin
       if(reset)
              reg_state<=state_00;
       else
              reg_state<=reg_next;
end

always@*
begin
       tick=1'b0;
       reg_next=reg_state;
       case(reg_state)
       state_00:
       begin
              if(in)//首先输入in有变化,变高则reg_next=state_01
              reg_next=state_01;
              else
              reg_next=state_00;
       end
       state_01:
       begin
              if(in)//然后再来就是clk上升沿了,转到状态state_01,检测到in为1,然后下一时刻in变成0了,然后立即输出1,再然后clk下降沿,检测到in为0状态不变,输出仍然为1,然后in变成1,reg_next变成01,之后当in变成0的时候直接输出1,这样的话,就能够检测到输出地变化了~~
              reg_next=state_01;
              else
              begin     
                     reg_next=state_10;
                     tick=1'b1;
              end
       end
       state_10:
       begin     
              if(in)
                     reg_next=state_01;
              else
              begin
                     reg_next=state_00;
              end
       end
       default: reg_next=state_00;
     endcase
   end
endmodule

测试结果如下:
关于第五章的总结 FPGA Prototyping By Verilog Examples 技巧_第4张图片

综上所述,mealy和moore machine 都是不错的,不同的用途用不同的方法~~正确理解两种方法,是必须的~~hoho~~

你可能感兴趣的:(fpga)