2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
9 --------------------------------------------------------------------------------
11 architecture testbench of tb_mcc is
13 constant period : time := 500 ns;
14 constant offset : time := 0 us;
16 constant LUT_DAT_W : integer := 10;
17 constant LUT_ADR_W : integer := 9;
18 constant LUT_INIT_FILE : string := "../sin.lut";
19 constant IRF_ADR_W : integer := 5;
21 constant WAVE_SIZE : integer := 2**LUT_ADR_W;
24 signal ACK_O : std_logic;
25 signal CLK_I : std_logic;
26 signal RST_I : std_logic;
27 signal STB_I : std_logic;
29 signal IRF_ACK_I : std_logic;
30 signal IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
31 signal IRF_CYC_O : std_logic;
32 signal IRF_DAT_I : std_logic_vector (15 downto 0);
33 signal IRF_DAT_O : std_logic_vector (15 downto 0);
34 signal IRF_STB_O : std_logic;
35 signal IRF_WE_O : std_logic;
37 signal LUT_ADR_O : std_logic_vector (LUT_ADR_W-1 downto 0);
38 signal LUT_DAT_I : std_logic_vector (LUT_DAT_W-1 downto 0);
39 signal LUT_STB_O : std_logic;
41 signal IRC_DAT_I : std_logic_vector (15 downto 0);
44 subtype word_t is std_logic_vector (15 downto 0);
46 signal dbg_mem00 : word_t := "0000000000100111"; -- MCC enable flags (RO)
47 signal dbg_mem01 : word_t := (others => '0'); -- IRC
48 signal dbg_mem02 : word_t := "0000000000000000"; -- IRC base
49 signal dbg_mem03 : word_t := "0000000000000111"; -- IRC per revolution (7)
50 signal dbg_mem04 : word_t := (others => '0'); -- Angle
51 signal dbg_mem11 : word_t := (others => '0'); -- Phase 1
52 signal dbg_mem15 : word_t := (others => '0'); -- Phase 2
53 signal dbg_mem19 : word_t := (others => '0'); -- Phase 3
54 signal dbg_ack : std_logic := '0';
56 --------------------------------------------------------------------------------
62 LUT_ADR_W => LUT_ADR_W,
63 LUT_DAT_W => LUT_DAT_W,
64 IRF_ADR_W => IRF_ADR_W)
70 LUT_STB_O => LUT_STB_O,
71 LUT_ADR_O => LUT_ADR_O,
72 LUT_DAT_I => LUT_DAT_I,
73 IRC_DAT_I => IRC_DAT_I,
78 IRF_ACK_I => IRF_ACK_I,
79 IRF_ADR_O => IRF_ADR_O,
80 IRF_DAT_I => IRF_DAT_I,
81 IRF_DAT_O => IRF_DAT_O,
82 IRF_STB_O => IRF_STB_O,
83 IRF_WE_O => IRF_WE_O);
85 wave_table_1 : entity work.wave_table
89 INIT_FILE => LUT_INIT_FILE)
94 DAT_I => (others => '0'),
100 SYSCON_CLK : process is
112 SYSCON_RST : process is
116 wait for 0.75*period;
124 DBG_MEM : process (IRF_STB_O, CLK_I) is
126 IRF_ACK_I <= IRF_STB_O and (IRF_WE_O or dbg_ack);
128 if rising_edge(CLK_I) then
129 dbg_ack <= IRF_STB_O;
132 if rising_edge(CLK_I) and IRF_STB_O = '1' then
133 if IRF_WE_O = '0' then
134 case conv_integer(IRF_ADR_O) is
135 when 16#00# => IRF_DAT_I <= dbg_mem00;
136 when 16#01# => IRF_DAT_I <= dbg_mem01;
137 when 16#02# => IRF_DAT_I <= dbg_mem02;
138 when 16#03# => IRF_DAT_I <= dbg_mem03;
139 when 16#04# => IRF_DAT_I <= dbg_mem04;
140 when 16#11# => IRF_DAT_I <= dbg_mem11;
141 when 16#15# => IRF_DAT_I <= dbg_mem15;
142 when 16#19# => IRF_DAT_I <= dbg_mem19;
143 when others => IRF_DAT_I <= (others => '0');
146 case conv_integer(IRF_ADR_O) is
147 when 16#01# => dbg_mem01 <= IRF_DAT_O;
148 when 16#02# => dbg_mem02 <= IRF_DAT_O;
149 when 16#03# => dbg_mem03 <= IRF_DAT_O;
150 when 16#04# => dbg_mem04 <= IRF_DAT_O;
151 when 16#11# => dbg_mem11 <= IRF_DAT_O;
152 when 16#15# => dbg_mem15 <= IRF_DAT_O;
153 when 16#19# => dbg_mem19 <= IRF_DAT_O;
160 --------------------------------------------------------------------------------
162 UUT_FEED : process is
170 IRC_DAT_I <= conv_std_logic_vector(8*i, 16);
171 --dbg_mem04 <= conv_std_logic_vector(i, 16);
174 wait until rising_edge(CLK_I) and ACK_O = '1';