origen_spi 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
- # You can define any Rake tasks to support your application here (or in any file
2
- # ending in .rake in this directory).
3
- #
4
- # Rake (Ruby Make) is very useful for creating build scripts, see this short video
5
- # for a quick introduction:
6
- # http://railscasts.com/episodes/66-custom-rake-tasks
1
+ # You can define any Rake tasks to support your application here (or in any file
2
+ # ending in .rake in this directory).
3
+ #
4
+ # Rake (Ruby Make) is very useful for creating build scripts, see this short video
5
+ # for a quick introduction:
6
+ # http://railscasts.com/episodes/66-custom-rake-tasks
@@ -1,18 +1,18 @@
1
- Pattern.create do
2
- tester.set_timeset 'tp0', 20
3
- dut.pin(:ss).drive 1
4
- dut.pin(:sclk).drive 0
5
- dut.pin(:mosi).drive 0
6
- dut.pin(:miso).dont_care
7
-
8
- tester.cycle
9
-
10
- out_data = Origen::Registers::Reg.dummy(12).write 7
11
- in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
- cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in'
13
- dut.spi.shift master_out: out_data, master_in: in_data
14
-
15
- tester.cycle
16
- cc 'shifting in same register, should be no compares'
17
- dut.spi.shift master_in: in_data
1
+ Pattern.create do
2
+ tester.set_timeset 'tp0', 20
3
+ dut.pin(:ss).drive 1
4
+ dut.pin(:sclk).drive 0
5
+ dut.pin(:mosi).drive 0
6
+ dut.pin(:miso).dont_care
7
+
8
+ tester.cycle
9
+
10
+ out_data = Origen::Registers::Reg.dummy(12).write 7
11
+ in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
+ cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in'
13
+ dut.spi.shift master_out: out_data, master_in: in_data
14
+
15
+ tester.cycle
16
+ cc 'shifting in same register, should be no compares'
17
+ dut.spi.shift master_in: in_data
18
18
  end
@@ -1,39 +1,39 @@
1
- Pattern.create do
2
- tester.set_timeset 'tp0', 20
3
- dut.pin(:ss).drive 1
4
- dut.pin(:sclk).drive 0
5
- dut.pin(:mosi).drive 0
6
- dut.pin(:miso).dont_care
7
-
8
- tester.cycle
9
- dut.spi.sclk_cycle
10
- tester.cycle
11
-
12
- cc 'change multiple to 2'
13
- dut.spi.clk_multiple = 2
14
- dut.spi.sclk_cycle
15
- tester.cycle
16
-
17
- cc 'change multiple to 80'
18
- dut.spi.clk_multiple = 80
19
- dut.spi.sclk_cycle
20
- tester.cycle
21
-
22
- cc 'change clock format and repeat'
23
- dut.pin(:sclk).drive 1
24
- dut.spi.clk_format = :rh
25
- dut.spi.clk_multiple = 1
26
- dut.spi.sclk_cycle
27
- tester.cycle
28
-
29
- cc 'change multiple to 2'
30
- dut.spi.clk_multiple = 2
31
- dut.spi.sclk_cycle
32
- tester.cycle
33
-
34
- cc 'change multiple to 80'
35
- dut.spi.clk_multiple = 80
36
- dut.spi.sclk_cycle
37
- tester.cycle
38
-
1
+ Pattern.create do
2
+ tester.set_timeset 'tp0', 20
3
+ dut.pin(:ss).drive 1
4
+ dut.pin(:sclk).drive 0
5
+ dut.pin(:mosi).drive 0
6
+ dut.pin(:miso).dont_care
7
+
8
+ tester.cycle
9
+ dut.spi.sclk_cycle
10
+ tester.cycle
11
+
12
+ cc 'change multiple to 2'
13
+ dut.spi.clk_multiple = 2
14
+ dut.spi.sclk_cycle
15
+ tester.cycle
16
+
17
+ cc 'change multiple to 80'
18
+ dut.spi.clk_multiple = 80
19
+ dut.spi.sclk_cycle
20
+ tester.cycle
21
+
22
+ cc 'change clock format and repeat'
23
+ dut.pin(:sclk).drive 1
24
+ dut.spi.clk_format = :rh
25
+ dut.spi.clk_multiple = 1
26
+ dut.spi.sclk_cycle
27
+ tester.cycle
28
+
29
+ cc 'change multiple to 2'
30
+ dut.spi.clk_multiple = 2
31
+ dut.spi.sclk_cycle
32
+ tester.cycle
33
+
34
+ cc 'change multiple to 80'
35
+ dut.spi.clk_multiple = 80
36
+ dut.spi.sclk_cycle
37
+ tester.cycle
38
+
39
39
  end
@@ -1,25 +1,25 @@
1
- Pattern.create do
2
- tester.set_timeset 'tp0', 20
3
- dut.pin(:ss).drive 1
4
- dut.pin(:sclk).drive 0
5
- dut.pin(:mosi).drive 0
6
- dut.pin(:miso).dont_care
7
-
8
- tester.cycle
9
-
10
- out_data = Origen::Registers::Reg.dummy(12).write 7
11
- in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
- cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in -- keeping ss active'
13
- dut.spi.shift master_out: out_data, master_in: in_data, keep_ss_active: true
14
-
15
- cc 'cycle with ss active'
16
- tester.cycle
17
-
18
- cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in -- allow ss inactive'
19
- in_data.read
20
- dut.spi.shift master_out: out_data, master_in: in_data
21
-
22
- cc 'cycle with ss inactive'
23
- tester.cycle
24
-
1
+ Pattern.create do
2
+ tester.set_timeset 'tp0', 20
3
+ dut.pin(:ss).drive 1
4
+ dut.pin(:sclk).drive 0
5
+ dut.pin(:mosi).drive 0
6
+ dut.pin(:miso).dont_care
7
+
8
+ tester.cycle
9
+
10
+ out_data = Origen::Registers::Reg.dummy(12).write 7
11
+ in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
+ cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in -- keeping ss active'
13
+ dut.spi.shift master_out: out_data, master_in: in_data, keep_ss_active: true
14
+
15
+ cc 'cycle with ss active'
16
+ tester.cycle
17
+
18
+ cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in -- allow ss inactive'
19
+ in_data.read
20
+ dut.spi.shift master_out: out_data, master_in: in_data
21
+
22
+ cc 'cycle with ss inactive'
23
+ tester.cycle
24
+
25
25
  end
@@ -1,18 +1,18 @@
1
- Pattern.create do
2
- tester.set_timeset 'tp0', 20
3
- dut.pin(:ss).drive 1
4
- dut.pin(:sclk).drive 0
5
- dut.pin(:mosi).drive 0
6
- dut.pin(:miso).dont_care
7
-
8
- tester.cycle
9
- tester.overlay_style = :label
10
- out_data = Origen::Registers::Reg.dummy(12).write 7
11
- out_data.bits[3..0].overlay 'heres_the_label'
12
- dut.spi.shift master_out: out_data
13
-
14
- cc 'repeat test reversing bit order'
15
- dut.spi.data_order = :msb0
16
- out_data.bits[3..0].overlay 'heres_the_other_label'
17
- dut.spi.shift master_out: out_data
1
+ Pattern.create do
2
+ tester.set_timeset 'tp0', 20
3
+ dut.pin(:ss).drive 1
4
+ dut.pin(:sclk).drive 0
5
+ dut.pin(:mosi).drive 0
6
+ dut.pin(:miso).dont_care
7
+
8
+ tester.cycle
9
+ tester.overlay_style = :label
10
+ out_data = Origen::Registers::Reg.dummy(12).write 7
11
+ out_data.bits[3..0].overlay 'heres_the_label'
12
+ dut.spi.shift master_out: out_data
13
+
14
+ cc 'repeat test reversing bit order'
15
+ dut.spi.data_order = :msb0
16
+ out_data.bits[3..0].overlay 'heres_the_other_label'
17
+ dut.spi.shift master_out: out_data
18
18
  end
@@ -1,67 +1,67 @@
1
- Pattern.create do
2
- tester.set_timeset 'tp0', 20
3
- dut.pin(:ss).drive 1
4
- dut.pin(:sclk).drive 0
5
- dut.pin(:mosi).drive 0
6
- dut.pin(:miso).dont_care
7
-
8
- tester.cycle
9
-
10
- out_data = Origen::Registers::Reg.dummy(12).write 7
11
- in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
- cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in'
13
- dut.spi.shift master_out: out_data, master_in: in_data
14
-
15
- tester.cycle
16
-
17
- cc 'repeat 12-bits lsb first, 0x7 out, 0x5a5 in; clock multiple = 4'
18
- out_data.write 7
19
- in_data.read 0x5a5
20
- dut.spi.clk_multiple = 4
21
- dut.spi.shift master_out: out_data, master_in: in_data
22
-
23
- tester.cycle
24
-
25
- cc 'repeat 12-bits, 0x7 out, 0x5a5 in; clock multiple = 4, with msb first, move miso compare to cycle 3'
26
- out_data.write 7
27
- in_data.read 0x5a5
28
- dut.spi.data_order = :msb0
29
- dut.spi.miso_compare_cycle = 3
30
- dut.spi.shift master_out: out_data, master_in: in_data
31
-
32
- tester.cycle
33
-
34
- cc 'Now check bit masking'
35
- cc 'shift 0xa5a, 12-bits, msb first, multiple = 1, clk format :rh, all bits masked'
36
- dut.spi.clk_format = :rh
37
- dut.spi.clk_multiple = 1
38
- dut.spi.shift master_out: 0xa5a, size: 12
39
-
40
- tester.cycle
41
-
42
- cc 'repeat same, comparing for LLLL_XXXX_HHHH, clock back to :rl'
43
- dut.spi.clk_format = :rl
44
- in_data.write 0xf
45
- in_data.bits[11..8].read
46
- in_data.bits[7..4].clear_flags
47
- in_data.bits[3..0].read
48
- dut.spi.shift master_out: 0xa5a, master_in: in_data
49
-
50
- tester.cycle
51
-
52
- cc 'test capture'
53
- in_data.bits[11..8].read
54
- in_data.bits[7..4].store
55
- in_data.bits[3..0].read
56
- dut.spi.shift master_out: 0xa5a, master_in: in_data
57
-
58
- tester.cycle
59
-
60
- # cc 'test overlay, label should appear at bit 3'
61
- # out_data.write 0xa5a
62
- # out_data.bits[3..0].overlay 'heres_the_label'
63
- # tester.overlay_style = :label
64
- # dut.spi.shift master_out: out_data
65
-
66
- # tester.cycle
1
+ Pattern.create do
2
+ tester.set_timeset 'tp0', 20
3
+ dut.pin(:ss).drive 1
4
+ dut.pin(:sclk).drive 0
5
+ dut.pin(:mosi).drive 0
6
+ dut.pin(:miso).dont_care
7
+
8
+ tester.cycle
9
+
10
+ out_data = Origen::Registers::Reg.dummy(12).write 7
11
+ in_data = Origen::Registers::Reg.dummy(12).read 0x5a5
12
+ cc 'shifting 12-bits lsb first, 0x7 out, 0x5a5 in'
13
+ dut.spi.shift master_out: out_data, master_in: in_data
14
+
15
+ tester.cycle
16
+
17
+ cc 'repeat 12-bits lsb first, 0x7 out, 0x5a5 in; clock multiple = 4'
18
+ out_data.write 7
19
+ in_data.read 0x5a5
20
+ dut.spi.clk_multiple = 4
21
+ dut.spi.shift master_out: out_data, master_in: in_data
22
+
23
+ tester.cycle
24
+
25
+ cc 'repeat 12-bits, 0x7 out, 0x5a5 in; clock multiple = 4, with msb first, move miso compare to cycle 3'
26
+ out_data.write 7
27
+ in_data.read 0x5a5
28
+ dut.spi.data_order = :msb0
29
+ dut.spi.miso_compare_cycle = 3
30
+ dut.spi.shift master_out: out_data, master_in: in_data
31
+
32
+ tester.cycle
33
+
34
+ cc 'Now check bit masking'
35
+ cc 'shift 0xa5a, 12-bits, msb first, multiple = 1, clk format :rh, all bits masked'
36
+ dut.spi.clk_format = :rh
37
+ dut.spi.clk_multiple = 1
38
+ dut.spi.shift master_out: 0xa5a, size: 12
39
+
40
+ tester.cycle
41
+
42
+ cc 'repeat same, comparing for LLLL_XXXX_HHHH, clock back to :rl'
43
+ dut.spi.clk_format = :rl
44
+ in_data.write 0xf
45
+ in_data.bits[11..8].read
46
+ in_data.bits[7..4].clear_flags
47
+ in_data.bits[3..0].read
48
+ dut.spi.shift master_out: 0xa5a, master_in: in_data
49
+
50
+ tester.cycle
51
+
52
+ cc 'test capture'
53
+ in_data.bits[11..8].read
54
+ in_data.bits[7..4].store
55
+ in_data.bits[3..0].read
56
+ dut.spi.shift master_out: 0xa5a, master_in: in_data
57
+
58
+ tester.cycle
59
+
60
+ # cc 'test overlay, label should appear at bit 3'
61
+ # out_data.write 0xa5a
62
+ # out_data.bits[3..0].overlay 'heres_the_label'
63
+ # tester.overlay_style = :label
64
+ # dut.spi.shift master_out: out_data
65
+
66
+ # tester.cycle
67
67
  end
@@ -1,87 +1,87 @@
1
- % render "layouts/basic.html" do
2
-
3
- %# HTML tags can be embedded in mark down files if you want to do specific custom
4
- %# formatting like this, but in most cases that is not required.
5
- <h1><%= Origen.app.namespace %> <span style="font-size: 14px">(<%= Origen.app.version %>)</span></h1>
6
-
7
- ### Purpose
8
-
9
- This plugin implements SPI protocol with the tester acting as the master. There are 4 pins standard to SPI,
10
- however only sclk is required by this plugin. Any pins that aren't provided are ignored. This plugin seeks
11
- to be very flexible given that the SPI standard is itself very flexible.
12
-
13
- ### How To Install
14
-
15
- In your Gemfile add:
16
-
17
- ~~~ruby
18
- gem "<%= Origen.app.name %>"
19
- ~~~
20
-
21
- or if your application is a plugin, then add this to your <code>.gemspec</code>
22
-
23
- ~~~ruby
24
- spec.add_runtime_dependency "<%= Origen.app.name %>", ">= <%= Origen.app.version %>"
25
- ~~~
26
-
27
- __NOTE:__ In the case of a plugin, you will also need to <code>require '<%= Origen.app.name %>'</code> somewhere in your environment.
28
-
29
-
30
- ### How To Use
31
-
32
- The spi driver is intended to be instantiated as a sub_block. The configuration can be passed in as a hash and / or
33
- can be changed after instantiation. See API for more details.
34
-
35
- ~~~ruby
36
- sub_block :spi, class_name: 'OrigenSpi::Driver',
37
- sclk_pin: dut.pin(:sclk),
38
- mosi_pin: dut.pin(:mosi),
39
- miso_pin: dut.pin(:miso),
40
- ss_pin: dut.pin(:ss),
41
- # :rl - return low - input data changes while sclk is low and is latched on rising edge
42
- clk_format: :rl,
43
- # drive state of 0 activates the slave port
44
- ss_active: 0,
45
- # wait time after ss_active and before any sclk activity
46
- clk_wait_time: {time_in_cycles: 2},
47
- # number of sclks per tester.cycle
48
- clk_multiple: 1,
49
- data_order: :lsb0
50
- ~~~
51
-
52
- ~~~ruby
53
- # configuration can be changed after instantiation like this
54
- dut.spi.clk_multiple = 80
55
- dut.spi.miso_compare_cycle = 79
56
- dut.spi.ss_pin = nil
57
- ~~~
58
-
59
- Once the driver is instantiated shift operations can be performed by calls to the shift method (overlay/store/masking etc. is handled):
60
-
61
- ~~~ruby
62
- # shift out, masking input compares
63
- dut.spi.shift master_out: 0xFF, size: 32
64
-
65
- # shift out, register - size doesn't need to be passed when register is provided
66
- dut.spi.shift master_out: dut.my_reg
67
-
68
- # shift in read examples:
69
- dut.spi.shift master_in: 0xFF, size: 32
70
-
71
- # provide a register to mask or store (mark the bits appropriately)
72
- dut.spi.shift master_in: dut.my_reg
73
-
74
- # simultaneous shift in/out
75
- dut.spi.shift master_out: some_value_or_reg, master_in: some_other_value_or_reg
76
- ~~~
77
-
78
-
79
- ### How To Setup a Development Environment
80
-
81
- To setup a development environment:
82
-
83
- ~~~
84
- git clone https://github.com/Origen-SDK/origen_spi.git
85
- ~~~
86
-
87
- % end
1
+ % render "layouts/basic.html" do
2
+
3
+ %# HTML tags can be embedded in mark down files if you want to do specific custom
4
+ %# formatting like this, but in most cases that is not required.
5
+ <h1><%= Origen.app.namespace %> <span style="font-size: 14px">(<%= Origen.app.version %>)</span></h1>
6
+
7
+ ### Purpose
8
+
9
+ This plugin implements SPI protocol with the tester acting as the master. There are 4 pins standard to SPI,
10
+ however only sclk is required by this plugin. Any pins that aren't provided are ignored. This plugin seeks
11
+ to be very flexible given that the SPI standard is itself very flexible.
12
+
13
+ ### How To Install
14
+
15
+ In your Gemfile add:
16
+
17
+ ~~~ruby
18
+ gem "<%= Origen.app.name %>"
19
+ ~~~
20
+
21
+ or if your application is a plugin, then add this to your <code>.gemspec</code>
22
+
23
+ ~~~ruby
24
+ spec.add_runtime_dependency "<%= Origen.app.name %>", ">= <%= Origen.app.version %>"
25
+ ~~~
26
+
27
+ __NOTE:__ In the case of a plugin, you will also need to <code>require '<%= Origen.app.name %>'</code> somewhere in your environment.
28
+
29
+
30
+ ### How To Use
31
+
32
+ The spi driver is intended to be instantiated as a sub_block. The configuration can be passed in as a hash and / or
33
+ can be changed after instantiation. See API for more details.
34
+
35
+ ~~~ruby
36
+ sub_block :spi, class_name: 'OrigenSpi::Driver',
37
+ sclk_pin: dut.pin(:sclk),
38
+ mosi_pin: dut.pin(:mosi),
39
+ miso_pin: dut.pin(:miso),
40
+ ss_pin: dut.pin(:ss),
41
+ # :rl - return low - input data changes while sclk is low and is latched on rising edge
42
+ clk_format: :rl,
43
+ # drive state of 0 activates the slave port
44
+ ss_active: 0,
45
+ # wait time after ss_active and before any sclk activity
46
+ clk_wait_time: {time_in_cycles: 2},
47
+ # number of sclks per tester.cycle
48
+ clk_multiple: 1,
49
+ data_order: :lsb0
50
+ ~~~
51
+
52
+ ~~~ruby
53
+ # configuration can be changed after instantiation like this
54
+ dut.spi.clk_multiple = 80
55
+ dut.spi.miso_compare_cycle = 79
56
+ dut.spi.ss_pin = nil
57
+ ~~~
58
+
59
+ Once the driver is instantiated shift operations can be performed by calls to the shift method (overlay/store/masking etc. is handled):
60
+
61
+ ~~~ruby
62
+ # shift out, masking input compares
63
+ dut.spi.shift master_out: 0xFF, size: 32
64
+
65
+ # shift out, register - size doesn't need to be passed when register is provided
66
+ dut.spi.shift master_out: dut.my_reg
67
+
68
+ # shift in read examples:
69
+ dut.spi.shift master_in: 0xFF, size: 32
70
+
71
+ # provide a register to mask or store (mark the bits appropriately)
72
+ dut.spi.shift master_in: dut.my_reg
73
+
74
+ # simultaneous shift in/out
75
+ dut.spi.shift master_out: some_value_or_reg, master_in: some_other_value_or_reg
76
+ ~~~
77
+
78
+
79
+ ### How To Setup a Development Environment
80
+
81
+ To setup a development environment:
82
+
83
+ ~~~
84
+ git clone https://github.com/Origen-SDK/origen_spi.git
85
+ ~~~
86
+
87
+ % end