【温故而知新】【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
这里写图片描述

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

相关文章推荐

OpenCV-Python教程(11、轮廓检测)

相比C++而言,Python适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV的检测并绘...

OpenCV-Python教程(6、Sobel算子)

本篇文章介绍如何用OpenCV-Python来使用Sobel算子。 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python实现基本的滤波处理本文不介详细的...

OpenCV-Python教程(4、形态学处理)

提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python进行形态学处理本文不介绍形态学处理的基本概念,所以读者需要预先对其有一定的了解。 定义结构元素 形态学处理的核心就...

OpenCV + Python安装配置方法

OpenCV + Python安装配置方法 seuchenrui@126.com Python好不好用,用过才知道啊。 Python中使用OpenCV真的是非常的方便,没有像Visual studi...

Python OpenCV -- Laplacian 算子(十)

Laplacian 算子:     原理分析:   Sobel 算子 : 在一个图像区域中的边缘部分,像素值出现“跳跃”或者较大的变化。如果在此边缘部分求取一阶导数,会看到极值的出现如图: ...

Python OpenCV -- Sobel 算子(九)

Sobel  算子    Sobel  算子 -- 是一种带有方向性的滤波器,   在Python 中的原型: dst = cv2.Sobel(src, ddepth, dx, dy[, dst[,...

OpenCV-Python教程(5、初级滤波内容)

本篇文章介绍如何用OpenCV-Python来实现初级滤波功能。 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python实现基本的滤波处理本文不介绍滤波处...

OpenCV + Python 人脸检测

OpenCV + Python 人脸检测 seuchenrui@126.com 注意题目啊,这只是检测,不是识别。识别比检测难多了,以后有时间再研究。 以下的代码是OpenCV自带的例子,我做了些小...

Python + OpenCV 直方图均衡 (Histogram Equalization)

Python + OpenCV 直方图均衡 (Histogram Equalization) seuchenrui@126.com OpenCV提供了一个直方图均衡的函数,可以直接调用,使用起来非常的...

关于有限域乘法器的理解

关于有限域乘法器的理解 seuchenrui@126.com 最近在看AES的标准文档FIPS-197,其中有关于有限域乘法器的描述。虽然计算过程很简单,但是就是不明白为什么如此计算。问过度娘之后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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