【温故而知新】【4】Verilog序列检测

原创 2015年11月21日 19:08:32

【温故而知新】【4】Verilog序列检测


seuchenrui@126.com

11/21/2015 2:21:04 PM

本次博客的内容是回顾状态机的的编写。状态机的经典描述方式为三段式描述。这三段分别为:

状态转移(时序逻辑)–> 状态变换条件(组合逻辑)–> 输出逻辑(组合逻辑或者时序逻辑)。

下文为一个序列检测的状态机代码,可持续检测序列“00100111”。

代码:

`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:  
//      seuchenrui@126.com
// Create Date:09:31:28 11/21/2015 
// Design Name: 
// Module Name:sequence_00100111 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//  this is the module for check sequence "00100111"
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Usage of asynchronous resets may negatively impact FPGA resources
// and timing. In general faster and smaller FPGA designs will
// result from not using asynchronous resets. Please refer to
// the Synthesis and Simulation Design Guide for more information.      
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module sequence_00100111    (
                        clk_in,
                        reset,
                        enable_in,
                        data_in,
                        start_in,
                        result_out                  
                        );

parameter       IDLE    =   8'b0000_0000;
parameter       S0      =   8'b0000_0001;   
parameter       S1      =   8'b0000_0010;   
parameter       S2      =   8'b0000_0100;   
parameter       S3      =   8'b0000_1000;   
parameter       S4      =   8'b0001_0000;   
parameter       S5      =   8'b0010_0000;   
parameter       S6      =   8'b0100_0000;   
parameter       S7      =   8'b1000_0000;   

//-----------------------
//  DEFINE I/O
//-----------------------           
input   clk_in;
input   reset;
input   enable_in;
input   data_in;
input   start_in;

output  result_out;

//------------------------
//  DEFINE SIGNAL
//------------------------ 
reg         result_out;

reg [7:0]   next_state;
reg [7:0]   current_state;

//------------------------
//  MAIN CODE
//------------------------ 
assign  clk =   enable_in & clk_in;
//STATE TRANSFER
always@(posedge clk or negedge reset) begin
if(!reset)
    current_state   <=  IDLE;
else
    current_state   <=  next_state;
end

//TRANSFER CONDITIONS
always@(*)
begin
    next_state = IDLE;
    if(enable_in) begin
        case(current_state)
            IDLE:   
                if(start_in )
                    next_state  =   S0;
                else
                    next_state  =   IDLE;
            S0: if(data_in == 1'b1)         //0
                    next_state  =   S0;
                else
                    next_state  =   S1;
            S1: if(data_in == 1'b1)         //00
                    next_state  =   S2;
                else
                    next_state  =   S1;
            S2: if(data_in == 1'b1)         //001
                    next_state  =   S0;
                else
                    next_state  =   S3;
            S3: if(data_in == 1'b1)         //0010
                    next_state  =   S0;
                else
                    next_state  =   S4;
            S4: if(data_in == 1'b1)         //00100
                    next_state  =   S5;
                else
                    next_state  =   S1;
            S5: if(data_in == 1'b1)         //001001
                    next_state  =   S6;
                else
                    next_state  =   S3;                                         
            S6: if(data_in == 1'b1)         //0010011
                    next_state  =   S7;
                else
                    next_state  =   S0;         
            S7:                         //00100111
                    next_state  =   S0;
            default:    
                    next_state  =   IDLE;   
        endcase
    end
end                 

//OUTPUT
always@(posedge clk or negedge reset) begin
if(!reset)
    result_out  <=  1'b0;
else if(next_state == S7)
    result_out  <=  1'b1;
    else
    result_out  <=  1'b0;
end

endmodule

测试向量:

module testbench();
reg clk;
reg reset;
reg data_in;
reg enable_in;
reg start_in;
wire    result_out;


reg [7:0]   data;

sequence_00100111   uut (
                        .clk_in(clk),
                        .reset(reset),
                        .enable_in(enable_in),
                        .data_in(data_in),
                        .start_in(start_in),
                        .result_out(result_out)                 
                        );

always #5 clk = ~clk;

//assign    data    =   8'b00100111;


always@(posedge clk or negedge reset) begin
if(!reset)
    data    <= 8'b00100111;
else if(start_in)
    data    <=  {data[6:0], data[7]};
end 



always@(posedge clk or negedge reset) begin
if(!reset)
    data_in <= 'd0;
else if(start_in)
    data_in <=  data[7];
end 

initial
begin
    clk = 0;
    reset = 0;
    start_in = 0;
    enable_in = 0;
    #77;
    reset = 1;
    enable_in = 1;
    #55;
    start_in = 1;
    #500;
    enable_in = 0;
    #500;
    $finish;
end

endmodule

序列检测的状态转换图

image

XILINX ISIM仿真波形图-1
这里写图片描述

XILINX ISIM仿真波形图-2
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

温故而知新——检测类型、执行环境

instanceof 和 typeof 五种基本数据类型:number string undefined null boolean 基本数据类型用typeof检测比较方便,引用类型用in...

C#温故而知新学习系列之XML编程—5-XmlSerializer类把对象序列化为XML文档

前言    在XMLSerializer类中,包含了把对象序列化为XML文档和把XML文档反序列化为对象的方法,在创建一个类时,只要在该类的属性上加上自定义属性,XMLSerializer就可以读取...

C#温故而知新学习系列之XML编程—6-XmlSerializer类把复杂对象序列化为XML文档

前言   在上一文中我们讲了如何把对象序列化为XML文档,今天在这里我们讲一下如何把一个复杂对象序列化为XML文档。我们之前说过在创建一个实体类时,只要在该类的属性上加上自定义属性,XMLSeria...

【温故而知新】C和C++4:STL概览

一、STL简介 1、什么是STL: 标准模板库(Standard Template Library , STL)是一个C++通用库,其目的在于将组建标准化,节省开发者的时间和精力。从组织上来看,STL...

温故而知新(4)——C#函数

函数

序列检测verilog

  • 2012年11月16日 11:23
  • 28KB
  • 下载

温故而知新:Oracle的表连接

Oracle的表连接(joins): 交叉连接(Crossjoin):笛卡尔积 内连接(Inner join):-------------------->解决匹配的问题 分类:1.等值连接(Equij...

属于自己的《程序员的自我修养》之温故而知新

最近看了一本由俞甲子和石凡写的《程序员的自我修养》,这本书讲的通俗易懂,非常适合初学者去学习。而我便把最精彩的部分呈现出来。 第一章:温故而知新 第一章主要是巩固和总结计算机软硬件体系里面几个重要...

[温故而知新] 《Linux/Unix系统编程手册》——文件I/O

本文对文件IO这一块做一些梳理,记录思考的一些问题和一些待解决的问题,后续会继续更新。 I hear and I forget,I see and I remember,I do and I...
  • hackooo
  • hackooo
  • 2016年10月23日 19:41
  • 441

程序员的自我修养---笔记---第一部分 温故而知新

第一部分温故而知新 1、 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。Any problem in computer science can be solved by anothe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【温故而知新】【4】Verilog序列检测
举报原因:
原因补充:

(最多只允许输入30个字)