将 Process 中的 std_logic_vector 转换为整数以测试值?
Converting a std_logic_vector to integer within Process to test values?
我想做的很简单,就是从基本计数器生成一个脉冲。我的代码如下所示。我的问题是是否有比较 std_logic_vector 和整数的有效方法?我只需要在过程中的那个实例中比较它们。另外,您可以按照我的代码所示对 4 位信号进行算术运算吗?您需要特定的图书馆吗?
signal Top16: std_logic; -- 1 clk spike at 16x baud rate
signal Div16: std_logic_vector(3 downto 0);
DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.
------------------------------------------------------------------------
process (RST, LCLK_MULT_BUFG)
begin
if RST='1' then
Top16 <= '0'; --1 bit signal
Div16 <= x"0"; -- 4 bit signal
elsif rising_edge(LCLK_MULT_BUFG) then
Top16 <= '0';
if Div16 = Divisor then -----> signal to integer comparison?
Div16 <= 0;
Top16 <= '1';
else
Div16 <= Div16 + 1; -----arithmetic on std_logic_vector??
end if;
end if;
编辑:
Div16 std_logic_vector 中的位数将根据所选除数的大小而变化(如下所示)。如何正确格式化这个?需要哪些库?
DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.
constant COUNTER_BITS : natural := integer(ceil(log2(real(DIVISOR))));
signal Div16: std_logic_vector(COUNTER_BITS);
对于算术你可以使用std_logic_unsigned
。该库包含以下功能:
function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
为了比较,如果您使用 std_logic_unsigned
,您可以这样保留它。该库包含以下功能:
function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
您也可以将 Div16 定义为 unsigned
,然后使用 numeric_std
。该库包含以下用于比较的函数:
function "=" ( L: NATURAL; R: UNSIGNED) return BOOLEAN;
function "=" ( L: UNSIGNED; R: NATURAL) return BOOLEAN;
另外:
function "+" ( L: UNSIGNED; R: NATURAL) return UNSIGNED;
function "+" ( L: NATURAL; R: UNSIGNED) return UNSIGNED;
尽可能避免使用非标准的 std_logic_unsigned
库。最好使用 numeric_std
并将 Div16 声明为 unsigned
.
signal Div16: unsigned(3 downto 0);
那么你的比较和算术应该很简单。当然它是可合成的。
虽然 DIVISOR 应该是一个 CONSTANT 以便可以在编译时对其求值,但你的奖励问题也应该是可综合的,我认为你的意思是
signal Div16: unsigned(COUNTER_BITS - 1 downto 0);
我想做的很简单,就是从基本计数器生成一个脉冲。我的代码如下所示。我的问题是是否有比较 std_logic_vector 和整数的有效方法?我只需要在过程中的那个实例中比较它们。另外,您可以按照我的代码所示对 4 位信号进行算术运算吗?您需要特定的图书馆吗?
signal Top16: std_logic; -- 1 clk spike at 16x baud rate
signal Div16: std_logic_vector(3 downto 0);
DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.
------------------------------------------------------------------------
process (RST, LCLK_MULT_BUFG)
begin
if RST='1' then
Top16 <= '0'; --1 bit signal
Div16 <= x"0"; -- 4 bit signal
elsif rising_edge(LCLK_MULT_BUFG) then
Top16 <= '0';
if Div16 = Divisor then -----> signal to integer comparison?
Div16 <= 0;
Top16 <= '1';
else
Div16 <= Div16 + 1; -----arithmetic on std_logic_vector??
end if;
end if;
编辑:
Div16 std_logic_vector 中的位数将根据所选除数的大小而变化(如下所示)。如何正确格式化这个?需要哪些库?
DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.
constant COUNTER_BITS : natural := integer(ceil(log2(real(DIVISOR))));
signal Div16: std_logic_vector(COUNTER_BITS);
对于算术你可以使用std_logic_unsigned
。该库包含以下功能:
function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
为了比较,如果您使用 std_logic_unsigned
,您可以这样保留它。该库包含以下功能:
function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
您也可以将 Div16 定义为 unsigned
,然后使用 numeric_std
。该库包含以下用于比较的函数:
function "=" ( L: NATURAL; R: UNSIGNED) return BOOLEAN;
function "=" ( L: UNSIGNED; R: NATURAL) return BOOLEAN;
另外:
function "+" ( L: UNSIGNED; R: NATURAL) return UNSIGNED;
function "+" ( L: NATURAL; R: UNSIGNED) return UNSIGNED;
尽可能避免使用非标准的 std_logic_unsigned
库。最好使用 numeric_std
并将 Div16 声明为 unsigned
.
signal Div16: unsigned(3 downto 0);
那么你的比较和算术应该很简单。当然它是可合成的。
虽然 DIVISOR 应该是一个 CONSTANT 以便可以在编译时对其求值,但你的奖励问题也应该是可综合的,我认为你的意思是
signal Div16: unsigned(COUNTER_BITS - 1 downto 0);