!和~的区别

  • !是逻辑非运算符,它只能用于布尔类型的操作数,也就是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