【问题标题】:VHDL - ror and rol operationsVHDL - ror 和 rol 操作
【发布时间】:2018-11-20 08:56:46
【问题描述】:

我该如何解决这个问题? reg 变量定义为:

 signal reg:STD_LOGIC_VECTOR(7 downto 0):="00000001";

下面代码中ror操作有问题。错误信息是:

Line 109: Syntax error near "ror".

Line 108: found '0' definitions of operator "=", cannot determine exact overloaded matching definition for "="

--

  process(clk1,up_down,enable,reset)
        begin
        if up_down="1" then
            reg ror 1;
        end if;
        end process;

【问题讨论】:

  • up_down的类型是什么?字符串文字“1”不是那种类型。对于文件和受保护类型以外的每个类型声明,都定义了一个相等 ("=") 和不等式运算符 "/="。字符串文字的类型来自上下文,并且必须是具有字符枚举元素(例如字符串、std_ulogic_vector 等)的一维数组类型。如果没有minimal reproducible example,第 108 行错误的修复将不明显。

标签: syntax vhdl xilinx


【解决方案1】:

您的问题是ror 运算符未为std_logic_vector 定义。

VHDL 展示了一种称为重载的计算机(和硬件描述)语言的行为。重载是针对不同类型多次定义运算符、函数或过程的地方。编译器在使用运算符 (etc) 时查看类型组合(称为 signature),并尝试将其与已声明的各种版本相匹配。这仅在只有一个匹配项时才有效。再多的话,代码就模棱两可了,因为编译器不知道要使用哪个版本。更少,并且没有编译器可以使用的版本。这是您的问题 - 没有使用 std_logic_vectorror 运算符版本。

您有两种解决方案:

(i) 推荐:使用 concatenation 运算符和 slicing 手动实现 向右旋转 行为:

    if up_down="1" then
        reg <= reg(0) & reg(7 downto 1);
    end if;

(ii) 不推荐:将您的std_logic_vector 转换为确实定义了ror 运算符版本的不同类型,例如unsigned。为什么“不推荐”?因为我不建议使用以下任何运算符,因为它们的行为可能很奇怪(而且它们的行为在不同的 EDA 工具中似乎并不一致);

ror rol sla sra sll srl

顺便说一句,即使ror 是为std_logic_vector 定义的,这行也是错误的:

reg ror 1;

你不能只说,就像你能说的一样

reg + 1;

您需要将两种情况下的操作结果分配给某物。我假设在这两种情况下您都想将其分配给reg

【讨论】:

  • 针对 if 语句中返回 TRUE 的条件执行相应的语句序列。 reg ror 1 是移位表达式而不是顺序语句(IEEE Std 1076-2008 10.8 If 语句、9. 表达式、9.1 shift_expression、9.2.4 移位运算符、10. 顺序语句)。在不知道 up_down 类型的情况下,您可以判断“1”不是那种类型。相等运算符(9.2.3 关系运算符)是为除文件类型和受保护类型之外的所有类型定义的。字符串字面量的类型由上下文决定,应为一维数组类型(9.3.2 字面量)。
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多