• [HDLBits] Fsm serialdp


    See also: Serial receiver and datapath

    We want to add parity checking to the serial receiver. Parity checking adds one extra bit after each data byte. We will use odd parity, where the number of 1s in the 9 bits received must be odd. For example, 101001011 satisfies odd parity (there are 5 1s), but 001001011 does not.

    Change your FSM and datapath to perform odd parity checking. Assert the done signal only if a byte is correctly received and its parity check passes. Like the serial receiver FSM, this FSM needs to identify the start bit, wait for all 9 (data and parity) bits, then verify that the stop bit was correct. If the stop bit does not appear when expected, the FSM must wait until it finds a stop bit before attempting to receive the next byte.

    You are provided with the following module that can be used to calculate the parity of the input stream (It's a TFF with reset). The intended use is that it should be given the input bit stream, and reset at appropriate times so it counts the number of 1 bits in each byte.

    module parity (
        input clk,
        input reset,
        input in,
        output reg odd);
    
        always @(posedge clk)
            if (reset) odd <= 0;
            else if (in) odd <= ~odd;
    
    endmodule
    
    

    Note that the serial protocol sends the least significant bit first, and the parity bit after the 8 data bits.

    1. module top_module(
    2. input clk,
    3. input in,
    4. input reset, // Synchronous reset
    5. output [7:0] out_byte,
    6. output done
    7. ); //
    8. reg [3:0] state,next;
    9. reg odd;
    10. //0:还没接到起始位,1:接到起始位,...,9:接到最后一个数据位,10:接到奇偶校验位,11:接到终止位,12:没接到终止位
    11. wire res;
    12. always@(*) begin
    13. case(state)
    14. 0:next<=in?0:1;
    15. 1:next<=2;
    16. 2:next<=3;
    17. 3:next<=4;
    18. 4:next<=5;
    19. 5:next<=6;
    20. 6:next<=7;
    21. 7:next<=8;
    22. 8:next<=9;
    23. 9:next<=10;
    24. 10:next<=in?11:12;
    25. 11:next<=in?0:1;
    26. //接到终止位后接到0即开始位,那就直接跳到1
    27. 12:next<=in?0:12;
    28. //判断是否接到终止位。这里是设置了两种终止位状态来判断是否done
    29. endcase
    30. end
    31. always@(posedge clk) begin
    32. if(reset)
    33. state<=0;
    34. else
    35. state<=next;
    36. end
    37. parity p1(clk, res, in, odd);
    38. assign done=(state==11&&(!odd));
    39. // Use FSM from Fsm_serial
    40. always@(posedge clk) begin
    41. case(state)
    42. 1:out_byte[0]<=in;
    43. 2:out_byte[1]<=in;
    44. 3:out_byte[2]<=in;
    45. 4:out_byte[3]<=in;
    46. 5:out_byte[4]<=in;
    47. 6:out_byte[5]<=in;
    48. 7:out_byte[6]<=in;
    49. 8:out_byte[7]<=in;
    50. endcase
    51. end
    52. always@(*) begin
    53. if(state==11||state==0)
    54. res<=1;
    55. else
    56. res<=0;
    57. end
    58. endmodule

  • 相关阅读:
    Findbugs修改总结
    主机加固,防勒索病毒
    亿信华辰:企业数据资产管理的“道法术器”
    富文本编辑器 VUE-QUILL-EDITOR 使用教程 (最全)
    3.13 小红书笔记怎样带话题,才能增加曝光?【玩赚小红书】
    SSM整合(三)
    计算机毕业设计Java教学视频平台系统(源码+系统+mysql数据库+lw文档)
    DDD - 理论到落地从统一语言开始
    印刷行业APS解决方案
    ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
  • 原文地址:https://blog.csdn.net/m0_66480474/article/details/133806214