Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. reg [5:0] SD_COUNTER = 6'd0;//counter used for the sending all the signals to the temperature sensor
  2. reg [31:0] count= 32'h00000000;//counter used for slow clock
  3. //since we are using SDA as inout we cannot use it inside the always block. I created a temp. reg SDI
  4. reg SDI;//register used for sending signals to temperature sensor inside the always block
  5. reg SCLK; // clock used inside the always block which is equated to the SCL at the end.
  6. reg dp = 1'b1;//decimal point for 7 segment display
  7. reg [18:0] Counter; // temp. counter for multiplexing seven segment display
  8. // these are the registers used for 7 segment display
  9. reg [3:0] first;
  10. reg [3:0] second;
  11. reg [3:0] third;
  12. reg [3:0] fourth;
  13. reg [3:0] fifth;
  14. reg [3:0] sixth;
  15. reg [3:0] seg;
  16. reg [15:0] led_temp = 16'b0000000000000000;//temp reg used in always block to asssign sda values
  17. reg CLK = 0;//slow clock
  18. // code for slow clock(200k)
  19. always @ (posedge clk)
  20. begin
  21. count <= count + 1;
  22. Counter <= Counter + 1;
  23.  
  24. if (count == 32'h00030D40)//200k in hex
  25. begin
  26. count <= 0;
  27. CLK <= ~CLK;
  28. end
  29. else
  30. count <= count + 1;
  31. end
  32. always @ (posedge CLK) //always on 200k clock
  33. begin
  34. if (SD_COUNTER == 49)
  35. SD_COUNTER <= 1;
  36. else
  37. SD_COUNTER <= SD_COUNTER + 1;
  38. end
  39.  
  40. always @ (posedge CLK)
  41. begin
  42.  
  43. case (SD_COUNTER)
  44. 6'd0 : begin SDI <= 1; SCLK <= 1; end //initial condition
  45. //START signal for I2C protocol
  46. 6'd1 : SDI <= 0;
  47. 6'd2 : SCLK <= 1;
  48. // SLAVE ADDRESS 0x4B
  49. 6'd3 : SDI <= 1;
  50. 6'd4 : SDI <= 0;
  51. 6'd5 : SDI <= 0;
  52. 6'd6 : SDI <= 1;
  53. 6'd7 : SDI <= 0;
  54. 6'd8 : SDI <= 1;
  55. 6'd9 : SDI <= 1;
  56. 6'd10 : SDI <= 0; //write (R/W =1'b0 bit)
  57. 6'd11 : SDI <= 1'bz; //ACK (acknowledge from slave)
  58. // Address of register inside the temperature sensor (0x00, temperature register)
  59. 6'd12 : SDI <= 0;
  60. 6'd13 : SDI <= 0;
  61. 6'd14 : SDI <= 0;
  62. 6'd15 : SDI <= 0;
  63. 6'd16 : SDI <= 0;
  64. 6'd17 : SDI <= 0;
  65. 6'd18 : SDI <= 0;
  66. 6'd19 : SDI <= 0;
  67. 6'd20 : SDI <= 1'bz; //acknowledge from the slave
  68. //Re-Start signal for I2C protocol
  69. 6'd21 : begin SDI <= 1; SCLK <= 1;end
  70. 6'd22 : SDI <= 0;
  71. 6'd23 : SCLK <= 1;
  72. //Slave Address 0x4B
  73.  
  74. 6'd24 : SDI <= 1;
  75. 6'd25 : SDI <= 0;
  76. 6'd26 : SDI <= 0;
  77. 6'd27 : SDI <= 1;
  78. 6'd28 : SDI <= 0;
  79. 6'd29 : SDI <= 1;
  80. 6'd30 : SDI <= 1;
  81. 6'd31 : SDI <= 1;//read (R/W=1'b1 bit)(read from the temp. sensor)
  82. 6'd32 : SDI <= 1'bz;//acknowledge from the slave
  83. //we are storing in the values in a temporary led register, so that we can see the values on the leds.
  84. //Reading and storing the temperature on led_temp(MSB)
  85. 6'd33 : led_temp[15] <= SDI;
  86. 6'd34 : led_temp[14] <= SDI;
  87. 6'd35 : led_temp[13] <= SDI;
  88. 6'd36 : led_temp[12] <= SDI;
  89. 6'd37 : led_temp[11] <= SDI;
  90. 6'd38 : led_temp[10] <= SDI;
  91. 6'd39 : led_temp[9] <= SDI;
  92. 6'd40 : led_temp[8] <= SDI;
  93. 6'd41 : SDI <= 1'bz; // acknowledge from the slave
  94.  
  95. //Reading and storing the temperature on led_temp(LSB)
  96. 6'd42 : led_temp[7] <= SDI;
  97. 6'd43 : led_temp[6] <= SDI;
  98. 6'd44 : led_temp[5] <= SDI;
  99. 6'd45 : led_temp[4] <= SDI;
  100. 6'd46 : led_temp[3] <= SDI;
  101. 6'd47 : led_temp[2] <= SDI;
  102. 6'd48 : led_temp[1] <= SDI;
  103. 6'd49 : led_temp[0] <= SDI;
  104. 6'd50 : SDI <= 1'b1; //acknowledge from the master
  105.  
  106. //STOP signal for I2C protocol
  107. 6'd51 : begin SDI <= 1'b0; SCLK <= 1'b1; end
  108. 6'd52 : SDI <= 1'b1;
  109. endcase
  110.  
  111. end
  112. //assigning led_temp to led
  113. assign led = led_temp;
  114. //assigning the SCL(I2C clock) to either slow clock(200k) or SCLK.
  115. assign SCL = ((SD_COUNTER >= 4) & (SD_COUNTER <= 20) | ((SD_COUNTER >= 25) & (SD_COUNTER <= 49))) ? ~CLK : SCLK;
  116. //assignin SDA(I2C Serial data) to SDI
  117. assign SDA = SDI;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement