错误(10500):VHDL

时间:2014-07-21 22:26:00

标签: vhdl

我对此代码有疑问!!!

library ieee ;
use ieee.std_logic_1164.all;

entity tl2 is
    port( clk: in std_logic );
end tl2;

architecture ways2 of tl2 is
    component counter is
        generic(
            n: natural :=5
        ); port(
            clock:  in std_logic;
            clear:  in std_logic;
            count:  in std_logic;
            Q:  out std_logic_vector(n-1 downto 0)
        );
    end component;

    component tff is
        port(
            t: in  std_logic;
            clock: in std_logic;
            output: out std_logic
        );
    end component;

    signal x: std_logic;
    i: std_logic_vector(4 downto 0);
    ta , tb , tc: std_logic;
    tap , tbp , tcp: std_logic;

begin

    counter4: counter port map( clk => clock , '0' => clear , '1' => count , i => Q);
    A: tff port map(clk => clock , ta => t , tap => output);
    B: tff port map(clk => clock , tb => t , tbp => output);
    C: tff port map(clk => clock , tc => t , tcp => output);

    process( i.ta,tb,tc )
    begin
        if( i="00011" or i="00110" or i="10101" ) then
            x <= '1';
        end if;
        if( i="10101" ) then
            clear <= '0';
        end if;
        ta <= ((tbp and tcp and x)or(tap and tcp and x));
        tb <= (not tap and tcp and x);
        tc <= x;

    end process;

end ways2;

user3139746详细阐述了他在回应sharth评论的评论中提出的错误:

  

多数民众赞成错误:错误(10500):文本附近的tl2.vhd(27)处的VHDL语法错误   “一世”;期待“开始”,或声明语句错误(10500):VHDL   tl2.vhd(33)附近文本“=&gt;”的语法错误;期待“)”或“,” -   user3139746 4小时前

(这是Altera错误消息)

1 个答案:

答案 0 :(得分:0)

保留字信号是这些块声明项中的必需信号声明:

end component;

    signal x: std_logic;
    signal i: std_logic_vector(4 downto 0);  -- added reserved word signal
    signal ta , tb , tc: std_logic;          -- added reserved word signal
    signal tap , tbp , tcp: std_logic;       -- added reserved word signal

begin

那些摆脱了你的10500语法错误,(还有更多):

ghdl -a tl2.vhdl
tl2.vhdl:31:36:没有声明&#34;时钟&#34;
tl2.vhdl:31:51:没有声明&#34;清除&#34;
tl2.vhdl:31:66:没有声明&#34;计数&#34;
tl2.vhdl:31:79:没有声明&#34; q&#34;
tl2.vhdl:32:24:没有声明&#34;时钟&#34;
tl2.vhdl:32:38:没有声明&#34; t&#34;
tl2.vhdl:32:49:没有声明&#34;输出&#34;
tl2.vhdl:33:24:没有声明&#34;时钟&#34;
tl2.vhdl:33:38:没有声明&#34; t&#34;
tl2.vhdl:33:49:没有声明&#34;输出&#34;
tl2.vhdl:34:24:没有声明&#34;时钟&#34;
tl2.vhdl:34:38:没有声明&#34; t&#34;
tl2.vhdl:34:49:没有声明&#34;输出&#34;
tl2.vhdl:36:12:信号&#34;我&#34;不指定记录
tl2.vhdl:42:13:没有声明&#34;清除&#34;

您的组件实例中的形式和实际内容相反:

counter4: 
counter port map ( 
            clock => clk,
            clear => '0',
            count => '1',
            Q =>i
        );
            --- clk => clock , '0' => clear , '1' => count , i => Q);
A: 
    tff 
        port map (
            clock => clk,
            t => ta,
            output => tap
        );
            -- clk => clock , ta => t , tap => output);
B: 
    tff 
        port map (
            clock => clk,
            t => tb,
            output => tbp
        );
            -- clk => clock , tb => t , tbp => output);
C: 
    tff 
        port map (
            clock => clk,
            t => tc,
            output => tcp
            );
            --  clk => clock , tc => t , tcp => output);

请注意,对于命名关联,订单不必匹配组件声明。

tl2.vhdl:64:12:信号&#34;我&#34;没有指定记录:

    process( i,tap,tbp, tcp, x )          -- process( i.ta,tb,tc )
    begin
        if i = "00011" or i = "00110" or i = "10101"  then
            x <= '1';
        end if;
        if  i = "10101" then
            clear <= '0';
        end if;
        ta <= ((tbp and tcp and x)or(tap and tcp and x));
        tb <= (not tap and tcp and x);
        tc <= x;

    end process;

请注意,来自信号分配右侧或在if语句条件表达式中评估的每个信号都已添加到灵敏度列表中。 (而且现在有人必须在VHDL 2008中使用关键字all代替敏感度列表中的各个元素。)

ghdl -a tl2.vhdl
tl2.vhdl:70:13:没有声明&#34;清除&#34;

注意清除被定义为tl2的输入。您的意思是x在此处的作业:

    if( i="10101" ) then
        x <= '0';          -- clear <= '0';
    end if;

您还可以注意到,您在i的作业无处可去。 i的默认值为&#34; UUUUU&#34;这将保证if语句中的任何条件评估都不会导致赋值。你需要玩“哪里的Waldo&#39;还有i

目前还不清楚sharth如何破坏代码示例,看来他盲目地接受了一个只是检查你正在付费注意的测试用例。 (在我保存这个答案之前,我恢复了它,然后有人下了选票)。

错误10500是一个捕获所有语法错误,其中可以想象介词是有人会诉诸权威的VHDL文本(例如LRM)来解决语法问题。一般而言,错误消息不会教授语言,而且需要额外的努力来分析实际原因的语法错误,而不是VHDL标准所要求的,其中VHDL设计规范可以通过一个词汇的前瞻来分析令牌。

您可以从第一条错误消息的文本中看到它将i:解释为可以在任何语句之前的标签 - 除了声明性项目。错误消息留下了一些需要。第二个错误文本不比第一个更具启发性。

错误在于错误消息的质量,并且可能强化了用户至少会使用语法摘要来解决语法错误的想法。请参阅Hyperlinked VHDL-93 BNF SyntaxEBNF Syntax: VHDL'93(我目前不知道VHDL-2008的有用语法摘要)。

使用EBNF作为参考有一个有趣的副作用,即为我们提供讨论VHDL语法的通用语言,对描述错误和修复很有用。