mux2to1: library ieee; use ieee.std_logic_1164.all; entity mux2to1 is port(in1, in2, sel: in std_logic; output: out std_logic); end entity; architecture bahavioral of mux2to1 is begin process(in1, in2, sel) begin case sel is when '0' => output <= in1; when others => output <= in2; end case; end process; end architecture; d flip flop: library ieee; use ieee.std_logic_1164.all; entity dff is port(d, clock, reset: in std_logic; q: out std_logic); end entity; architecture behavioral of dff is begin process(clock, reset) begin if rising_edge(clock) then if reset = '1' then q <= '0'; else q <= d; end if; end if; end process; end architecture; counter: library ieee; use ieee.std_logic_1164.all; entity counter is port(clock, reset, load, enable: in std_logic; d: in std_logic_vector(3 downto 0); a: out std_logic_vector(3 downto 0); carry: out std_logic); end entity; architecture structural of counter is component mux2to1 port(in1, in2, sel: in std_logic; output: out std_logic); end component; component dff port(d, clock, reset: in std_logic; q: out std_logic); end component; signal xor_out, and_out, q_out, mux_out: std_logic_vector(3 downto 0); begin block00: mux2to1 port map(in1 => xor_out(0), in2 => d(0), sel => load, output => mux_out(0)); block01: mux2to1 port map(in1 => xor_out(1), in2 => d(1), sel => load, output => mux_out(1)); block02: mux2to1 port map(in1 => xor_out(2), in2 => d(2), sel => load, output => mux_out(2)); block03: mux2to1 port map(in1 => xor_out(3), in2 => d(3), sel => load, output => mux_out(3)); block04: dff port map (d => mux_out(0), clock => clock, reset => reset, Q => Q_out(0)); block05: dff port map (d => mux_out(1), clock => clock, reset => reset, Q => Q_out(1)); block06: dff port map (d => mux_out(2), clock => clock, reset => reset, Q => Q_out(2)); block07: dff port map (d => mux_out(3), clock => clock, reset => reset, Q => Q_out(3)); xor_out(0) <= q_out(0) xor enable; xor_out(1) <= q_out(1) xor and_out(0); xor_out(2) <= q_out(2) xor and_out(1); xor_out(3) <= q_out(3) xor and_out(2); and_out(0) <= enable and q_out(0); and_out(1) <= and_out(0) and q_out(1); and_out(2) <= and_out(1) and q_out(2); and_out(3) <= and_out(2) and q_out(3); carry <= and_out(3); a <= q_out; end architecture; Above is the code for the counter. What I want is to implement a testbench. Below is the testbench that I have written. But the testbench is not working properly. The clock, reset, enable and load take values properly but the d is undefined. How can I do it work? testbench library ieee; use ieee.std_logic_1164.all; entity counter_tb is end entity; architecture counter_tb_arch of counter_tb is component counter port(clock, reset, load, enable: in std_logic; d: in std_logic_vector(3 downto 0); a: out std_logic_vector(3 downto 0); carry: out std_logic); end component; signal clock_tb, reset_tb, load_tb, enable_tb: std_logic; signal d_tb: std_logic_vector(3 downto 0); signal a_tb: std_logic_vector(3 downto 0); signal carry_tb: std_logic; begin dut: counter port map(clock => clock_tb, reset => reset_tb, load => load_tb, enable => enable_tb, d => d_tb, a => a_tb, carry => carry_tb); reset_stim: process begin reset_tb <= '1'; wait for 20 ns; reset_tb <= '0'; wait; end process; clock_stim: process begin clock_tb <= '0'; wait for 20 ns; clock_tb <= '1'; wait for 20 ns; end process; enable_stim: process begin enable_tb <= '0'; wait for 50 ns; enable_tb <= '1'; wait; end process; load_stim: process begin load_tb <= '0'; wait; end process; end architecture;
Christos Goulas wrote: > The clock, reset, enable and load take values > properly but the d is undefined. you have processes, that assign defined values to clock_tb, reset_tb, enable_tb and load_tb. But you do not assign anything to d_tb, which is an input of your counter. Christos Goulas wrote: > How can I do it work? assign a defined signal to d_tb.
Thanks for your response. Can you give me an example in order to test it.
Christos Goulas wrote: > Can you give me an example in order to test it. are you serious? well, maybe you try d_tb <= "1010";
it will solve, what he mentioned as problem: Christos Goulas wrote: > but the d is undefined. maybe he recognizes the next problem in the next step.
My updated testbench is below. I initialize the d_tb and when the load_tb = 0 the counter starts from 0. When load_tb = 1 I made it jump to 0101 and counts from there. How can I make it jump again into a new value. I put a new value to d_tb as you can see in load_stim process but the counter does not jump to the new value, rather continues from the last value. Thanks for responses and I am new to hdl programming, trying to understanding by myself, as I came from a programmer background library ieee; use ieee.std_logic_1164.all; entity counter_tb is end entity; architecture counter_tb_arch of counter_tb is component counter port(clock, reset, load, enable: in std_logic; d: in std_logic_vector(3 downto 0); a: out std_logic_vector(3 downto 0); carry: out std_logic); end component; signal clock_tb, reset_tb, load_tb, enable_tb: std_logic; signal d_tb: std_logic_vector(3 downto 0) := "0000"; signal a_tb: std_logic_vector(3 downto 0); signal carry_tb: std_logic; begin dut: counter port map(clock => clock_tb, reset => reset_tb, load => load_tb, enable => enable_tb, d => d_tb, a => a_tb, carry => carry_tb); reset_stim: process begin reset_tb <= '1'; wait for 21 ns; reset_tb <= '0'; wait; end process; clock_stim: process begin clock_tb <= '0'; wait for 20 ns; clock_tb <= '1'; wait for 20 ns; end process; enable_stim: process begin enable_tb <= '0'; wait for 50 ns; enable_tb <= '1'; wait; end process; load_stim: process begin load_tb <= '0'; wait for 200 ns; load_tb <= '1'; d_tb <= "0101"; wait for 20 ns; d_tb <= "0101"; wait for 20 ns; end process; end architecture;
Christos Goulas wrote: > I put a new value to d_tb as you can see No, your value is 0101. All the time. You can write the process as below:
1 | load_stim: process |
2 | begin
|
3 | load_tb <= '0'; |
4 | wait for 220 ns; |
5 | load_tb <= '1'; |
6 | d_tb <= "1001"; |
7 | wait for 40 ns; |
8 | load_tb <= '0'; |
9 | wait for 200 ns; |
10 | load_tb <= '1'; |
11 | d_tb <= "0101"; |
12 | wait for 40 ns; |
13 | load_tb <= '0'; |
14 | wait; |
15 | end process; |
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.