1 |
7 |
akhachat |
// Timing with undefined `DS1621_STANDARD ( more than 100kHz)
|
2 |
|
|
|
3 |
|
|
// for Opencores users:
|
4 |
|
|
// Delays are system bus specific. Adapt them to your system bus timing.
|
5 |
|
|
// Tasks are acceptable by both 24LC16B and DS1621S devices.
|
6 |
|
|
// "write/read" are the tasks from the bus interface
|
7 |
|
|
// (create your own interface or change the write read just to be the tasks).
|
8 |
|
|
// "data" is the value returned by the interface task.
|
9 |
|
|
// Format: Bit 2, 1, 0
|
10 |
|
|
// WP SCL SDA
|
11 |
|
|
// if EEPROM
|
12 |
|
|
// is present
|
13 |
|
|
//
|
14 |
|
|
|
15 |
|
|
task iic__stop();
|
16 |
|
|
#500 write( 3'b000 );
|
17 |
|
|
#1100 write( 3'b010 );
|
18 |
|
|
#900 write( 3'b011 );
|
19 |
|
|
endtask
|
20 |
|
|
|
21 |
|
|
task iic_ctlop( bit [3:0] EE_or_DS, bit [2:0] blk_adr, bit op, output bit ACK );
|
22 |
|
|
#1150 write( 3'b011 );
|
23 |
|
|
#650 write( 3'b010 );
|
24 |
|
|
#650 write( 3'b000 );
|
25 |
|
|
#650 write( {2'b00, EE_or_DS[3]} );
|
26 |
|
|
#650 write( {2'b01, EE_or_DS[3]} );
|
27 |
|
|
#650 write( {2'b00, EE_or_DS[3]} );
|
28 |
|
|
#650 write( {2'b00, EE_or_DS[2]} );
|
29 |
|
|
#650 write( {2'b01, EE_or_DS[2]} );
|
30 |
|
|
#650 write( {2'b00, EE_or_DS[2]} );
|
31 |
|
|
#650 write( {2'b00, EE_or_DS[1]} );
|
32 |
|
|
#650 write( {2'b01, EE_or_DS[1]} );
|
33 |
|
|
#650 write( {2'b00, EE_or_DS[1]} );
|
34 |
|
|
#650 write( {2'b00, EE_or_DS[0]} );
|
35 |
|
|
#650 write( {2'b01, EE_or_DS[0]} );
|
36 |
|
|
#650 write( {2'b00, EE_or_DS[0]} );
|
37 |
|
|
#650 write( {2'b00, blk_adr[2]} );
|
38 |
|
|
#650 write( {2'b01, blk_adr[2]} );
|
39 |
|
|
#650 write( {2'b00, blk_adr[2]} );
|
40 |
|
|
#650 write( {2'b00, blk_adr[1]} );
|
41 |
|
|
#650 write( {2'b01, blk_adr[1]} );
|
42 |
|
|
#650 write( {2'b00, blk_adr[1]} );
|
43 |
|
|
#650 write( {2'b00, blk_adr[0]} );
|
44 |
|
|
#650 write( {2'b01, blk_adr[0]} );
|
45 |
|
|
#650 write( {2'b00, blk_adr[0]} );
|
46 |
|
|
#650 write( {2'b00, op} );
|
47 |
|
|
#650 write( {2'b01, op} );
|
48 |
|
|
#650 write( 3'b001 ); // ACK check
|
49 |
|
|
#1250 write( 3'b011 ); //
|
50 |
|
|
#650 read( ACK );
|
51 |
|
|
#650 write( 3'b000 ); // ACK end with SCL=0 & SDA=0 (hold time is 0 for devices on IIC)
|
52 |
|
|
#650 write( 3'b001 );
|
53 |
|
|
endtask
|
54 |
|
|
|
55 |
|
|
task iic_write( bit stop, bit [7:0] data, output bit ACK );
|
56 |
|
|
#750 write( {2'b00, data[7]} );
|
57 |
|
|
#650 write( {2'b01, data[7]} );
|
58 |
|
|
#650 write( {2'b00, data[7]} );
|
59 |
|
|
#650 write( {2'b00, data[6]} );
|
60 |
|
|
#650 write( {2'b01, data[6]} );
|
61 |
|
|
#650 write( {2'b00, data[6]} );
|
62 |
|
|
#650 write( {2'b00, data[5]} );
|
63 |
|
|
#650 write( {2'b01, data[5]} );
|
64 |
|
|
#650 write( {2'b00, data[5]} );
|
65 |
|
|
#650 write( {2'b00, data[4]} );
|
66 |
|
|
#650 write( {2'b01, data[4]} );
|
67 |
|
|
#650 write( {2'b00, data[4]} );
|
68 |
|
|
#650 write( {2'b00, data[3]} );
|
69 |
|
|
#650 write( {2'b01, data[3]} );
|
70 |
|
|
#650 write( {2'b00, data[3]} );
|
71 |
|
|
#650 write( {2'b00, data[2]} );
|
72 |
|
|
#650 write( {2'b01, data[2]} );
|
73 |
|
|
#650 write( {2'b00, data[2]} );
|
74 |
|
|
#650 write( {2'b00, data[1]} );
|
75 |
|
|
#650 write( {2'b01, data[1]} );
|
76 |
|
|
#650 write( {2'b00, data[1]} );
|
77 |
|
|
#650 write( {2'b00, data[0]} );
|
78 |
|
|
#650 write( {2'b01, data[0]} );
|
79 |
|
|
#650 write( {2'b00, data[0]} );
|
80 |
|
|
#650 write( 3'b001 ); // ACK check
|
81 |
|
|
#650 write( 3'b011 ); //
|
82 |
|
|
#650 read( ACK );
|
83 |
|
|
#650 write( 3'b000 ); // ACK end with SCL=0 & SDA=0 (hold time is 0 for devices on IIC)
|
84 |
|
|
if ( stop ) iic__stop;
|
85 |
|
|
else
|
86 |
|
|
#650 write( 3'b001 );
|
87 |
|
|
endtask
|
88 |
|
|
|
89 |
|
|
task iic__read( bit stop, output bit [7:0] data );
|
90 |
|
|
bit data_bit;
|
91 |
|
|
#1250 write( 3'b011 );
|
92 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
93 |
|
|
write( 3'b001 );
|
94 |
|
|
#1250 write( 3'b011 );
|
95 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
96 |
|
|
write( 3'b001 );
|
97 |
|
|
#1250 write( 3'b011 );
|
98 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
99 |
|
|
write( 3'b001 );
|
100 |
|
|
#1250 write( 3'b011 );
|
101 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
102 |
|
|
write( 3'b001 );
|
103 |
|
|
#1250 write( 3'b011 );
|
104 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
105 |
|
|
write( 3'b001 );
|
106 |
|
|
#1250 write( 3'b011 );
|
107 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
108 |
|
|
write( 3'b001 );
|
109 |
|
|
#1250 write( 3'b011 );
|
110 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
111 |
|
|
write( 3'b001 );
|
112 |
|
|
#1250 write( 3'b011 );
|
113 |
|
|
#650 read( data_bit ); data = {data[6:0], data_bit};
|
114 |
|
|
if ( stop ) begin
|
115 |
|
|
#650 write( 3'b001 ); // NO ACK
|
116 |
|
|
#1250 write( 3'b011 );
|
117 |
|
|
iic__stop;
|
118 |
|
|
end
|
119 |
|
|
else begin
|
120 |
|
|
#650 write( 3'b000 ); // ACK
|
121 |
|
|
#1250 write( 3'b010 );
|
122 |
|
|
#650 write( 3'b000 );
|
123 |
|
|
#650 write( 3'b001 );
|
124 |
|
|
end
|
125 |
|
|
endtask
|