第十章练习题
作者:互联网
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