Belle II KLM Scint Firmware
1
mppc_bias_dac088s085.vhd
1
library
IEEE
;
2
use
IEEE.STD_LOGIC_1164.
ALL
;
3
use
ieee.numeric_std.
all
;
4
use
ieee.std_logic_unsigned.
all
;
5
library
work
;
6
use
work.
klm_scint_pkg
.
all
;
7
----------------------------------------------------------------------------------
8
-- Company: UH Manoa- Department of Physics
9
-- Engineer: Isar Mostafanezhad
10
-- Create Date: 15:32:50 03/30/2015
11
-- Module Name: mppc_bias_dac088s085 - Behavioral
12
-- Description: FW for controlling and writing to MPPC bias DACs
13
--
14
-- Change Log:
15
-- 2020/07/28 - Linting only (CK)
16
--
17
-- Deficiencies:
18
-- 1. Need to study this module more and see if clken can be moved. Right now it's
19
-- 8 cases behind the clken multiplexer. (CK)
20
21
entity
mppc_bias_dac088s085
is
22
port
(
23
clk
:
in
std_logic
;
24
clken
:
in
std_logic
;
25
dac_ch_addr
:
in
std_logic_vector
(
3
downto
0
)
;
26
dac_val
:
in
std_logic_vector
(
7
downto
0
)
;
27
dac_update
:
in
std_logic
;
28
dac_busy
:
out
std_logic
;
29
dac_sclk
:
out
std_logic
;
30
dac_sync_n
:
out
std_logic
;
31
dac_din
:
out
std_logic
32
)
;
33
end
mppc_bias_dac088s085
;
34
35
36
architecture
Behavioral
of
mppc_bias_dac088s085
is
37
38
signal
addr_i
:
std_logic_vector
(
3
downto
0
)
;
39
signal
val_i
:
std_logic_vector
(
7
downto
0
)
;
40
signal
data
:
slv32
(
1
downto
0
)
;
41
constant
CMD_WTM
:
std_logic_vector
(
15
downto
0
)
:=
"1001000000000000"
;
42
43
type
trim_DAC_state_type
is
(
44
IDLE
,
45
SETUP_WTM
,
46
SET_BIT_COUNT,
47
SETUP_DIN
,
48
SET_SCLK_LOW,
49
DEC_BIT_COUNT
,
50
WAIT_END
51
)
;
52
53
signal
trim_DAC_state
:
trim_DAC_state_type
:=
IDLE
;
54
55
begin
56
57
process
(clk, clken)
58
variable
data_cnt
:
integer
range
0
to
1
:=
0
;
59
variable
bit_cnt
:
integer
range
0
to
31
:=
31
;
60
begin
61
62
if
rising_edge
(
clk
)
and
clken
=
'
1
'
then
63
64
case
trim_DAC_state
is
65
66
when
IDLE
=
>
67
dac_sclk
<=
'
1
'
;
68
dac_sync_n
<=
'
1
'
;
69
dac_din
<=
'
0
'
;
70
addr_i
<=
dac_ch_addr
;
71
val_i
<=
dac_val
;
72
if
dac_update
=
'
1
'
then
73
trim_DAC_state
<=
SETUP_WTM
;
74
dac_busy
<=
'
1
'
;
75
else
76
trim_DAC_state
<=
IDLE
;
77
dac_busy
<=
'
0
'
;
78
end
if
;
79
80
when
SETUP_WTM
=
>
81
dac_sync_n
<=
'
0
'
;
82
dac_busy
<=
'
1
'
;
83
data
(
0
)
<=
CMD_WTM
&
CMD_WTM
;
84
if
(
addr_i
(
3
)
=
'
0
'
)
then
85
data
(
1
)
<=
CMD_WTM
&
'
0
'
&
addr_i
(
2
downto
0
)
&
val_i
&
"0000"
;
86
else
87
data
(
1
)
<=
'
0
'
&
addr_i
(
2
downto
0
)
&
val_i
&
"0000"
&
CMD_WTM
;
88
end
if
;
89
data_cnt
:=
0
;
90
trim_DAC_state
<=
SET_BIT_COUNT
;
91
92
when
SET_BIT_COUNT
=
>
93
dac_sclk
<=
'
1
'
;
94
dac_sync_n
<=
'
0
'
;
95
dac_din
<=
'
0
'
;
96
bit_cnt
:=
31
;
97
trim_DAC_state
<=
SETUP_DIN
;
98
99
when
SETUP_DIN
=
>
100
dac_sclk
<=
'
1
'
;
101
dac_sync_n
<=
'
0
'
;
102
dac_din
<=
data
(
data_cnt
)
(
bit_cnt
)
;
103
trim_DAC_state
<=
SET_SCLK_LOW
;
104
105
when
SET_SCLK_LOW
=
>
106
dac_sclk
<=
'
0
'
;
107
dac_din
<=
data
(
data_cnt
)
(
bit_cnt
)
;
108
trim_DAC_state
<=
DEC_BIT_COUNT
;
109
110
when
DEC_BIT_COUNT
=
>
111
if
(
bit_cnt
/=
0
)
then
112
dac_sclk
<=
'
1
'
;
113
dac_din
<=
'
0
'
;
114
bit_cnt
:=
bit_cnt
-
1
;
115
trim_DAC_state
<=
SETUP_DIN
;
116
else
117
dac_sync_n
<=
'
1
'
;
118
if
(
data_cnt
=
0
)
then
119
data_cnt
:=
data_cnt
+
1
;
120
trim_DAC_state
<=
SET_BIT_COUNT
;
121
else
122
trim_DAC_state
<=
WAIT_END
;
123
end
if
;
124
end
if
;
125
126
when
WAIT_END
=
>
127
dac_sclk
<=
'
1
'
;
128
dac_din
<=
'
0
'
;
129
trim_DAC_state
<=
IDLE
;
130
131
when
others
=
>
132
trim_DAC_state
<=
IDLE
;
133
134
end
case
;
135
136
end
if
;
137
138
end
process
;
139
140
end
Behavioral
;
141
142
mppc_bias_dac088s085
Definition:
mppc_bias_dac088s085.vhd:21
klm_scint_pkg
Definition:
klm_scint_pkg.vhd:7
peripherals
mppc_bias_dac088s085.vhd
Generated by
1.8.13