• HDLbits: ps2data


    这一题在上一题基础上多了一个输出,并且这个输出是不需要像上一题考虑出错的情况的,所以只要把输入in按次序排好就可以。我一开始的想法是在状态切换判断的always块里把in赋给out,但是不正确,代码如下:

    1. module top_module(
    2. input clk,
    3. input [7:0] in,
    4. input reset, // Synchronous reset
    5. output [23:0] out_bytes,
    6. output done); //
    7. parameter byte1=4'b0001, byte2=4'b0010, byte3=4'b0100, byte_fault=4'b1000;
    8. reg [23:0] out_bytes_reg;
    9. reg [3:0] state,next_state;
    10. // State transition logic (combinational)
    11. always@(*)begin
    12. case(state)
    13. byte1: begin
    14. next_state = byte2; out_bytes_reg[23:16] = in[7:0];
    15. end
    16. byte2: begin
    17. next_state = byte3; out_bytes_reg[15:8] = in[7:0];
    18. end
    19. byte3: begin
    20. next_state = in[3]?byte1:byte_fault;
    21. out_bytes_reg[7:0] = in[7:0];
    22. end
    23. byte_fault: begin
    24. next_state = in[3]?byte1:byte_fault;
    25. end
    26. default: next_state = byte1;
    27. endcase
    28. end
    29. // State flip-flops (sequential)
    30. always@(posedge clk)begin
    31. if(reset)
    32. state <= byte_fault;
    33. else
    34. state <= next_state;
    35. end
    36. // Output logic
    37. assign done = (state == byte3);
    38. assign out_bytes = out_bytes_reg;
    39. endmodule

    看了大佬的写法,又改了思路,用一个always块专门实现这部分功能,如下:

    1. module top_module(
    2. input clk,
    3. input [7:0] in,
    4. input reset, // Synchronous reset
    5. output reg [23:0] out_bytes,
    6. output done); //
    7. // FSM from fsm_ps2
    8. // New: Datapath to store incoming bytes.
    9. parameter byte1=4'b0001, byte2=4'b0010, byte3=4'b0100, byte_fault=4'b1000;
    10. reg [3:0] state,next_state;
    11. // State transition logic (combinational)
    12. always@(*)begin
    13. case(state)
    14. byte1: next_state = byte2;
    15. byte2: next_state = byte3;
    16. byte3: next_state = in[3]?byte1:byte_fault;
    17. byte_fault: next_state = in[3]?byte1:byte_fault;
    18. default: next_state = byte1;
    19. endcase
    20. end
    21. // State flip-flops (sequential)
    22. always@(posedge clk)begin
    23. if(reset)
    24. state <= byte_fault;
    25. else
    26. state <= next_state;
    27. end
    28. always@(posedge clk)begin
    29. if(reset)
    30. out_bytes <= 24'd0;
    31. else
    32. out_bytes <= {out_bytes[15:0],in[7:0]};
    33. end
    34. // Output logic
    35. assign done = (state == byte3);
    36. endmodule

  • 相关阅读:
    【接口测试】HTTP接口详细验证清单
    Redis 数据结构与对象
    【C++模块实现】| 【09】线程模块及线程池的实现
    为什么现在很多人特别排斥用微信打电话
    【数据结构】——链表面试题详解
    「SpringCloud」03 Consul服务注册与发现
    乐歌智能升降桌、乐歌智能健身椅,为精英生活助力
    一个牛X小编,用Python将普通视频变成动漫,这也太厉害了吧
    (WebFlux)002、如何打印日志与链路ID
    SuperMap iServer 产品包类型说明
  • 原文地址:https://blog.csdn.net/weixin_41004238/article/details/133829195