题解 | #根据状态转移表实现时序电路#
根据状态转移表实现时序电路
https://www.nowcoder.com/practice/455c911bee0741bf8544a75d958425f7
!和~的区别
- !是逻辑非运算符,它只能用于布尔类型的操作数,也就是1或0。它的作用是将操作数的值取反,也就是1变成0,0变成1。例如,!1的结果是0,!0的结果是1。
- ~是按位非运算符,它可以用于任意位宽的操作数,它的作用是将操作数的每一位都取反,也就是1变成0,0变成1。例如,~2’b10的结果是2’b01,~4’b1100的结果是4’b0011。
- !和~的优先级不同,!的优先级高于~,所以在混合使用时要注意加括号。例如,!~2’b10的结果是0,而!(~2’b10)的结果是1。
如何根据同步时序电路转换
1.画出状态图,表示时序电路的各个状态和状态之间的转换关系,以及每个状态对应的输出。
2.选择状态编码,给每个状态分配一个二进制数,根据状态的个数确定所需的触发器(或锁存器)的个数。
3.用状态编码替换状态图中的状态,得到转换表,表示当前状态、输入、下一个状态和输出之间的关系。
4.根据转换表,写出下一个状态和输出的逻辑表达式,可以用卡诺图或者代数方法进行化简。
5.用组合逻辑电路实现下一个状态和输出的逻辑表达式,用触发器(或锁存器)实现当前状态的存储时序电路
解题思路一:
定义两个寄存器Q1和Q0
Q1_n+1与Q1_n,Q0_n和A有关
Q0_n+1与Q1_n,Q0_n和A有关
Y的输出与Q1和Q0有关
`timescale 1ns/1ns module seq_circuit( input A , input clk , input rst_n, output wire Y ); reg q1,q0; always@(posedge clk or negedge rst_n)begin if(!rst_n) q0 <= 0; else q0 <= ~q0; end always@(posedge clk or negedge rst_n)begin if(!rst_n) q1 <= 0; else q1 <= q1^q0^A; end assign Y = q0 & q1; endmodule