]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - tb/tb_mcc.vhd
Added irc_base.
[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   constant IRF_ADR_W     : integer := 5;
20
21   constant WAVE_SIZE : integer := 2**LUT_ADR_W;
22   
23
24   signal ACK_O : std_logic;
25   signal CLK_I : std_logic;
26   signal RST_I : std_logic;
27   signal STB_I : std_logic;
28
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;
36
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;
40
41   signal IRC_DAT_I : std_logic_vector (15 downto 0);
42
43   
44   subtype word_t is std_logic_vector (15 downto 0);
45   
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';
55
56 --------------------------------------------------------------------------------
57
58 begin
59
60   uut : entity work.mcc
61     generic map (
62       LUT_ADR_W => LUT_ADR_W,
63       LUT_DAT_W => LUT_DAT_W,
64       IRF_ADR_W => IRF_ADR_W)
65     port map (
66       ACK_O      => ACK_O,
67       CLK_I      => CLK_I,
68       RST_I      => RST_I,
69       STB_I      => STB_I,
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,
74       PWM_DAT_O  => open,
75       PWM1_STB_O => open,
76       PWM2_STB_O => open,
77       PWM3_STB_O => open,
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);
84
85   wave_table_1 : entity work.wave_table
86     generic map (
87       DAT_W     => LUT_DAT_W,
88       ADR_W     => LUT_ADR_W,
89       INIT_FILE => LUT_INIT_FILE)
90     port map (
91       ACK_O => open,
92       ADR_I => LUT_ADR_O,
93       CLK_I => CLK_I,
94       DAT_I => (others => '0'),
95       DAT_O => LUT_DAT_I,
96       STB_I => LUT_STB_O,
97       WE_I  => '0');
98   
99   
100   SYSCON_CLK : process is
101   begin
102     CLK_I <= '0';
103     wait for offset;
104     loop
105       CLK_I <= '1';
106       wait for period/2;
107       CLK_I <= '0';
108       wait for period/2;
109     end loop;
110   end process;
111
112   SYSCON_RST : process is
113   begin
114     RST_I <= '0';
115     wait for offset;
116     wait for 0.75*period;
117     RST_I <= '1';
118     wait for 2*period;
119     RST_I <= '0';
120     wait;
121   end process;
122
123   
124   DBG_MEM : process (IRF_STB_O, CLK_I) is
125   begin
126     IRF_ACK_I <= IRF_STB_O and (IRF_WE_O or dbg_ack);
127
128     if rising_edge(CLK_I) then
129       dbg_ack <= IRF_STB_O;
130     end if;
131
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');
144         end case;
145       else
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;
154           when others => null;
155         end case;
156       end if;
157     end if;
158   end process;
159   
160 --------------------------------------------------------------------------------
161
162   UUT_FEED : process is
163   begin
164     STB_I     <= '0';
165         
166     wait for offset;
167     wait for 4*period;
168
169     for i in 0 to 1 loop
170       IRC_DAT_I <= conv_std_logic_vector(8*i, 16);
171       --dbg_mem04 <= conv_std_logic_vector(i, 16);     
172       
173       STB_I <= '1';
174       wait until rising_edge(CLK_I) and ACK_O = '1';
175       STB_I <= '0';
176       wait for 4*period;
177     end loop;
178     
179     wait;
180   end process;
181   
182 end testbench;
183