Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. module top;
  2. logic clock, reset, serial, isNew;
  3. logic [7:0] messageByte;
  4. logic [16:0] counter;
  5.  
  6. Receiver recv(.clock, .reset, .serialIn(serial), .isNew, .messageByte);
  7. Sender send(.clock, .reset, .serialOut(serial));
  8.  
  9. initial begin
  10. $monitor($time,, "%b || %c %b | %b %b | %d %b %s", serial, recv.messageByte, recv.messageByte, recv.is1BitErr, recv.is2BitErr, recv.bitPos, recv.inCode, recv.currState.name);
  11.  
  12. @(posedge clock)
  13. reset = 0;
  14. @(posedge clock)
  15. reset = 1;
  16. @(posedge clock)
  17. reset = 0;
  18.  
  19. end
  20.  
  21. initial begin
  22. counter = 0;
  23. clock = 0;
  24. forever #5 begin
  25. clock = ~clock;
  26. counter = counter + 1;
  27.  
  28. if (counter > 5000)
  29. $finish;
  30. end
  31. end
  32. endmodule: top
  33.  
  34.  
  35. module Receiver
  36. (input logic clock, reset, serialIn,
  37. output logic [7:0] messageByte,
  38. output logic isNew);
  39.  
  40. logic keepCounting, startOver;
  41. logic en, clear;
  42. logic getCode, clearCode;
  43. logic Cout;
  44. logic is1BitErr, is2BitErr;
  45. logic haveError;
  46. logic [3:0] nextBitPos, bitPos, syndrome;
  47. logic [12:0] inCode, outCode, shifted;
  48. logic [7:0] decodedBin, storeCode;
  49.  
  50. logic atEnd;
  51.  
  52. Adder #(4) adder(.A(bitPos), .B(4'd1), .Cin(1'd0), .Cout, .S(nextBitPos));
  53. register #(4) counter(.en(keepCounting), .clear(startOver), .D(nextBitPos), .Q(bitPos), .clock);
  54. register #(8) decode(.en(getCode), .clear(clearCode), .Q(messageByte), .D(storeCode), .clock);
  55. register #(13) code(.en, .clear, .D(shifted), .Q(inCode), .clock);
  56. SECDEDdecoder SECDEDd(.inCode, .syndrome, .is1BitErr, .is2BitErr, .outCode);
  57. codeToNumber cTN(.inCode(outCode), .outNum(decodedBin));
  58.  
  59. enum logic [1:0] {START, RECV, DONE, ERROR} currState, nextState;
  60.  
  61. assign atEnd = (bitPos == 'd14);
  62. assign storeCode = (haveError) ? 'd15 : decodedBin;
  63. assign shifted = (inCode << 1) | (serialIn && currState == RECV);
  64.  
  65. always_comb begin
  66. getCode = 0;
  67. clearCode = 0;
  68. nextState = START;
  69. keepCounting = 0;
  70. startOver = 0;
  71. isNew = 0;
  72. haveError = 0;
  73. en = 0;
  74. clear = 0;
  75.  
  76. unique case (currState)
  77. START: begin
  78. if (serialIn) begin
  79. nextState = RECV;
  80. en = 1;
  81. keepCounting = 1;
  82. end else begin
  83. nextState = START;
  84. clear = 1;
  85. startOver = 1;
  86. end
  87. end
  88. RECV: begin
  89. if (atEnd == 0) begin
  90. nextState = RECV;
  91. en = 1;
  92. keepCounting = 1;
  93. end else begin
  94. getCode = 1;
  95. isNew = 1;
  96. if (is2BitErr == 0 && serialIn == 0) begin
  97. nextState = DONE;
  98. haveError = 0;
  99. end else begin
  100. nextState = ERROR;
  101. haveError = 1;
  102. end
  103. end
  104. end
  105. DONE: begin
  106. nextState = START;
  107. clear = 1;
  108. startOver = 1;
  109. end
  110. ERROR: begin
  111. nextState = START;
  112. clear = 1;
  113. startOver = 1;
  114. end
  115. endcase
  116. end
  117.  
  118. always_ff @(posedge clock, posedge reset) begin
  119. if (reset) currState <= START;
  120. else currState <= nextState;
  121. end
  122. endmodule: Receiver;
  123.  
  124. module codeToNumber
  125. (input logic [12:0] inCode,
  126. output logic [7:0] outNum);
  127.  
  128. assign outNum[0] = inCode[3];
  129. assign outNum[3:1] = inCode[7:5];
  130. assign outNum[7:4] = inCode[12:9];
  131.  
  132. endmodule: codeToNumber;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement