我对VHDL非常陌生。在这里我有一个计算两个数字的GCD的程序。我有一堆案例和if语句。 当我试图模拟,它给了我6个错误没有太多的描述VHDL中的语法错误 - 在case语句中
错误: 'U:\ GCD.dwv' 错误0行41:语法错误 'U:\ GCD.dwv' 错误0线43 :语法错误
有趣的是他们每个人都被2行隔开。所以它从第33行开始,并且上升到43,同样的错误。它在“S3 =>”时开始。 这是我的代码。谢谢!
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''而不是'如果clk'event和clk ='1''。也要小心变量。我经常看到他们被初学者使用,但他们很少需要(特别是在相当简单的系统中),并且容易犯错误。您在这段代码中使用的变量都不是必需的。用信号替换它们或直接分配最终的输出/信号将清理代码。 – QuantumRipple 2014-09-27 01:53:47
你在'M:= T'行也有一个逻辑错误; M:= N; N:= T;'用于交换N和M.对于信号这是一个非问题 - 您不需要临时值,因为信号分配的右侧使用流程执行开始时的值('M < = N; N <= M'将按照预期的信号工作)。 – QuantumRipple 2014-09-27 01:56:34
@QuantumRipple感谢您的帮助。对于第二个,它们不是信号而是普通变量,所以我需要一个临时变量。对? – NoorUllah 2014-09-29 03:58:16