Wednesday 15 February 2012

VHDL Counter 0 to 99 -



VHDL Counter 0 to 99 -

i have problem code supposed count 0 99 problem have counter starts @ "80" , left number increments @ 10 seconds repeats..

something starts at: 80 81 82 83 84 04 05 06 07 08 09

my code this:

library ieee; utilize ieee.std_logic_1164.all; utilize ieee.std_logic_unsigned; -- pin 86 selector de display 1 -- pin 87 selec2 display -- seg pin 85, seg b 84, seg c 83, d 82, e 81, f 78, seg g pin 77, h 76 entity contadorexamen port( clk : in std_logic; -- se le asigna el pin 12 --clk1hz : out std_logic ;-- se le asigna el pin 51 datos : out std_logic_vector (6 downto 0); unidades : out std_logic; decenas: out std_logic ); end entity; architecture bh_examen2parcial of contadorexamen signal freq1 : integer range 0 5000 := 0; signal freqdec : integer range 0 24999999 := 0; signal freq100 : integer range 0 249999999 := 0; signal tmp1 : std_logic := '0'; signal tmp100 : std_logic := '0'; signal tmpdec : std_logic := '0'; signal counterunidades : integer range 0 10 := 0; signal counterdecenas : integer range 0 10 := 0; signal segdecenas : std_logic_vector(6 downto 0); signal segunidades : std_logic_vector(6 downto 0); begin process(clk) begin if(clk'event , clk = '1') if(freq1 >= 5000) freq1 <= 0; tmp1 <= not tmp1; else freq1 <= freq1 + 1; tmp1 <= tmp1; end if; if(freq100 >= 249999999) freq100 <= 0; tmp100 <= not tmp100; else freq100 <= freq100 + 1; tmp100 <= tmp100; end if; if(freqdec >= 24999999) freqdec <= 0; tmpdec <= not tmpdec; else freqdec <= freqdec + 1; tmpdec <= tmpdec; end if; end if; end process; -- principio de cambios en el programa process(tmp1) begin if(tmp1 = '1') unidades <= '0'; decenas <= '1'; datos <= segdecenas; else datos <= segunidades; decenas <= '0'; unidades <= '1'; end if; end process; paracontarunidades:process(tmp100) begin if (tmp100 = '1') if(counterunidades = 0) segunidades <= "0000001"; elsif (counterunidades = 1 ) segunidades <= "1001111"; elsif (counterunidades = 2 ) segunidades <= "0010010"; elsif (counterunidades = 3 ) segunidades <= "0000110"; elsif (counterunidades = 4 ) segunidades <= "1001100"; elsif (counterunidades = 5 ) segunidades <= "0100100"; elsif (counterunidades = 6 ) segunidades <= "1100000"; elsif (counterunidades = 7 ) segunidades <= "0001111"; elsif (counterunidades = 8 ) segunidades <= "0000000"; elsif (counterunidades = 9) segunidades <= "0001100"; else segunidades <= "1111111"; end if; if(counterunidades < 9) counterunidades <= counterunidades + 1; else counterunidades <= 0; end if; end if; end process; paracontardecenas:process(tmpdec) begin if (tmpdec = '1') if(counterdecenas = 0) segdecenas <= "0000001"; elsif (counterdecenas = 1 ) segdecenas <= "1001111"; elsif (counterdecenas = 2 ) segdecenas <= "0010010"; elsif (counterdecenas = 3 ) segdecenas <= "0000110"; elsif (counterdecenas = 4 ) segdecenas <= "1001100"; elsif (counterdecenas = 5 ) segdecenas <= "0100100"; elsif (counterdecenas = 6 ) segdecenas <= "1100000"; elsif (counterdecenas = 7 ) segdecenas <= "0001111"; elsif (counterdecenas = 8 ) segdecenas <= "0000000"; elsif (counterdecenas = 9) segdecenas <= "0001100"; else segdecenas <= "1111111"; end if; if(counterdecenas < 9) counterdecenas <= counterdecenas + 1; else counterdecenas <= 0; end if; end if; end process; end architecture;

a couple issues want into:

note counterdecenas , counterunidades should in sensitivity list of processes utilize them because (as written) want segunidades , segdecenas signals update when tmpdec or tmp100 remain '1' counters change.

moreover, assign counters values based on (such counterdecenas <= counterdecenas + 1;) outside of clocked process - produce combinatorial loop. these need triggered on clock edges.

beyond that, isn't clear entity supposed do. supposed count 0 99, more 1-liner take implement you've described desired functionality be.

vhdl counter

No comments:

Post a Comment