ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第十章练习题

2022-06-09 13:32:39  阅读:158  来源: 互联网

标签:练习题 s2 s1 s0 第十章 s4 跳转 RST


1.题目:用状态机实现按循环码\(000 \rightarrow 001\rightarrow 011\rightarrow111\rightarrow101\rightarrow100\rightarrow000\)规律工作的六进制计数器

module cnt_6(clk,rst,cnt_out);
    input clk,rst;//时钟输入,复位信号输入
    output [2:0]cnt_out;//计数输出
    reg		[2:0]cnt_out;
    reg		[2:0]current_state,netxt_state;//定义现在状态与下一个状态(即现态与次态)
    parameter	[2:0]s0=0,s1=1,s2=2,s3=3,s4=4,s5=5;//定义状态名称,[2:0]可省略
    
    always@(posedge clk)
        begin
            if(!rst)
                current_state<=s0;
            else
                current_state<=next_state;//次态名称传输给现态,用于进入下方的always语句
        end
    always@(current_state)
        begin
            case(current_state)
                s0:			begin next_state<=s1;cnt_out<=3'b000;end//次态赋值,并输出现态的值
                s1:			begin next_state<=s2;cnt_out<=3'b001;end
                s2:			begin next_state<=s3;cnt_out<=3'b011;end
                s3:			begin next_state<=s4;cnt_out<=3'b111;end
                s4:			begin next_state<=s5;cnt_out<=3'b101;end
                s5:			begin next_state<=s6;cnt_out<=3'b100;end
                default:	begin next_state<=s0;cnt_out<=3'b000;end//其他任意情况,都将进入s0状态(比如启动模块并且无复位情况下)
            endcase
        end

2.题目:从接收到的随机序列总检测七位巴克码\(1110010\),当检测到一组巴克码则输出一个高电平脉冲

写状态转移表:

状态名称 含义(接收到的序列) 1跳转 0跳转
s0 初始状态 s1 s0
s1 1 s2 s0
s2 11 s3 s0
s3 111 s3 s4
s4 1110 s1 s5
s5 11100 s6 s0
s6 111001 s2 s7
s7 1110010 s1 s0

转移图:

转移表傻瓜式推导法:

1.根据序列,有几位写个序列名,再加上一个s0,如这里有7位,就写s0-s7

2.s0一定是初始状态,根据s1的序列值(1),先把s0这里收到1跳转到哪个状态写好;s1相同,收到1跳转到s2,类推,能把s0-s7收到正确的位码全部填完

3.接下来填收到错误位(比如在s1下收到1跳转到s2,但你却收到了0,该怎么跳?)的状况。有个诀窍:一位一位来,从后往前数,最大满足态,就是跳转处。

怎么理解呢,以s4(1110)为例,收到1是错误位,那么把s4写成(11101),从后往前一位一位看,倒数第一位是1,满足s1,倒数两位是01,不满足任何状态,故跳转到s1;

再举两个例子,s6(111001)写成(1110011),倒数一位(1),满足s1,倒数两位(11),满足s2,倒数三位(011)不满足任何状态,故跳转到s2;

s2(11)写成(110),倒数一位(0)不满足任何状态,故跳转到s0。

module SCHK(CLK,DIN,RST,SOUT);
    input CLK,DIN,RST;//CLK时钟,DIN一位数据接收,RST复位信号
    output SOUT;//高电平脉冲输出
    parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7;
    reg [7:0]ST,NST
    
    always@(posedge CLK,posedge RST)
        if(RST)//复位则回到s0状态
            ST<=s0;
    	else 
            ST<=NST;//次态赋给现态
    
    always@(ST,DIN)
        case(ST)
            s0:if(DIN=1'b1) NST<=s1;else NST<=s0;
            s1:if(DIN=1'b1) NST<=s2;else NST<=s0;
            s2:if(DIN=1'b1) NST<=s3;else NST<=s0;
            s3:if(DIN=1'b1) NST<=s3;else NST<=s4;
            s4:if(DIN=1'b1) NST<=s1;else NST<=s5;
            s5:if(DIN=1'b1) NST<=s6;else NST<=s0;
            s6:if(DIN=1'b1) NST<=s2;else NST<=s7;
            s7:if(DIN=1'b1) NST<=s1;else NST<=s0; 
            default:NST<=s0;
            //可以看到if句中就是1跳转的状态,else句中就是0跳转的状态,完全一致!           
        endcase
    assign SOUT=(ST==S7);//收到一个s7(相当于收到一组正确序列)给一个高电平脉冲
endmodule

标签:练习题,s2,s1,s0,第十章,s4,跳转,RST
来源: https://www.cnblogs.com/helloszy/p/16358959.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有