【问题标题】:VHDL Error 10500VHDL 错误 10500
【发布时间】:2016-11-26 06:37:28
【问题描述】:

我不知道为什么会出现以下错误。

错误 (10500):IR_REG.vhd(15) 附近文本“if”处的 VHDL 语法错误;期待“end”,或“(”,或标识符(“if”是保留关键字),或并发语句

这是我的代码,任何帮助将不胜感激

architecture behavior of IR_REG is
    signal temp: std_logic_vector(1 downto 0);
    begin
    if IR_LD='1' then
        temp <= Input when clk = '1';
        IR <= temp when clk = '0';
    end if;
    end behavior;

【问题讨论】:

标签: vhdl


【解决方案1】:

architecture 中不能有 if 语句。 architecture 中的关键思想是所有语句的并行执行没有order 的概念。例如,

architecture Struct of Counter
  signal A1: bit;
  signal A2: bit;
begin
  A1 <= A2 and '1';
  A2 <= '1';
end Struct;

如果这是一个顺序块,A1 将输出0,因为A2 最初采用其默认值0。但是 VHDL 的算法巧妙地多次执行该块,给出了两个语句 A1 &lt;= A2 and '1';A2 &lt;= '1'; 同时发生的效果

因此,如果您运行此代码,您将获得 A11A21

回答您的问题,if 是一个 顺序 语句,由于其顺序性,不能在进程内。但是,when 可以直接用于提供多路复用器的效果。

查看您的代码,您似乎想要制作一个级别敏感的锁存器。这就是你可以做到的。

architecture behavior of IR_REG is
    signal temp: std_logic_vector(1 downto 0);
    begin
      process(IR_LD, Input, temp, clk)
      begin
        if IR_LD = '1' and clk = '1' then
          temp <= Input;
        end if;
        if IR_LD = '1' and clk = '0' then
          IR <= temp;
        end if;
      end process;
    end behavior;

此代码将产生多路复用器效果,但您似乎想创建一个如上所示的锁存器。

architecture behavior of IR_REG is
    signal temp: std_logic_vector(1 downto 0);
    begin
      temp <= Input when clk = '1' and IR_LD = '1' else "00";
      IR <= temp when clk = '0' and IR_LD = '1' else "00";
    end behavior;

【讨论】:

  • 来自 IEEE Std 1076-2008 Annex I Glossary: block: (A) 设计层次结构的一部分的表示。块是外部块或内部块。 内部块:设计单元中的嵌套块,由块语句定义。 外部块: 位于库中的顶级设计实体,可用作其他设计中的组件。有 if 语句,没有 if 块。
  • VHDL 标准缺少您在architecture 中的关键思想。 “同时”这个词只用在一个地方,一个定义 - *受保护的类型: 一种类型,其对象受到多个进程同时访问的保护。
  • concurrent 这个词在这里会更好用吗?谢谢你的cmets
  • 无并发无助于您断言的准确性。请参见 11. 并发语句,11.1 概述 - 并发语句用于定义互连的块和过程,它们共同描述设计的整体行为或结构。并发语句彼此异步执行。
  • 现在好看了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多