SssGy__ 2023-06-19 01:03 采纳率: 78.9%
浏览 23
已结题

数字逻辑电路——时钟状态机 (verilog)

设计一个具有一个输入X、一个复位输入信号RET和一个输出Z的时钟同步状态机(时钟输入clk),Z=1的条件:连续4个时钟脉冲触发沿X的值为1010。否则Z输出为0。
(1)画出状态图、列出状态表。(2)确定最少使用几个D触发器(3)写出状态分配表(4)写出状态方程、激励法方程和输出方程(5)画出电路图(6)用verilog代码实现并写出测试模块

  • 写回答

1条回答 默认 最新

  • 竹山全栈 2023-06-19 08:27
    关注

    (1) 状态图和状态表如下:

    状态图

    状态表如下:

    状态XRET下一状态Z
    S0S00
    S10S20
    S21S30
    S30S40
    S41S50
    S50S60
    S61S70
    S70S81
    S80S20

    其中,S0为初始状态,RET为复位输入信号,Z为输出信号,'next state'表示下一状态。

    (2) 最少需要3个D触发器来实现。

    (3) 状态分配表如下:

    当前状态/ZD2D1D0
    S0/0000
    S1/0001
    S2/0010
    S3/0011
    S4/0100
    S5/0101
    S6/0110
    S7/1111
    S8/0001

    (4) 状态方程、激励函数、输出方程如下:

    状态方程:D2=RET&Z&(D1)&(D2)|(RET&(~Z)&D1&D2);

    激励函数:D1=X;

    输出方程:Z=(D2&(D1)&D0&(RET));

    (5) 电路图如下:

    电路图

    (6) Verilog代码如下:

    module state_machine(input clk, input X, input RET, output reg Z);
        reg [2:0] D;
        always @(posedge clk) begin
            if (RET) begin
                 D <= #1 3'b0;
                 Z <= #1 0;
            end else begin
                D[2] <= #1 RET&Z&(~D[1])&(~D[2]) | (RET&(~Z)&D[1]&D[2]);
                D[1] <= #1 X;
                Z <= #1 D[2]&(~D[1])&D[0]&(~RET);
                D[0] <= #1 D[1];
            end
        end
    endmodule
    

    测试模块:

    module testbench;
        reg clk, X, RET;
        wire Z;
    
        state_machine uut(clk, X, RET, Z);
    
        initial begin
            clk = 0;
            X = 0;
            RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 RET = 1;
            #1 RET = 0;
            #1 $finish;
        end
    
        always #10 clk = ~clk;
    
    endmodule
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 创建了问题 6月19日

悬赏问题

  • ¥50 求大神教题,这个代码和讲解思路都怎么写呀,完全卡住了
  • ¥15 基于ffmpeg 编码成yuv420p nv12的问题
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗