Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 12111

Binary Coded Decimal Counter in VHDL

$
0
0

I have written this BCD-Counter in VHDL but the 10th place counter counts up every clock cylce instead of once, so instead of going from 09 to 10, the output is 09,19,29,39,... until bcd1_overflow is '0' again as you can see in the screenshot.

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity Counter7Segments is  port(    clk : in std_logic;    reset : in std_logic;    segments_1 : out std_logic_vector(6 downto 0);    segments_10 : out std_logic_vector(6 downto 0)  );end Counter7Segments;architecture rtl of Counter7Segments iscomponent ClockEnableGenerator is  generic(    DIVIDE_BY : integer  );  port(    clk_in : in std_logic;    clk_en_out : out std_logic;    reset : in std_logic  );end component;component GenericBCDCounter is  generic(    COUNT_MAX : integer  );  port(    clk : in std_logic;    enable : in std_logic;    reset : in std_logic;    count : out std_logic_vector(3 downto 0);    overflow : out std_logic  );end component;component BCDDecoder is  port(    digit : in std_logic_vector(3 downto 0);    segments : out std_logic_vector(6 downto 0)  );end component;signal clock_seconds : std_logic;signal count_1 : std_logic_vector(3 downto 0);signal count_10 : std_logic_vector(3 downto 0);signal bcd1_overflow : std_logic;beginClock : ClockEnableGenerator  generic map(    DIVIDE_BY => 13  )  port map(    clk_in => clk,    clk_en_out => clock_seconds,    reset => reset  );Counter_1 : GenericBCDCounter  generic map(    COUNT_MAX => 9  )  port map(    clk => clk,    enable => clock_seconds,    reset => reset,    count => count_1,    overflow => bcd1_overflow  );Counter_10 : GenericBCDCounter  generic map(    COUNT_MAX => 5  )  port map(     clk => clk,    enable => bcd1_overflow,    reset => reset,    count => count_10,    overflow => open  );Decoder_1 : BCDDecoder  port map(    digit => count_1,    segments => segments_1  );Decoder_10 : BCDDecoder  port map(    digit => count_10,    segments => segments_10  );end architecture rtl;

The simulation output

I tried having a synchronous bcd1_overflow_pulse, but it was off by some clock cyles, also I tried making the condition for Counter_10 to count up "bcd1_overflow and clock_seconds" but that didn't work either.

If you want to try something out with my code, here is the code for the components I used:

library ieee;use ieee.std_logic_1164.all;entity BCDDecoder isport(  digit : in std_logic_vector(3 downto 0);  segments : out std_logic_vector(6 downto 0));end BCDDecoder;architecture rtl of BCDDecoder isbeginprocess(digit)begin  if(digit = "0000") then    segments <= "1111110";  elsif(digit = "0001") then    segments <= "0110000";  elsif(digit = "0010") then    segments <= "1101101";  elsif(digit = "0011") then    segments <= "1111001";  elsif(digit = "0100") then    segments <= "0110011";  elsif(digit = "0101") then    segments <= "1011011";  elsif(digit = "0110") then    segments <= "1011111";  elsif(digit = "0111") then    segments <= "1110000";  elsif(digit = "1000") then    segments <= "1111111";  elsif(digit = "1001") then    segments <= "1111011";  end if;end process;end architecture rtl;
library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity ClockEnableGenerator isgeneric(  DIVIDE_BY : integer);port(  clk_in : in std_logic;  reset : in std_logic;  clk_en_out : out std_logic);end ClockEnableGenerator;architecture rtl of ClockEnableGenerator issignal counter : unsigned(3 downto 0) := "0000";beginprocess(clk_in, reset)begin  if(reset = '1') then    clk_en_out <= '0';    counter <= "0001";  elsif(rising_edge(clk_in)) then    if(counter = DIVIDE_BY - 1) then      counter <= (others => '0');      clk_en_out <= '1';    else      clk_en_out <= '0';      counter <= counter + 1;    end if;  end if;end process;end architecture rtl;
library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity GenericBCDCounter isgeneric(  COUNT_MAX : integer);port(  clk : in std_logic;  reset : in std_logic;  enable : in std_logic;  count : out std_logic_vector(3 downto 0);  overflow : out std_logic);end GenericBCDCounter;architecture rtl of GenericBCDCounter issignal value : unsigned(3 downto 0);beginprocess(clk)begin  if(reset = '1') then    value <= (others => '0');    overflow <= '0';  elsif(rising_edge(clk)) then    if(enable = '1') then      if(value = COUNT_MAX) then        value <= (others => '0');      else        value <= value + 1;      end if;      if(value + 1 = COUNT_MAX) then        overflow <= '1';      else        overflow <= '0';      end if;    else      if(value = COUNT_MAX) then        overflow <= '1';      else        overflow <= '0';      end if;    end if;  end if;end process;count <= std_logic_vector(value);end architecture rtl;

Viewing all articles
Browse latest Browse all 12111

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>