【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL70

序列检测器(Moore型)

描述

请用Moore型状态机实现序列"1101"从左至右的不重叠检测

电路的接口如下图所示。当检测到"1101 ",Y输出一个时钟周期的高电平脉冲

接口电路图如下:

输入描述:

input clk ,

input rst_n ,

input din ,

输出描述:

output reg Y

解题思路

我们给出以下两种解题思路

  • Moore型状态机
  • 一般时序逻辑电路

Moore型状态机

moore型状态机的输出仅依赖于当前状态而与输入无关

设置以下状态:

IDLE(S0):初始状态,表示电路还没有收到任何一个有效数值

S1 :表示电路收到了一个有效的"1";

S2 :表示电路收到了两个连续有效数据"11";

S3 :表示电路收到了三个连续有效数据"110";

S4 :表示电路收到了四个连续有效数据"1101";

原始状态图

根据题目中要求*"当检测到"1101",Y输出一个时钟周期的高电平脉冲。"* ,画出其(Moore型)原始状态图

原始状态表

对应地,给出其原始状态表

采用状态机三段式写法:

代码如下:
cpp 复制代码
`timescale 1ns/1ns

module det_moore(
   input                clk   ,
   input                rst_n ,
   input                din   ,
 
   output	reg         Y   
);

reg [3:0] current_state, next_state;

parameter [3:0] IDLE =4'b0000;
parameter [3:0] S1 =4'b0001;
parameter [3:0] S2 =4'b0011;
parameter [3:0] S3 =4'b0110;
parameter [3:0] S4 =4'b1101;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) current_state <= IDLE;
    else        current_state <= next_state;
end

always @(*) begin
    case (current_state)
    IDLE: begin if(din == 1'b1) next_state = S1; else next_state = IDLE; end
    S1: begin if(din == 1'b1) next_state = S2; else next_state = IDLE; end    
    S2: begin if(din == 1'b0) next_state = S3; else next_state = S2; end    
    S3: begin if(din == 1'b1) next_state = S4; else next_state = S3; end    
    S4: begin if(din == 1'b1) next_state = S1; else next_state = IDLE; end 
    default: next_state = IDLE;
    endcase
end
//输出Y仅与当前状态S有关,与输入din取值无关
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) Y = 1'b0;
    else begin
        case (current_state) 
            IDLE: Y = 1'b0;
            S1:   Y = 1'b0;
            S2:   Y = 1'b0;
            S3:   Y = 1'b0;
            S4:   Y = 1'b1;
            default:Y = 1'b0;
        endcase
    end
end

endmodule

一般时序逻辑电路设计方法

二进制状态表

将状态S0~S4 进行依次编号,即:000~100 ;因此,可将上述的原始状态表化为如下所示的二进制状态表

卡诺图

根据二进制状态表画出次态卡诺图

确定激励函数输出函数

代码如下:
cpp 复制代码
`timescale 1ns/1ns

module det_moore(
   input                clk   ,
   input                rst_n ,
   input                din   ,
 
   output	reg         Y   
);

//代码二
wire d0,d1,d2,q0,q1,q2;

assign d2 = din&q0&q1&~q2;
assign d1 = din&q0&~q1&~q2 | ~q0&q1&~q2;
assign d0 = ~din&~q0&q1&~q2 | din&~q0&~q1;
assign y =  ~q0&~q1&q2;

DFF D0(.clk(clk), .rst_n(rst_n), .D(d0), .Q(q0));
DFF D1(.clk(clk), .rst_n(rst_n), .D(d1), .Q(q1));
DFF D2(.clk(clk), .rst_n(rst_n), .D(d2), .Q(q2));

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) Y <= 1'b0;
    else        Y = ~q0&~q1&q2;
end
endmodule

module DFF(
   input                clk   ,
   input                rst_n ,
   input                D     ,
 
   output	reg         Q    

); 
always@(posedge clk or negedge rst_n) begin
    if (!rst_n) Q <= 1'b0;
    else        Q <= D;
end
endmodule
相关推荐
知识分享小能手15 分钟前
Vue3 学习教程,从入门到精通,Vue 3 + Tailwind CSS 全面知识点与案例详解(31)
前端·javascript·css·vue.js·学习·typescript·vue3
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [arm][lds]
linux·运维·arm开发·笔记·学习
范纹杉想快点毕业2 小时前
C 语言主控开发与显控开发能力体系及技术栈详解,STM32、QT、嵌入式、边缘系统显示
stm32·单片机·tcp/ip·microsoft·fpga开发·51单片机·wpf
晨非辰2 小时前
#C语言——刷题攻略:牛客编程入门训练(六):运算(三)-- 涉及 辗转相除法求最大公约数
c语言·开发语言·经验分享·学习·学习方法·visual studio
Gloria_niki3 小时前
爬虫与数据分析结合案例学习总结
爬虫·学习·数据分析
秋风战士3 小时前
通信算法之306:精通FPGA-笔记核心
笔记·fpga开发
一颗正在价投韭菜3 小时前
《范仲淹传》读书笔记与摘要
笔记·学习·范仲淹
微小冷4 小时前
OV5640 相机开发流程
fpga开发·verilog·ov5640·双目相机·相机开发
遇见尚硅谷5 小时前
C语言:单链表学习
java·c语言·学习
老虎06276 小时前
JavaWeb(苍穹外卖)--学习笔记17(Apache Echarts)
笔记·学习·apache