I'm very new to VHDL. Here I have a program that calculates GCD of two numbers. I have a bunch of cases and if statements. When I try to simulate, it gives me 6 errors without much description
Errors: 'U:\GCD.dwv' Error 0 line 41 : Syntax error 'U:\GCD.dwv' Error 0 line 43 : Syntax error
The interesting thing is each of them is separated by 2 lines. So it starts with line 33 and goes up to 43 with the same error. It starts on line where "when S3 =>". Here is my code. Thank you!
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity GCD is
port(clk, st : in std_logic; d1, d2 : in std_logic_vector(15 downto 0); dout : out std_logic_vector(15 downto 0); rdy : out std_logic);
end GCD;
architecture behav of GCD is
type state is (S0, S1, S2, S3, S4, S5, S6, S7);
signal new_state : state;
signal eq, It, eq1 : boolean;
begin
--State Transition Process
process is
variable curr_state : state := S0;
begin
if clk ='1' then
case curr_state is
when S0 =>
if st='1' then curr_state := S1;
end if;
when S1 =>
curr_state := S2;
when S2 =>
if eq then curr_state := S7;
else if It then curr_state := S4;
else if not(eq or It) then curr_state := S3;
end if;
when S3 =>
curr_state := S4;
when S4 =>
curr_state := S5;
when S5 =>
if eq1 then curr_state := S7;
else curr_state := S6;
end if;
when S6 =>
curr_state := S1;
when S7 =>
if not(st) then curr_state := S0;
end if;
end case;
new_state <= curr_state;
end if;
wait on clk;
end process;
-- Asserted Outputs Process:
process is
variable M, N, T, dout_val : std_logic_vector(15 downto 0);
variable rdy_val : std_logic;
variable eq_val, It_val, eq1_val : boolean;
begin
rdy_val := '0';
case new_state is
when S0 =>
M := d1; N := d2;
when S1 =>
eq_val := M=N; It_val := to_integer(M) < to_integer(N);
when S2 =>
when S3 =>
M := T; M := N; N := T;
when S4 =>
eq1_val := to_integer(M) = 1;
when S5 =>
when S6 =>
N := N - M;
when S7 =>
rdy_val := '1'; dout_val := M;
end case;
eq <= eq_val;
It <= It_val;
eq1 <= eq1_val;
rdy <= rdy_val;
dout <= dout_val;
wait on new_state;
end process;
end behav;
if clk='1'instead ofif clk'event and clk='1'. Be careful with variables too. I often see them used by beginners, but they are very rarely needed (especially in fairly simple systems) and easy to make mistakes with. None of the variables you use in this piece of code are needed. Replacing them with signals or direct assignments to the eventual output/signal would clean up the code.M := T; M := N; N:= T;for swapping N and M. With signals this is a non-issue - you don't need a temporary value because the right hand side of signal assignments uses the value at the start of process execution (M <= N; N <= Mwould work as intended with signals).