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 
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