I am quite a rookie in the VHDL world, but I seem to have hold of the basics. Atm I am working on a project, which involves me to take a 4-bit binary input (switches), read this value and convert it to decimal values.
This far I have variables (count_ones, count_tens) which are supposed to contain the decimal value of the input.
My current code is as following:
architecture Behavioral of Seven_Seg_Counter is signal count_ones : integer range 0 to 9 := 0; signal count_tens : integer range 0 to 9 := 0; signal count_hundreds : integer range 0 to 9 := 0; signal count_thousands : integer range 0 to 9 := 0; signal prescaler : integer := 0; signal anode : integer range 1 to 4 := 1; signal digit : STD_LOGIC_VECTOR(3 downto 0) := "1110"; begin Calculate: process (CLK) variable countings : integer range 0 to 9 := 0; begin if rising_edge(CLK) then if INPUT(3) = '1' then countings := 8; else countings := 0; end if; if INPUT(2) = '1' then countings := countings + 4; else countings := 0; end if; if INPUT(1) = '1' then countings := countings + 2; else countings := 0; end if; if INPUT(0) = '1' then countings := countings + 1; else countings := 0; end if; for I in 1 to 9 loop if countings > 9 then countings := countings - 10; count_tens <= count_tens + 1; else count_tens <= 0; end if; end loop; for G in 1 to 9 loop if countings > 0 then countings := countings - 1; count_ones <= count_ones + 1; else count_ones <= 0; end if; end loop; end if; end process; process (anode, count_thousands, count_hundreds, count_tens, count_ones) -- Bestemmer output som funktion signalerne anode (segmentvælger) og count_XX (den decimale værdi) begin case anode is when 1 => case count_ones is --abcdefg when 0 => sseg <= "0000001"; -- 0 when 1 => sseg <= "1001111"; -- 1 when 2 => sseg <= "0010010"; -- 2 when 3 => sseg <= "0000110"; -- 3 when 4 => sseg <= "1001100"; -- 4 when 5 => sseg <= "0100100"; -- 5 when 6 => sseg <= "0100000"; -- 6 when 7 => sseg <= "0001111"; -- 7 when 8 => sseg <= "0000000"; -- 8 when 9 => sseg <= "0000100"; -- 9 end case; when 2 => case count_tens is --abcdefg when 0 => sseg <= "0000001"; -- 0 when 1 => sseg <= "1001111"; -- 1 when 2 => sseg <= "0010010"; -- 2 when 3 => sseg <= "0000110"; -- 3 when 4 => sseg <= "1001100"; -- 4 when 5 => sseg <= "0100100"; -- 5 when 6 => sseg <= "0100000"; -- 6 when 7 => sseg <= "0001111"; -- 7 when 8 => sseg <= "0000000"; -- 8 when 9 => sseg <= "0000100"; -- 9 end case; when 3 => case count_hundreds is --abcdefg when 0 => sseg <= "0000001"; -- 0 when 1 => sseg <= "1001111"; -- 1 when 2 => sseg <= "0010010"; -- 2 when 3 => sseg <= "0000110"; -- 3 when 4 => sseg <= "1001100"; -- 4 when 5 => sseg <= "0100100"; -- 5 when 6 => sseg <= "0100000"; -- 6 when 7 => sseg <= "0001111"; -- 7 when 8 => sseg <= "0000000"; -- 8 when 9 => sseg <= "0000100"; -- 9 end case; when 4 => case count_thousands is --abcdefg when 0 => sseg <= "0000001"; -- 0 when 1 => sseg <= "1001111"; -- 1 when 2 => sseg <= "0010010"; -- 2 when 3 => sseg <= "0000110"; -- 3 when 4 => sseg <= "1001100"; -- 4 when 5 => sseg <= "0100100"; -- 5 when 6 => sseg <= "0100000"; -- 6 when 7 => sseg <= "0001111"; -- 7 when 8 => sseg <= "0000000"; -- 8 when 9 => sseg <= "0000100"; -- 9 end case; end case; end process; process (anode) begin case anode is when 1 => digit <= "1110"; when 2 => digit <= "1101"; when 3 => digit <= "1011"; when 4 => digit <= "0111"; end case; end process; segmentselect <= digit; LED_OUT <= INPUT; end Behavioral; My idea is, I store the binary value (looking aside 1's and 2's complement) in the variable countings (which works fine in a simulation). The next part is, where I actually find the value of countings, and store it's rightmost digit in the signal count_ones (ones), and the leftmost digit (tens) in the signal count_tens. For some unknown reason, my way of finding the ones and tens does not work well with those loops. Maybe I totally misunderstood how to use for loops.
Could any of you maybe help me out? I would really appreciate it.
Loops are tricky indeed. The thing is, a 4-bit input is only the beginning, I'd like to be able to read more, so if I can learn the basic method with just 4 bits, that'd be awesome.
Well, the count_ones signal is for the ones, and the count_tens is for the tens of the input, so I am not quite sure I get, how to_integer(unsigned(INPUT)); is gonna work out, so I get a decimal value from 0 to 9 in count_ones or count_tens.
The subtraction method you are referencing to, I believe, I have tried to implement that in my loops, which do not work out as expected.
