Guest User

Untitled

a guest
Feb 18th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. module RDC_config(
  2. input clk_10MHz,
  3. input clk_20MHz,
  4. input clk_100MHz,
  5. output reg FSYNC,
  6. output [1:0] A_x,
  7. output SOE,
  8. output CS,
  9. output reg SDI,
  10. output S_CLK
  11. );
  12.  
  13. reg [2:0] state = 1; //initialize current state of state machine register
  14. reg [2:0] next_state = 1; //initialize next state of state machine register
  15. reg [5:0] counter_20MHz = 0; //initialize counter register for 20MHz clock edges
  16. reg [5:0] counter_10MHz = 0; //initialize counter register for 10MHz clock edges
  17. reg SDI = 1'b0; //initialize data line to 0
  18. reg FSYNC = 1'b1; //initialize FSYNC to 1
  19.  
  20. //initialize state machine or go to next state
  21. always@(posedge clk_100MHz)
  22. begin
  23. state <= next_state;
  24. end
  25.  
  26. //Counter for tracking number of 10MHz clock edges
  27. always@(posedge clk_10MHz)begin
  28. counter_10MHz <= counter_10MHz+1;
  29. end
  30.  
  31. //Counter for tracking number of 20MHz clock edges
  32. always@(posedge clk_20MHz)begin
  33. counter_20MHz <= counter_20MHz+1;
  34. end
  35.  
  36.  
  37. //This state machine changes the excitation frequency parameter of the RDC to be 5KHz.
  38. //It sends out 0x91 as the RDC register address and then 0x14 as the register value.
  39. always@(state or counter_10MHz or counter_20MHz) begin
  40. case(state)
  41. 0: //State 0: end state
  42. begin
  43. SDI <= 1'b0;
  44. FSYNC <= 1'b1;
  45. next_state <= 0;
  46. end
  47. 1: //State 1: wait 5 20MHz clock edges, then set FSYNC low
  48. if(counter_20MHz == 5)begin
  49. FSYNC <= 1'b0;
  50. SDI <= 1'b0;
  51. next_state <= 2;
  52. end
  53. 2: //State 2: wait one 20MHz clock edge, then set SDI high
  54. if(counter_20MHz == 6)begin
  55. FSYNC <= 1'b0;
  56. SDI <= 1'b1;
  57. next_state <= 3;
  58. end
  59. 3: //State 3: wait two 20MHz clock edges, then set SDI low
  60. if(counter_20MHz == 8)begin
  61. FSYNC <= 1'b0;
  62. SDI <= 1'b0;
  63. next_state <= 4;
  64. end
  65. 4: //State 4: wait four 20MHz clock edges, then set SDI high
  66. if(counter_20MHz == 12)begin
  67. FSYNC <= 1'b0;
  68. SDI <= 1'b1;
  69. next_state <= 5;
  70. end
  71. 5: //State 5: wait two 20MHz clock edges, then set SDI low
  72. if(counter_20MHz == 14)begin
  73. FSYNC <= 1'b0;
  74. SDI <= 1'b0;
  75. next_state <= 6;
  76. end
  77. 6: //State 6: wait six 20MHz clock edges, then set SDI high
  78. if(counter_20MHz == 20)begin
  79. FSYNC <= 1'b0;
  80. SDI <= 1'b1;
  81. next_state <= 7;
  82. end
  83. 7: //State 7: wait eleven 10MHz clock edges, then set FSYNC high
  84. if(counter_10MHz == 11)begin
  85. FSYNC <= 1'b1;
  86. SDI <= 1'b1;
  87. next_state <= 8;
  88. end
  89. 8: //State 8: wait two 20MHz clock edges from state 6, then set SDI low. 0x91 has been sent.
  90. if(counter_20MHz == 22)begin
  91. FSYNC <= 1'b1;
  92. SDI <= 1'b0;
  93. next_state <= 9;
  94. end
  95. 9: //State 9: wait seven 20MHz clock edges, then set FSYNC low
  96. if(counter_20MHz == 29)begin
  97. FSYNC <= 1'b0;
  98. SDI <= 1'b0;
  99. next_state <= 10;
  100. end
  101. 10: //State 10: wait 18 10MHz clock edges, then set SDI high
  102. if(counter_10MHz == 18)begin
  103. FSYNC <= 1'b0;
  104. SDI <= 1'b1;
  105. next_state <= 11;
  106. end
  107. 11: //State 11: wait 1 10MHz clock edge, then set SDI low
  108. if(counter_10MHz == 19)begin
  109. FSYNC <= 1'b0;
  110. SDI <= 1'b0;
  111. next_state <= 12;
  112. end
  113. 12: //State 12: wait 1 10MHz clock edge, then set SDI high
  114. if(counter_10MHz == 20)begin
  115. FSYNC <= 1'b0;
  116. SDI <= 1'b1;
  117. next_state <= 13;
  118. end
  119. 13: //State 13: wait 1 10MHz clock edge, then set SDI low
  120. if(counter_10MHz == 21)begin
  121. FSYNC <= 1'b0;
  122. SDI <= 1'b0;
  123. next_state <= 14;
  124. end
  125. 14: //State 14: wait 45 20MHz clock edges, then set FSYNC high. 0x14 has been sent
  126. if(counter_20MHz == 45)begin
  127. FSYNC <= 1'b1;
  128. SDI <= 1'b0;
  129. next_state <= 0;
  130. end
  131. endcase
  132. end
  133.  
  134. assign SOE = 1'b0; //enable serial configuration on RDC
  135. assign A_x = 2'b11; //set to configuration mode
  136. assign CS = 1'b0; //chip select held low
  137. assign SCLK = clk_10MHz; //RDC SCLK set to 10MHz
  138. endmodule
Add Comment
Please, Sign In to add comment