Verwendeter Programmcode in Studienarbeit für ESY1B zum Thema "Verifikation mit SystemVerilog und Python"
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

i2c_master_top.v 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /////////////////////////////////////////////////////////////////////
  2. //// ////
  3. //// WISHBONE revB.2 compliant I2C Master controller Top-level ////
  4. //// ////
  5. //// ////
  6. //// Author: Richard Herveille ////
  7. //// richard@asics.ws ////
  8. //// www.asics.ws ////
  9. //// ////
  10. //// Downloaded from: http://www.opencores.org/projects/i2c/ ////
  11. //// ////
  12. /////////////////////////////////////////////////////////////////////
  13. //// ////
  14. //// Copyright (C) 2001 Richard Herveille ////
  15. //// richard@asics.ws ////
  16. //// ////
  17. //// This source file may be used and distributed without ////
  18. //// restriction provided that this copyright statement is not ////
  19. //// removed from the file and that any derivative work contains ////
  20. //// the original copyright notice and the associated disclaimer.////
  21. //// ////
  22. //// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
  23. //// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
  24. //// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
  25. //// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
  26. //// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
  27. //// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
  28. //// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
  29. //// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
  30. //// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
  31. //// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
  32. //// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
  33. //// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
  34. //// POSSIBILITY OF SUCH DAMAGE. ////
  35. //// ////
  36. /////////////////////////////////////////////////////////////////////
  37. // CVS Log
  38. //
  39. // $Id: i2c_master_top.v,v 1.1 2008-11-08 13:15:10 sfielding Exp $
  40. //
  41. // $Date: 2008-11-08 13:15:10 $
  42. // $Revision: 1.1 $
  43. // $Author: sfielding $
  44. // $Locker: $
  45. // $State: Exp $
  46. //
  47. // Change History:
  48. // $Log: not supported by cvs2svn $
  49. // Revision 1.11 2005/02/27 09:26:24 rherveille
  50. // Fixed register overwrite issue.
  51. // Removed full_case pragma, replaced it by a default statement.
  52. //
  53. // Revision 1.10 2003/09/01 10:34:38 rherveille
  54. // Fix a blocking vs. non-blocking error in the wb_dat output mux.
  55. //
  56. // Revision 1.9 2003/01/09 16:44:45 rherveille
  57. // Fixed a bug in the Command Register declaration.
  58. //
  59. // Revision 1.8 2002/12/26 16:05:12 rherveille
  60. // Small code simplifications
  61. //
  62. // Revision 1.7 2002/12/26 15:02:32 rherveille
  63. // Core is now a Multimaster I2C controller
  64. //
  65. // Revision 1.6 2002/11/30 22:24:40 rherveille
  66. // Cleaned up code
  67. //
  68. // Revision 1.5 2001/11/10 10:52:55 rherveille
  69. // Changed PRER reset value from 0x0000 to 0xffff, conform specs.
  70. //
  71. // synopsys translate_off
  72. `include "timescale.v"
  73. // synopsys translate_on
  74. `include "i2c_master_defines.v"
  75. module i2c_master_top(
  76. wb_clk_i, wb_rst_i, arst_i, wb_adr_i, wb_dat_i, wb_dat_o,
  77. wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_inta_o,
  78. scl_pad_i, scl_pad_o, scl_padoen_o, sda_pad_i, sda_pad_o, sda_padoen_o );
  79. // parameters
  80. parameter ARST_LVL = 1'b0; // asynchronous reset level
  81. //
  82. // inputs & outputs
  83. //
  84. // wishbone signals
  85. input wb_clk_i; // master clock input
  86. input wb_rst_i; // synchronous active high reset
  87. input arst_i; // asynchronous reset
  88. input [2:0] wb_adr_i; // lower address bits
  89. input [7:0] wb_dat_i; // databus input
  90. output [7:0] wb_dat_o; // databus output
  91. input wb_we_i; // write enable input
  92. input wb_stb_i; // stobe/core select signal
  93. input wb_cyc_i; // valid bus cycle input
  94. output wb_ack_o; // bus cycle acknowledge output
  95. output wb_inta_o; // interrupt request signal output
  96. reg [7:0] wb_dat_o;
  97. reg wb_ack_o;
  98. reg wb_inta_o;
  99. // I2C signals
  100. // i2c clock line
  101. input scl_pad_i; // SCL-line input
  102. output scl_pad_o; // SCL-line output (always 1'b0)
  103. output scl_padoen_o; // SCL-line output enable (active low)
  104. // i2c data line
  105. input sda_pad_i; // SDA-line input
  106. output sda_pad_o; // SDA-line output (always 1'b0)
  107. output sda_padoen_o; // SDA-line output enable (active low)
  108. //
  109. // variable declarations
  110. //
  111. // registers
  112. reg [15:0] prer; // clock prescale register
  113. reg [ 7:0] ctr; // control register
  114. reg [ 7:0] txr; // transmit register
  115. wire [ 7:0] rxr; // receive register
  116. reg [ 7:0] cr; // command register
  117. wire [ 7:0] sr; // status register
  118. // done signal: command completed, clear command register
  119. wire done;
  120. // core enable signal
  121. wire core_en;
  122. wire ien;
  123. // status register signals
  124. wire irxack;
  125. reg rxack; // received aknowledge from slave
  126. reg tip; // transfer in progress
  127. reg irq_flag; // interrupt pending flag
  128. wire i2c_busy; // bus busy (start signal detected)
  129. wire i2c_al; // i2c bus arbitration lost
  130. reg al; // status register arbitration lost bit
  131. //
  132. // module body
  133. //
  134. // generate internal reset
  135. wire rst_i = arst_i ^ ARST_LVL;
  136. // generate wishbone signals
  137. wire wb_wacc = wb_cyc_i & wb_stb_i & wb_we_i;
  138. // generate acknowledge output signal
  139. always @(posedge wb_clk_i)
  140. wb_ack_o <= #1 wb_cyc_i & wb_stb_i & ~wb_ack_o; // because timing is always honored
  141. // assign DAT_O
  142. always @(posedge wb_clk_i)
  143. begin
  144. case (wb_adr_i) // synopsis parallel_case
  145. 3'b000: wb_dat_o <= #1 prer[ 7:0];
  146. 3'b001: wb_dat_o <= #1 prer[15:8];
  147. 3'b010: wb_dat_o <= #1 ctr;
  148. 3'b011: wb_dat_o <= #1 rxr; // write is transmit register (txr)
  149. 3'b100: wb_dat_o <= #1 sr; // write is command register (cr)
  150. 3'b101: wb_dat_o <= #1 txr;
  151. 3'b110: wb_dat_o <= #1 cr;
  152. 3'b111: wb_dat_o <= #1 0; // reserved
  153. endcase
  154. end
  155. // generate registers
  156. always @(posedge wb_clk_i or negedge rst_i)
  157. if (!rst_i)
  158. begin
  159. prer <= #1 16'hffff;
  160. ctr <= #1 8'h0;
  161. txr <= #1 8'h0;
  162. end
  163. else if (wb_rst_i)
  164. begin
  165. prer <= #1 16'hffff;
  166. ctr <= #1 8'h0;
  167. txr <= #1 8'h0;
  168. end
  169. else
  170. if (wb_wacc)
  171. case (wb_adr_i) // synopsis parallel_case
  172. 3'b000 : prer [ 7:0] <= #1 wb_dat_i;
  173. 3'b001 : prer [15:8] <= #1 wb_dat_i;
  174. 3'b010 : ctr <= #1 wb_dat_i;
  175. 3'b011 : txr <= #1 wb_dat_i;
  176. default: ;
  177. endcase
  178. // generate command register (special case)
  179. always @(posedge wb_clk_i or negedge rst_i)
  180. if (~rst_i)
  181. cr <= #1 8'h0;
  182. else if (wb_rst_i)
  183. cr <= #1 8'h0;
  184. else if (wb_wacc)
  185. begin
  186. if (core_en & (wb_adr_i == 3'b100) )
  187. cr <= #1 wb_dat_i;
  188. end
  189. else
  190. begin
  191. if (done | i2c_al)
  192. cr[7:4] <= #1 4'h0; // clear command bits when done
  193. // or when aribitration lost
  194. cr[2:1] <= #1 2'b0; // reserved bits
  195. cr[0] <= #1 2'b0; // clear IRQ_ACK bit
  196. end
  197. // decode command register
  198. wire sta = cr[7];
  199. wire sto = cr[6];
  200. wire rd = cr[5];
  201. wire wr = cr[4];
  202. wire ack = cr[3];
  203. wire iack = cr[0];
  204. // decode control register
  205. assign core_en = ctr[7];
  206. assign ien = ctr[6];
  207. // hookup byte controller block
  208. i2c_master_byte_ctrl byte_controller (
  209. .clk ( wb_clk_i ),
  210. .rst ( wb_rst_i ),
  211. .nReset ( rst_i ),
  212. .ena ( core_en ),
  213. .clk_cnt ( prer ),
  214. .start ( sta ),
  215. .stop ( sto ),
  216. .read ( rd ),
  217. .write ( wr ),
  218. .ack_in ( ack ),
  219. .din ( txr ),
  220. .cmd_ack ( done ),
  221. .ack_out ( irxack ),
  222. .dout ( rxr ),
  223. .i2c_busy ( i2c_busy ),
  224. .i2c_al ( i2c_al ),
  225. .scl_i ( scl_pad_i ),
  226. .scl_o ( scl_pad_o ),
  227. .scl_oen ( scl_padoen_o ),
  228. .sda_i ( sda_pad_i ),
  229. .sda_o ( sda_pad_o ),
  230. .sda_oen ( sda_padoen_o )
  231. );
  232. // status register block + interrupt request signal
  233. always @(posedge wb_clk_i or negedge rst_i)
  234. if (!rst_i)
  235. begin
  236. al <= #1 1'b0;
  237. rxack <= #1 1'b0;
  238. tip <= #1 1'b0;
  239. irq_flag <= #1 1'b0;
  240. end
  241. else if (wb_rst_i)
  242. begin
  243. al <= #1 1'b0;
  244. rxack <= #1 1'b0;
  245. tip <= #1 1'b0;
  246. irq_flag <= #1 1'b0;
  247. end
  248. else
  249. begin
  250. al <= #1 i2c_al | (al & ~sta);
  251. rxack <= #1 irxack;
  252. tip <= #1 (rd | wr);
  253. irq_flag <= #1 (done | i2c_al | irq_flag) & ~iack; // interrupt request flag is always generated
  254. end
  255. // generate interrupt request signals
  256. always @(posedge wb_clk_i or negedge rst_i)
  257. if (!rst_i)
  258. wb_inta_o <= #1 1'b0;
  259. else if (wb_rst_i)
  260. wb_inta_o <= #1 1'b0;
  261. else
  262. wb_inta_o <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
  263. // assign status register bits
  264. assign sr[7] = rxack;
  265. assign sr[6] = i2c_busy;
  266. assign sr[5] = al;
  267. assign sr[4:2] = 3'h0; // reserved
  268. assign sr[1] = tip;
  269. assign sr[0] = irq_flag;
  270. endmodule