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);  
4

2 回答 2

3

如果可能,请避免使用非标准std_logic_unsigned库。最好使用numeric_stdDiv16 并将其声明为unsigned.

signal Div16: unsigned(3 downto 0);

那么你的比较和算术应该很简单。当然它是可综合的。

您的奖励问题也应该是可综合的,尽管 DIVISOR 应该是一个 CONSTANT 以便可以在编译时对其进行评估,我认为您的意思是

signal Div16: unsigned(COUNTER_BITS - 1 downto 0);  
于 2015-08-20T19:46:15.177 回答
0

对于算术,您可以使用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;
于 2015-08-20T19:23:01.580 回答