1
+ library ieee;
2
+ use ieee.std_logic_1164.all ;
3
+
4
+ context work.com_context;
5
+ use work.stream_master_pkg.all ;
6
+ use work.stream_slave_pkg.all ;
7
+ use work.sync_pkg.all ;
8
+ use work.integer_vector_ptr_pkg.all ;
9
+ use work.queue_pkg.all ;
10
+
11
+ package spi_pkg is
12
+
13
+ type spi_master_t is record
14
+ p_actor : actor_t;
15
+ p_cpol_mode : std_logic ;
16
+ p_cpha_mode : std_logic ;
17
+ p_idle_state : std_logic ;
18
+ p_frequency : natural ;
19
+ end record ;
20
+
21
+ type spi_slave_t is record
22
+ p_actor : actor_t;
23
+ p_cpol_mode : std_logic ;
24
+ p_cpha_mode : std_logic ;
25
+ end record ;
26
+
27
+ procedure set_frequency (
28
+ signal net : inout network_t;
29
+ spi_master : spi_master_t;
30
+ frequency : natural
31
+ );
32
+
33
+ constant default_cpol_mode : std_logic := '0' ;
34
+ constant default_cpha_mode : std_logic := '0' ;
35
+ constant default_idle_state : std_logic := '0' ;
36
+ constant default_frequency : natural := 1000000 ;
37
+
38
+ impure function new_spi_master(
39
+ cpol_mode : std_logic := default_cpol_mode;
40
+ cpha_mode : std_logic := default_cpha_mode;
41
+ idle_state : std_logic := default_idle_state;
42
+ initial_frequency : natural := default_frequency
43
+ ) return spi_master_t;
44
+
45
+ impure function new_spi_slave(
46
+ cpol_mode : std_logic := default_cpol_mode;
47
+ cpha_mode : std_logic := default_cpha_mode
48
+ ) return spi_slave_t;
49
+
50
+ impure function as_stream(spi_master : spi_master_t) return stream_master_t;
51
+ impure function as_stream(spi_master : spi_master_t) return stream_slave_t;
52
+ impure function as_stream(spi_slave : spi_slave_t) return stream_master_t;
53
+ impure function as_stream(spi_slave : spi_slave_t) return stream_slave_t;
54
+ impure function as_sync (spi_master : spi_master_t) return sync_handle_t;
55
+ impure function as_sync (spi_slave : spi_slave_t) return sync_handle_t;
56
+
57
+ constant spi_set_frequency_msg : msg_type_t := new_msg_type(" spi set frequency" );
58
+
59
+ end package spi_pkg ;
60
+
61
+ package body spi_pkg is
62
+
63
+ impure function new_spi_master(
64
+ cpol_mode : std_logic := default_cpol_mode;
65
+ cpha_mode : std_logic := default_cpha_mode;
66
+ idle_state : std_logic := default_idle_state;
67
+ initial_frequency : natural := default_frequency
68
+ ) return spi_master_t is
69
+ begin
70
+ return (
71
+ p_actor => new_actor,
72
+ p_cpol_mode => cpol_mode,
73
+ p_cpha_mode => cpha_mode,
74
+ p_idle_state => default_idle_state,
75
+ p_frequency => initial_frequency
76
+ );
77
+ end function new_spi_master ;
78
+
79
+ impure function new_spi_slave(
80
+ cpol_mode : std_logic := default_cpol_mode;
81
+ cpha_mode : std_logic := default_cpha_mode
82
+ ) return spi_slave_t is
83
+ begin
84
+ return (
85
+ p_actor => new_actor,
86
+ p_cpol_mode => cpol_mode,
87
+ p_cpha_mode => cpha_mode
88
+ );
89
+ end function new_spi_slave;
90
+
91
+ impure function as_stream(spi_master : spi_master_t) return stream_master_t is
92
+ begin
93
+ return stream_master_t'(p_actor => spi_master.p_actor);
94
+ end function as_stream;
95
+
96
+ impure function as_stream(spi_master : spi_master_t) return stream_slave_t is
97
+ begin
98
+ return stream_slave_t'(p_actor => spi_master.p_actor);
99
+ end function as_stream;
100
+
101
+ impure function as_stream(spi_slave : spi_slave_t) return stream_master_t is
102
+ begin
103
+ return stream_master_t'(p_actor => spi_slave.p_actor);
104
+ end function as_stream;
105
+
106
+ impure function as_stream(spi_slave : spi_slave_t) return stream_slave_t is
107
+ begin
108
+ return stream_slave_t'(p_actor => spi_slave.p_actor);
109
+ end function as_stream;
110
+
111
+ impure function as_sync(spi_master : spi_master_t) return sync_handle_t is
112
+ begin
113
+ return spi_master.p_actor;
114
+ end function as_sync;
115
+
116
+ impure function as_sync(spi_slave : spi_slave_t) return sync_handle_t is
117
+ begin
118
+ return spi_slave.p_actor;
119
+ end function as_sync;
120
+
121
+ procedure set_frequency(
122
+ signal net : inout network_t;
123
+ spi_master : spi_master_t;
124
+ frequency : natural
125
+ ) is
126
+ variable msg : msg_t := new_msg(spi_set_frequency_msg);
127
+ begin
128
+ push(msg, frequency);
129
+ send(net,spi_master.p_actor,msg);
130
+ end procedure set_frequency;
131
+
132
+ end package body spi_pkg;
0 commit comments