首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Verilog HDL设计练习进阶(八)--掌握利用有限状态机实现复杂时序逻辑的方法

Verilog HDL设计练习进阶(八)--掌握利用有限状态机实现复杂时序逻辑的方法

练习八. 利用有限状态机进行复杂时序逻辑的设计目的:掌握利用有限状态机实现复杂时序逻辑的方法;
在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述,在此就不赘述了。
下例是一个简单的状态机设计,功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。
模块源代码:
seqdet.v
module seqdet(x,z,clk,rst,state);
input  x,clk,rst;
output z;
output[2:0] state;
reg[2:0] state;
wire z;
parameter IDLE='d0,  A='d1,  B='d2,
                     C='d3,  D='d4,
                     E='d5,  F='d6,
                     G='d7;


assign  z = ( state==E && x==0 )? 1 : 0;    //当x=0时,状态已变为E,
                                          //状态为D时,x仍为1。因此
                      //输出为1的条件为( state==E && x==0 )。
always @(posedge clk)
   if(!rst)
          begin
          state <= IDLE;
          end
   else
          casex(state)
            IDLE : if(x==1)
                       begin
                          state <= A;
                       end
            A:     if(x==0)
                       begin
                          state <= B;
                       end
            B:     if(x==0)
                       begin
                          state <= C;
                       end
                    else
                       begin
                          state <= F;
                       end
            C:      if(x==1)
                       begin
                          state <= D;
                       end
                    else
                       begin
                          state <= G;
                       end
            D:      if(x==0)
                       begin
                          state <= E;
                       end
                    else
                       begin
                          state <= A;
                       end
            E:      if(x==0)
                       begin
                          state <= C;
                       end
                    else
                       begin
                          state <= A;
                       end
            F:      if(x==1)
                       begin
                          state <= A;
                       end
                    else
                       begin
                          state <= B;
                       end
            G:      if(x==1)
                       begin
                          state <= F;
                       end
           default:state=IDLE;      //缺省状态为初始状态。
           endcase
endmodule
测试模块源代码:
//------------------ seqdet.v -------------------
`timescale 1ns/1ns
`include "./seqdet.v"
module seqdet_Top;
  reg clk,rst;
  reg[23:0] data;
  wire[2:0] state;
  wire z,x;
  assign x=data[23];
  always  #10 clk = ~clk;
  always @(posedge clk)
         data={data[22:0],data[23]};
  initial
     begin
       clk=0;
       rst=1;
       #2 rst=0;
       #30 rst=1;
       data ='b1100_1001_0000_1001_0100;
       #500 $stop;
     end
  seqdet  m(x,z,clk,rst,state);
endmodule               
仿真波形:
[[wysiwyg_imageupload:251:]] 练习:设计一个串行数据检测器。要求是:连续4个或4个以上的1时输出为1,其他输入情况下为0。编写测试模块并给出仿真波形。
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表