]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - tb/tb_mcc.vhd
README briefly describing MCC
[fpga/pwm.git] / tb / tb_mcc.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5
6 entity tb_mcc is
7 end tb_mcc;
8
9 --------------------------------------------------------------------------------
10
11 architecture testbench of tb_mcc is
12
13   constant period : time := 500 ns;
14   constant offset : time := 0 us;
15
16   constant LUT_DAT_W     : integer := 10;
17   constant LUT_ADR_W     : integer := 9;
18   constant LUT_INIT_FILE : string  := "../sin.lut";
19
20   constant WAVE_SIZE : integer := 2**LUT_ADR_W;
21   
22
23   signal ACK_O : std_logic;
24   signal CLK_I : std_logic;
25   signal RST_I : std_logic;
26   signal STB_I : std_logic;
27
28   signal IRF_ACK_I : std_logic;
29   signal IRF_ADR_O : std_logic_vector (4 downto 0);
30   signal IRF_CYC_O : std_logic;
31   signal IRF_DAT_I : std_logic_vector (15 downto 0);
32   signal IRF_DAT_O : std_logic_vector (15 downto 0);
33   signal IRF_STB_O : std_logic;
34   signal IRF_WE_O  : std_logic;
35
36   signal LUT_ADR_O : std_logic_vector (LUT_ADR_W-1 downto 0);
37   signal LUT_DAT_I : std_logic_vector (LUT_DAT_W-1 downto 0);
38   signal LUT_STB_O : std_logic;
39
40   signal IRC_DAT_I : std_logic_vector (15 downto 0);
41
42   
43   subtype word_t is std_logic_vector (15 downto 0);
44   
45   signal dbg_mem00 : word_t    := "0000000000100111";  -- MCC enable flags (RO)
46   signal dbg_mem01 : word_t    := (others => '0');     -- IRC
47   signal dbg_mem02 : word_t    := "0000000000000000";  -- IRC base
48   signal dbg_mem03 : word_t    := "0000000000000111";  -- IRC per revolution (7)
49   signal dbg_mem04 : word_t    := (others => '0');     -- Angle
50   signal dbg_mem11 : word_t    := (others => '0');     -- Phase 1
51   signal dbg_mem15 : word_t    := (others => '0');     -- Phase 2
52   signal dbg_mem19 : word_t    := (others => '0');     -- Phase 3
53   signal dbg_ack   : std_logic := '0';
54
55 --------------------------------------------------------------------------------
56
57 begin
58
59   uut : entity work.mcc
60     generic map (
61       LUT_ADR_W => LUT_ADR_W,
62       LUT_DAT_W => LUT_DAT_W)
63     port map (
64       ACK_O      => ACK_O,
65       CLK_I      => CLK_I,
66       RST_I      => RST_I,
67       STB_I      => STB_I,
68       LUT_STB_O  => LUT_STB_O,
69       LUT_ADR_O  => LUT_ADR_O,
70       LUT_DAT_I  => LUT_DAT_I,
71       IRC_DAT_I  => IRC_DAT_I,
72       PWM_DAT_O  => open,
73       PWM1_STB_O => open,
74       PWM2_STB_O => open,
75       PWM3_STB_O => open,
76       IRF_ACK_I  => IRF_ACK_I,
77       IRF_ADR_O  => IRF_ADR_O,
78       IRF_DAT_I  => IRF_DAT_I,
79       IRF_DAT_O  => IRF_DAT_O,
80       IRF_STB_O  => IRF_STB_O,
81       IRF_WE_O   => IRF_WE_O);
82
83   wave_table_1 : entity work.wave_table
84     generic map (
85       DAT_W     => LUT_DAT_W,
86       ADR_W     => LUT_ADR_W,
87       INIT_FILE => LUT_INIT_FILE)
88     port map (
89       ACK_O => open,
90       ADR_I => LUT_ADR_O,
91       CLK_I => CLK_I,
92       DAT_I => (others => '0'),
93       DAT_O => LUT_DAT_I,
94       STB_I => LUT_STB_O,
95       WE_I  => '0');
96   
97   
98   SYSCON_CLK : process is
99   begin
100     CLK_I <= '0';
101     wait for offset;
102     loop
103       CLK_I <= '1';
104       wait for period/2;
105       CLK_I <= '0';
106       wait for period/2;
107     end loop;
108   end process;
109
110   SYSCON_RST : process is
111   begin
112     RST_I <= '0';
113     wait for offset;
114     wait for 0.75*period;
115     RST_I <= '1';
116     wait for 2*period;
117     RST_I <= '0';
118     wait;
119   end process;
120
121   
122   DBG_MEM : process (IRF_STB_O, CLK_I) is
123   begin
124     IRF_ACK_I <= IRF_STB_O and (IRF_WE_O or dbg_ack);
125
126     if rising_edge(CLK_I) then
127       dbg_ack <= IRF_STB_O;
128     end if;
129
130     if rising_edge(CLK_I) and IRF_STB_O = '1' then
131       if IRF_WE_O = '0' then
132         case conv_integer(IRF_ADR_O) is
133           when 16#00# => IRF_DAT_I <= dbg_mem00;
134           when 16#01# => IRF_DAT_I <= dbg_mem01;
135           when 16#02# => IRF_DAT_I <= dbg_mem02;
136           when 16#03# => IRF_DAT_I <= dbg_mem03;
137           when 16#04# => IRF_DAT_I <= dbg_mem04;
138           when 16#11# => IRF_DAT_I <= dbg_mem11;
139           when 16#15# => IRF_DAT_I <= dbg_mem15;
140           when 16#19# => IRF_DAT_I <= dbg_mem19;
141           when others => IRF_DAT_I <= (others => '0');
142         end case;
143       else
144         case conv_integer(IRF_ADR_O) is
145           when 16#01# => dbg_mem01 <= IRF_DAT_O;
146           when 16#02# => dbg_mem02 <= IRF_DAT_O;
147           when 16#03# => dbg_mem03 <= IRF_DAT_O;
148           when 16#04# => dbg_mem04 <= IRF_DAT_O;
149           when 16#11# => dbg_mem11 <= IRF_DAT_O;
150           when 16#15# => dbg_mem15 <= IRF_DAT_O;
151           when 16#19# => dbg_mem19 <= IRF_DAT_O;
152           when others => null;
153         end case;
154       end if;
155     end if;
156   end process;
157   
158 --------------------------------------------------------------------------------
159
160   UUT_FEED : process is
161   begin
162     STB_I     <= '0';
163         
164     wait for offset;
165     wait for 4*period;
166
167     for i in 0 to 1 loop
168       IRC_DAT_I <= conv_std_logic_vector(8*i, 16);
169       --dbg_mem04 <= conv_std_logic_vector(i, 16);     
170       
171       STB_I <= '1';
172       wait until rising_edge(CLK_I) and ACK_O = '1';
173       STB_I <= '0';
174       wait for 4*period;
175     end loop;
176     
177     wait;
178   end process;
179   
180 end testbench;
181