我对此代码有疑问!!!
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错误消息)
答案 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 Syntax或EBNF Syntax: VHDL'93(我目前不知道VHDL-2008的有用语法摘要)。
使用EBNF作为参考有一个有趣的副作用,即为我们提供讨论VHDL语法的通用语言,对描述错误和修复很有用。