2 changed files with 92 additions and 0 deletions
			
			
		@ -0,0 +1,40 @@ | 
				
			|||||
 | 
					library ieee; | 
				
			||||
 | 
					use ieee.std_logic_1164.all; | 
				
			||||
 | 
					use ieee.numeric_std.all; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					entity clock_divider is | 
				
			||||
 | 
					  generic ( | 
				
			||||
 | 
					            N : integer := 8 | 
				
			||||
 | 
					          ); | 
				
			||||
 | 
					  port    ( | 
				
			||||
 | 
					            i_clk         : in std_logic; | 
				
			||||
 | 
					            i_reset_n     : in std_logic; | 
				
			||||
 | 
					            i_divisor_vec : in std_logic_vector(N-1 downto 0); | 
				
			||||
 | 
					            o_clk         : out std_logic | 
				
			||||
 | 
					          ); | 
				
			||||
 | 
					end; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					architecture clock_divider_rtl of clock_divider is | 
				
			||||
 | 
					begin | 
				
			||||
 | 
					  clock_divider_main_proc: process(i_clk) | 
				
			||||
 | 
					    variable v_cnt      : integer range 0 to 2**(N-1)     := 0; | 
				
			||||
 | 
					    variable v_cnt_max  : integer range 0 to (2**(N-1))/2 := 0; | 
				
			||||
 | 
					    variable v_clk      : std_logic                       := '0'; | 
				
			||||
 | 
					  begin | 
				
			||||
 | 
					    if rising_edge(i_clk) then | 
				
			||||
 | 
					      if (i_reset_n = '0') then | 
				
			||||
 | 
					        v_cnt := 1; | 
				
			||||
 | 
					        v_cnt_max := to_integer(unsigned(i_divisor_vec))/2; | 
				
			||||
 | 
					        v_clk := '1'; | 
				
			||||
 | 
					      else | 
				
			||||
 | 
					        if (v_cnt >= v_cnt_max) then | 
				
			||||
 | 
					          v_cnt := 1; | 
				
			||||
 | 
					          v_clk := not v_clk; | 
				
			||||
 | 
					        else | 
				
			||||
 | 
					          v_cnt := v_cnt + 1; | 
				
			||||
 | 
					        end if; | 
				
			||||
 | 
					      end if; | 
				
			||||
 | 
					    end if; | 
				
			||||
 | 
					    o_clk <= v_clk; | 
				
			||||
 | 
					  end process clock_divider_main_proc; | 
				
			||||
 | 
					end; | 
				
			||||
@ -0,0 +1,52 @@ | 
				
			|||||
 | 
					library ieee; | 
				
			||||
 | 
					use ieee.std_logic_1164.all; | 
				
			||||
 | 
					use ieee.numeric_std.all; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					entity clock_divider_tb is | 
				
			||||
 | 
					end clock_divider_tb; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					architecture clock_divider_tb_rtl of clock_divider_tb is | 
				
			||||
 | 
					  -- 10 MHz clock | 
				
			||||
 | 
					  constant c_CLK_PERIOD : time := 100 ns; | 
				
			||||
 | 
					  constant c_N : integer := 8; | 
				
			||||
 | 
					  --for clock_divider_0: clock_divider use entity work.clock_divider; | 
				
			||||
 | 
					  signal tb_i_clk         : std_logic := '0'; | 
				
			||||
 | 
					  signal tb_i_reset_n     : std_logic := '1'; | 
				
			||||
 | 
					  signal tb_i_divisor_vec : std_logic_vector(c_N-1 downto 0) := x"00"; | 
				
			||||
 | 
					  signal tb_o_clk         : std_logic := '0'; | 
				
			||||
 | 
					  signal tb_done          : std_logic := '0'; | 
				
			||||
 | 
					begin | 
				
			||||
 | 
					  --clock_divider_0: clock_divider | 
				
			||||
 | 
					  clock_divider_0: entity work.clock_divider(clock_divider_rtl) | 
				
			||||
 | 
					  generic map (N => c_N) | 
				
			||||
 | 
					  port map ( | 
				
			||||
 | 
					             i_clk => tb_i_clk, | 
				
			||||
 | 
					             i_reset_n => tb_i_reset_n, | 
				
			||||
 | 
					             i_divisor_vec => tb_i_divisor_vec, | 
				
			||||
 | 
					             o_clk => tb_o_clk | 
				
			||||
 | 
					           ); | 
				
			||||
 | 
					  -- Generate clock. | 
				
			||||
 | 
					  p_clock : process is | 
				
			||||
 | 
					  begin | 
				
			||||
 | 
					    if (tb_done = '0') then | 
				
			||||
 | 
					      tb_i_clk <= '0'; | 
				
			||||
 | 
					      wait for c_CLK_PERIOD/2; | 
				
			||||
 | 
					      tb_i_clk <= '1'; | 
				
			||||
 | 
					      wait for c_CLK_PERIOD/2; | 
				
			||||
 | 
					    elsif tb_done = '1' then | 
				
			||||
 | 
					      wait; | 
				
			||||
 | 
					    end if; | 
				
			||||
 | 
					  end process p_clock; | 
				
			||||
 | 
					  -- Process for stimuli. | 
				
			||||
 | 
					  p_stimuli : process is | 
				
			||||
 | 
					  begin | 
				
			||||
 | 
					    tb_i_divisor_vec <= x"02"; | 
				
			||||
 | 
					    tb_i_reset_n <= '0'; | 
				
			||||
 | 
					    wait for c_CLK_PERIOD; | 
				
			||||
 | 
					    tb_i_reset_n <= '1'; | 
				
			||||
 | 
					    wait for 1 ms; | 
				
			||||
 | 
					    tb_done <= '1'; | 
				
			||||
 | 
					    assert false report "end of test" severity note; | 
				
			||||
 | 
					    wait; | 
				
			||||
 | 
					  end process p_stimuli; | 
				
			||||
 | 
					end clock_divider_tb_rtl; | 
				
			||||
					Loading…
					
					
				
		Reference in new issue