:::info 【知识点】

  1. 异步复位信号的写法;
  2. 有限同步状态机怎么写;
  3. 移位乘法和连接运算符。 ::: image.png

    看波形:

    1. 先看rst信号,rst=0的时候,输出为0,也就是说是低电平有效复位信号;
    2. 当d输入为6的时候,分别输出了6,18,42,48。紧接着输出的是129,而不是128,说明不能根据d信号的变化就对out信号产生影响。
    3. 通过第二点发现需要一个信号来实现对d信号的寄存,当d发生变化以后,寄存d信号四个周期不发生变化。因此out信号都是根据寄存的信号产生变化,而不是根据实时变化的d信号发生变化。
  1. `timescale 1ns/1ns
  2. module multi_sel(
  3. input [7:0]d,
  4. input clk,
  5. input rst,
  6. output reg input_grant,
  7. output reg [10:0]out
  8. );
  9. //************code**************//
  10. reg [1:0] count;
  11. always @(posedge clk or negedge rst) begin
  12. if(!rst) begin
  13. count <= 2'b00;
  14. end
  15. else begin
  16. count <= count + 2'b01;
  17. end
  18. end
  19. reg [7:0] d_reg;
  20. always @(posedge clk or negedge rst) begin
  21. if(!rst) begin
  22. out <= 11'b0;
  23. input_grant <= 1'b0;
  24. d_reg <= 8'b0;
  25. end
  26. else begin
  27. case(count)
  28. 2'b00 : begin
  29. input_grant <= 1'b1;
  30. d_reg <= d;
  31. out <= d;
  32. end
  33. 2'b01 : begin
  34. input_grant <= 1'b0;
  35. out <= d_reg + {d_reg, 1'b0};
  36. end
  37. 2'b10 : begin
  38. input_grant <= 1'b0;
  39. out <= d_reg + {d_reg, 2'b0} + {d_reg, 1'b0};
  40. end
  41. 2'b11 : begin
  42. input_grant <= 1'b0;
  43. out <= {d_reg, 3'b0};
  44. end
  45. default : begin
  46. input_grant <= 1'b0;
  47. d_reg <= d;
  48. out <= d_reg;
  49. end
  50. endcase
  51. end
  52. end
  53. //************code**************//
  54. endmodule

当使用非阻塞赋值语句的时候,输出相对于输入延后一个clk周期; 需要一个寄存器类型的变量对寄存器进行寄存,且根据该寄存器类型的变量来编写状态机:

  • 将复位信号及状态写在时序逻辑电路中;
  • 根据电平触发来描述若干状态机的状态。

具体参考:3.2 行为级建模【重要】中关于过程赋值语句的部分。
image.png

【调试bug】

image.png

在input_grant拉高的周期中,out输出的结果为并不是d,说明输出的是rst_n以后的d的值,原因是在always块中使用了非阻塞赋值语句,赋值的就是上一个周期d_reg的值。而rst_n周期内d_reg的值为0。