Motion FPGA
Motion FPGA for the MachX02-7000HE Breakout Board
quad_decoder_tb.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 --! @file
3 --! @brief Quadrature Decoder test bench
4 -------------------------------------------------------------------------------
5 
6 --! Using IEEE library
7 LIBRARY ieee;
8 
9 --! Using IEEE standard logic components
10 USE ieee.std_logic_1164.ALL;
11 
12 --! Using IEE standard numeric components
13 USE ieee.numeric_std.ALL;
14 
15 --! @brief Test bench for quad_decoder entity
16 ENTITY quad_decoder_tb IS
17 END ENTITY quad_decoder_tb;
18 
19 --! Architecture tb of quad_decoder_tb entity
20 ARCHITECTURE tb OF quad_decoder_tb IS
21 
22  --! Test bench clock period
23  CONSTANT c_clk_period : time := 10 ns;
24 
25  --! Stimulus record type
26  TYPE t_stimulus IS RECORD
27  name : string(1 TO 20); --! Stimulus name
28  rst : std_logic; --! Reset input
29  quad_a : std_logic; --! Quadrature a signal
30  quad_b : std_logic; --! Quadrature b signal
31  count : unsigned(2 DOWNTO 0); --! Expected quadrature count
32  END RECORD t_stimulus;
33 
34  --! Stimulus array type
35  TYPE t_stimulus_array IS ARRAY(natural RANGE <>) OF t_stimulus;
36 
37  --! Test stimulus
39  (
40  (
41  name => "Reset ",
42  rst => '1',
43  quad_a => '0',
44  quad_b => '0',
45  count => B"000"
46  ),
47  (
48  name => "No change (0) ",
49  rst => '0',
50  quad_a => '0',
51  quad_b => '0',
52  count => B"000"
53  ),
54  (
55  name => "Increment (1) ",
56  rst => '0',
57  quad_a => '1',
58  quad_b => '0',
59  count => B"001"
60  ),
61  (
62  name => "Increment (2) ",
63  rst => '0',
64  quad_a => '1',
65  quad_b => '1',
66  count => B"010"
67  ),
68  (
69  name => "Increment (3) ",
70  rst => '0',
71  quad_a => '0',
72  quad_b => '1',
73  count => B"011"
74  ),
75  (
76  name => "Increment (4) ",
77  rst => '0',
78  quad_a => '0',
79  quad_b => '0',
80  count => B"100"
81  ),
82  (
83  name => "Increment (5) ",
84  rst => '0',
85  quad_a => '1',
86  quad_b => '0',
87  count => B"101"
88  ),
89  (
90  name => "Increment (6) ",
91  rst => '0',
92  quad_a => '1',
93  quad_b => '1',
94  count => B"110"
95  ),
96  (
97  name => "Increment (7) ",
98  rst => '0',
99  quad_a => '0',
100  quad_b => '1',
101  count => B"111"
102  ),
103  (
104  name => "Increment (0) ",
105  rst => '0',
106  quad_a => '0',
107  quad_b => '0',
108  count => B"000"
109  ),
110  (
111  name => "No change (0) ",
112  rst => '0',
113  quad_a => '0',
114  quad_b => '0',
115  count => B"000"
116  ),
117  (
118  name => "Decrement (7) ",
119  rst => '0',
120  quad_a => '0',
121  quad_b => '1',
122  count => B"111"
123  ),
124  (
125  name => "Decrement (6) ",
126  rst => '0',
127  quad_a => '1',
128  quad_b => '1',
129  count => B"110"
130  ),
131  (
132  name => "Decrement (5) ",
133  rst => '0',
134  quad_a => '1',
135  quad_b => '0',
136  count => B"101"
137  ),
138  (
139  name => "Decrement (4) ",
140  rst => '0',
141  quad_a => '0',
142  quad_b => '0',
143  count => B"100"
144  ),
145  (
146  name => "No change (4) ",
147  rst => '0',
148  quad_a => '0',
149  quad_b => '0',
150  count => B"100"
151  ),
152  (
153  name => "Glitch (4) ",
154  rst => '0',
155  quad_a => '1',
156  quad_b => '1',
157  count => B"100"
158  ),
159  (
160  name => "Glitch (4) ",
161  rst => '0',
162  quad_a => '0',
163  quad_b => '0',
164  count => B"100"
165  ),
166  (
167  name => "Increment (5) ",
168  rst => '0',
169  quad_a => '1',
170  quad_b => '0',
171  count => B"101"
172  ),
173  (
174  name => "Reset ",
175  rst => '1',
176  quad_a => '1',
177  quad_b => '0',
178  count => B"000"
179  ),
180  (
181  name => "No change (1) ",
182  rst => '0',
183  quad_a => '1',
184  quad_b => '0',
185  count => B"001"
186  )
187  );
188 
189  -- Signals to unit under test
190  SIGNAL clk : std_logic; --! Signal 'clk' to uut
191  SIGNAL rst : std_logic; --! Signal 'rst' to uut
192  SIGNAL quad_a : std_logic; --! Signal 'quad_a' to uut
193  SIGNAL quad_b : std_logic; --! Signal 'quad_b' to uut
194  SIGNAL quad_count : unsigned(2 DOWNTO 0); --! Signal 'quad_count' from uut
195 
196  --! Function to create string from unsigned
197  FUNCTION to_string (
198  vector : unsigned) RETURN string
199  IS
200 
201  VARIABLE v_str : string(1 TO vector'length);
202 
203  BEGIN
204 
205  FOR i IN vector'range LOOP
206  v_str(i + 1) := std_logic'image(vector(i))(2);
207  END LOOP;
208 
209  RETURN v_str;
210 
211  END FUNCTION to_string;
212 
213 BEGIN
214 
215  --! Instantiate quad_decoder as unit under test
216  i_uut : ENTITY work.quad_decoder(rtl)
217  GENERIC MAP (
218  bit_width => 3
219  )
220  PORT MAP (
221  clk_in => clk,
222  rst_in => rst,
223  quad_a_in => quad_a,
224  quad_b_in => quad_b,
226  );
227 
228  --! @brief Clock generation process
229  pr_clock : PROCESS IS
230  BEGIN
231 
232  -- Low for 1/2 clock period
233  clk <= '0';
234  WAIT FOR c_clk_period / 2;
235 
236  -- High for 1/2 clock period
237  clk <= '1';
238  WAIT FOR c_clk_period / 2;
239 
240  END PROCESS pr_clock;
241 
242  --! @brief Stimulus process to drive PWM unit under test
243  pr_stimulus : PROCESS IS
244  BEGIN
245 
246  -- Initialize entity inputs
247  rst <= '1';
248  quad_a <= '0';
249  quad_b <= '0';
250  WAIT FOR c_clk_period;
251 
252  -- Loop over stimulus
253  FOR s IN c_stimulus'range LOOP
254  -- Log start of stimulus
255  REPORT "Starting: " & c_stimulus(s).name SEVERITY note;
256 
257  -- Set inputs then wait for clock to rise
258  rst <= c_stimulus(s).rst;
259  quad_a <= c_stimulus(s).quad_a;
260  quad_b <= c_stimulus(s).quad_b;
261 
262  -- Wait for clk to fall
263  WAIT UNTIL clk = '0';
264 
265  -- Assert count
266  ASSERT quad_count = c_stimulus(s).count
267  REPORT "Expected count = " &
268  to_string(c_stimulus(s).count) &
269  " but got " &
270  to_string(quad_count)
271  SEVERITY error;
272  END LOOP;
273 
274  -- Log end of test
275  REPORT "Finished" SEVERITY note;
276 
277  -- Finish the simulation
278  std.env.finish;
279 
280  END PROCESS pr_stimulus;
281 
282 END ARCHITECTURE tb;
t_stimulus
Stimulus record type.
std_logic quad_a
Quadrature a signal.
t_stimulus_array :=((name => "Reset ",rst => '1',quad_a => '0',quad_b => '0',count => B"000"),(name => "No change (0) ",rst => '0',quad_a => '0',quad_b => '0',count => B"000"),(name => "Increment (1) ",rst => '0',quad_a => '1',quad_b => '0',count => B"001"),(name => "Increment (2) ",rst => '0',quad_a => '1',quad_b => '1',count => B"010"),(name => "Increment (3) ",rst => '0',quad_a => '0',quad_b => '1',count => B"011"),(name => "Increment (4) ",rst => '0',quad_a => '0',quad_b => '0',count => B"100"),(name => "Increment (5) ",rst => '0',quad_a => '1',quad_b => '0',count => B"101"),(name => "Increment (6) ",rst => '0',quad_a => '1',quad_b => '1',count => B"110"),(name => "Increment (7) ",rst => '0',quad_a => '0',quad_b => '1',count => B"111"),(name => "Increment (0) ",rst => '0',quad_a => '0',quad_b => '0',count => B"000"),(name => "No change (0) ",rst => '0',quad_a => '0',quad_b => '0',count => B"000"),(name => "Decrement (7) ",rst => '0',quad_a => '0',quad_b => '1',count => B"111"),(name => "Decrement (6) ",rst => '0',quad_a => '1',quad_b => '1',count => B"110"),(name => "Decrement (5) ",rst => '0',quad_a => '1',quad_b => '0',count => B"101"),(name => "Decrement (4) ",rst => '0',quad_a => '0',quad_b => '0',count => B"100"),(name => "No change (4) ",rst => '0',quad_a => '0',quad_b => '0',count => B"100"),(name => "Glitch (4) ",rst => '0',quad_a => '1',quad_b => '1',count => B"100"),(name => "Glitch (4) ",rst => '0',quad_a => '0',quad_b => '0',count => B"100"),(name => "Increment (5) ",rst => '0',quad_a => '1',quad_b => '0',count => B"101"),(name => "Reset ",rst => '1',quad_a => '1',quad_b => '0',count => B"000"),(name => "No change (1) ",rst => '0',quad_a => '1',quad_b => '0',count => B"001")) c_stimulus
Test stimulus.
Quadrature decoder entity.
unsigned( 2 DOWNTO 0) quad_count
Signal &#39;quad_count&#39; from uut.
in clk_instd_logic
Clock.
out quad_count_outunsigned( bit_width- 1 DOWNTO 0)
Quadrature count output.
in quad_a_instd_logic
Quadrature a input.
string( 1 TO 20) name
Stimulus name.
Test bench for quad_decoder entity.
array(natural range <> ) of t_stimulus t_stimulus_array
Stimulus array type.
std_logic quad_b
Quadrature b signal.
_library_ ieeeieee
Using IEEE library.
Definition: pwm_tb.vhd:7
std_logic rst
Reset input.
std_logic clk
Signal &#39;clk&#39; to uut.
unsigned( 2 DOWNTO 0) count
Expected quadrature count.
bit_widthnatural := 8
Width of the quadrature decoder.
in rst_instd_logic
Asynchronous reset.
string to_stringvector,
Function to create string from unsigned.
in quad_b_instd_logic
Quadrature b input.
time := 10 ns c_clk_period
Test bench clock period.