library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity two_number_split is
Port ( number : in integer range 0 to 99;
position0 : out STD_LOGIC_VECTOR (3 downto 0);
position1 : out STD_LOGIC_VECTOR (3 downto 0));
end two_number_split;
architecture Behavioral of two_number_split is
signal pos0, pos1 : STD_LOGIC_VECTOR(3 downto 0);
begin
convert: process(number, pos0, pos1)
begin
pos1 <= number/10;
pos0 <= number mod 10;
position0 <= std_logic_vector(pos0);
position1 <= std_logic_vector(pos1);
end process convert;
end Behavioral;
错误:
ERROR:HDLCompiler:1638 - "C:\Users\XXX\Documents\SS\ISE_Ex\seven_segment\two_numbers.vhd" Line 19: found '0' definitions of operator "/", cannot determine exact overloaded matching definition for "/"
ERROR:HDLCompiler:1638 - "C:\Users\XXX\Documents\SS\ISE_Ex\seven_segment\two_numbers.vhd" Line 20: found '0' definitions of operator "mod", cannot determine exact overloaded matching definition for "mod"
我想我只是使用了错误的库。有什么建议吗?我已经尝试了上面列出的库的所有组合,但不确定发生了什么。
答案 0 :(得分:3)
您可以将pos0
和pos1
的声明修改为整数类型,计算然后将它们转换为BCD表示。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity two_number_split is
port (
number: in integer range 0 to 99;
position0: out std_logic_vector (3 downto 0);
position1: out std_logic_vector (3 downto 0)
);
end two_number_split;
architecture Behavioral of two_number_split is
signal pos0, pos1 : natural range 0 to 9; -- std_logic_vector(3 downto 0);
begin
convert: process(number, pos0, pos1)
begin
pos1 <= number/10;
pos0 <= number mod 10;
position0 <= std_logic_vector(to_unsigned(pos0,position0'LENGTH));
-- was <= std_logic_vector(pos0);
position1 <= std_logic_vector(to_unsigned(pos1,position1'LENGTH));
-- was <= std_logic_vector(pos1);
end process convert;
end Behavioral;
它使用to_unsigned
将十进制数值pos1和pos0转换为unsigned
数组类型。返回的unsigned
数组长度由第二个参数指定,该参数可以只是文字。
您可以使用unsigned
作为position0
和position1
的类型,并为每个作业保存类型转换。
这里的想法有三个:可读性,使用具有兼容的左右参数的运算符函数以及返回值,以及使用integer
乘法运算符比unsigned
运算符更快。 number
的自然范围暗示了无符号运算。
这个例子有效:
但不是特别合成合格 - 有两个乘法运算符。如果您需要综合某些内容,请参阅Convert 8bit binary number to BCD in VHDL,了解如何避免使用七位乘法运算符。
答案 1 :(得分:1)
std_logic_vector
传统上不是数字类型。它是一个比特集合,故意遗漏数字运算符以强化这种解释。您应该使用unsigned
中的signed
或numeric_std
类型来获取带有一组算术运算符的数组。
或者,如果您的工具支持VHDL-2008,则可以使用ieee.numeric_std_unsigned
向std_logic_vector
添加算术语义。它类似于std_logic_unsigned
,尽管它的名称和库映射不是标准库。