【发布时间】: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。
-
很抱歉,我不明白它对我的问题有何帮助
-
您的问题完全一样:
mod和rem运算符没有为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 <= std_logic_vector(number);类型 unsigned 和 std_logic_vector 密切相关,允许类型转换,两者都具有相同的元素基类型 (std_ulogic) 和一维数组类型。然后代码将分析(编译)。 -
现在是一个令人讨厌的部分。
number <= 10 mod number;在过程敏感度列表中带有数字会导致递归,最终您将在模拟过程中除以 0,“DIV、MOD 或 REM 除以零”错误。正确的做法是合并 number_out -number_out <= std_logic_vector( 10 mod number);的分配,大概是在这个过程中。这两个 cmets 假定使用包 numeric_std。