【问题标题】:VHDL : how to use rem and mod command in VHDL ? (syntax problem)VHDL:如何在 VHDL 中使用 rem 和 mod 命令? (语法问题)
【发布时间】:2018-11-20 10:32:28
【问题描述】:

你好,我想取二进制数23。二进制形式是:010111

所以如果例如 23 mod 10 我会得到 3 。如何在 VHDL 中执行此命令?这是我到目前为止写的:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY rem_command IS
  GENERIC (display_resolution : INTEGER :=23;   -- counter to get to the loest ferquncy 
  display_counter: INTEGER :=8);        -- counter to get to 97KHz ferquincy 

PORT (
    CLK_IN :IN STD_LOGIC;
    PWM_LIMIT :IN STD_LOGIC_VECTOR(display_counter downto 0);
    COUNTER_VECTOR :IN  STD_LOGIC_VECTOR(display_counter downto 0);
    number_out: OUT  STD_LOGIC 
    );
END rem_command;

ARCHITECTURE testing_reminder_command  OF  rem_command  I
    signal number : std_logic_vector(5 downto 0):="010111"; -- this is 23 in binary form 
BEGIN
        process(COUNTER_VECTOR,PWM_LIMIT,CLK_IN,number)
        BEGIN
                number <= 10 MOD number;                                                
        end process;

    number_out<=number;

END testing_reminder_command ;

我得到的错误是:

错误 (10327):rem_command.vhd(48) 处的 VHDL 错误:无法确定 运算符 ""mod"" 的定义 -- 找到 0 个可能的定义

也许我需要添加库?

【问题讨论】:

  • 你需要阅读my answer here
  • 很抱歉,我不明白它对我的问题有何帮助
  • 您的问题完全一样:modrem 运算符没有为 std_logic_vector 定义。您需要使用为其定义的不同类型,例如unsigned。基本上,永远不要使用std_logic_vector 类型来做数学。它不是为此而设计的。如果您不熟悉unsigned 类型和类型转换,请查看these examples
  • 您会发现将 number 声明为类型 unsigned 分配给 number_out 失败。 number_out 是 std_logic 类型(并且应该是 std_logic_vector 或无符号,每个 number 元素都有一个匹配元素,在模拟中的信号更新期间检查)。如果 number_out 是 std_logic_vector (5 down to 0) 那么 number 必须被转换 - number_out &lt;= std_logic_vector(number); 类型 unsigned 和 std_logic_vector 密切相关,允许类型转换,两者都具有相同的元素基类型 (std_ulogic) 和一维数组类型。然后代码将分析(编译)。
  • 现在是一个令人讨厌的部分。 number &lt;= 10 mod number; 在过程敏感度列表中带有数字会导致递归,最终您将在模拟过程中除以 0,“DIV、MOD 或 REM 除以零”错误。正确的做法是合并 number_out - number_out &lt;= std_logic_vector( 10 mod number); 的分配,大概是在这个过程中。这两个 cmets 假定使用包 numeric_std。

标签: syntax vhdl


【解决方案1】:

如果您确实想使用“mod”和“rem”运算符:

  • 它们未在您使用的任何包中定义。
  • 修复:使用 ieee.numeric_std.all
  • modrem 不在 std_logic_vector 上运行。因此,您需要在 std_logic_vector 信号上实现类型转换

【讨论】:

  • mod and rem 也对unsignedsigned类型进行操作。
  • 我添加了 use iee.numeric_std.all 包,但现在我得到了其他错误:信号编号:无符号(5 downto 0):=“010111”; -- 这是二进制形式的 23
  • 听起来你需要问另一个问题。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多