VHDL - 如何将1添加到STD_LOGIC_VECTOR?

时间:2013-04-10 00:21:17

标签: vhdl

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;

- 实体部分包含R,用于寄存器

的输出
entity register_16 is
    port(   input:  in std_logic_vector(15 downto 0);
        ld, inc, clk, clr:  in std_logic;
        R: buffer std_logic_vector(15 downto 0));
end register_16 ;

- 必须并行处理

architecture behavioral of register_16 is
begin


reg: process (input, ld, clk, clr)
    variable R_temp : std_logic_vector(15 downto 0);
begin
    if (clr='1') then
        R_temp := b"0000000000000000";
    elsif (clk'event and clk='1') then
        if (ld='1') then
            R_temp := input;
        end if;
    end if;
    R <= R_temp;
end process reg;

- 我在此步骤中的错误

inc_R: process (inc)
begin
    R <= R+'1';
end process inc_R;


end behavioral ;

- 主要流程(reg)正常工作 - 但是其他进程因添加1而出错。

5 个答案:

答案 0 :(得分:9)

您必须将向量转换为整数并再返回,这是一个示例:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

signal in  : std_logic_vector( 7 downto 0 );
signal out : std_logic_vector( 7 downto 0 );

out <= std_logic_vector(to_unsigned(to_integer(unsigned( in )) + 1, 8));

关于类型转换的好照片,请看这里:

http://www.bitweenie.com/listings/vhdl-type-conversion/

答案 1 :(得分:6)

很抱歉,您的代码存在很多问题......

  1. 您在同一过程中混合组合和顺序代码,这是一种糟糕的编码风格。如果编码正确,则实际上不需要变量R_temp。
  2. 灵敏度列表仅是模拟辅助,但您尝试将其用作条件(当inc更改时,增加R)。这在硬件中不起作用。当开始使用VHDL时,我的建议是使用VHDL_2008并始终使用process(all)作为灵敏度列表。这避免了初学者错误,因为它反映了合成的作用。
  3. 您正在第二个过程中创建组合循环。由于上述2,这不会出现在模拟中,但会导致合成错误。
  4. 正如baldyHDL已经提到的,您将在多个进程中分配给R。
  5. 在处理数字时,首选unsigned to std_logic_vector。通常,您不应该包括std_logic_arith,也不应该包括std_logic_unsigned,只需要std_logic_1164和numeric_std。
  6. 添加std_logic值(例如“1”)不是标准值,或者至少不是所有工具都支持。只需使用整数:R <= R + 1;
  7. 通过您的代码,我收集到您正在尝试使用递增,加载和清除信号来编写计数器。我不只是想给你代码(这会破坏你的学习经验),而是尝试使用以下模板将整个计数器整合到一个进程中:

    process(clk) begin
        if(rising_edge(clk)) then
            -- Your code here vvv
            if(clr = '1') then
    
            elsif(ld = '1') then
    
            elsif(inc = '1') then
    
            end if;
            -- Your code here ^^^
        end if;
    end process;
    

答案 2 :(得分:0)

你在两个进程中都写了R.这导致了无法合成的多驱动器情况。为了解决它,结合这些过程,例如:

reg: process (clk, clr)
  variable R_temp : std_logic_vector(15 downto 0);
begin
   if (clr='1') then
       R_temp := b"0000000000000000";
   elsif (clk'event and clk='1') then
       if (ld='1') then
           R_temp := input;
       elsif (inc='1') then
           R_temp := R_temp + '1';
       end if;
   end if;
   R <= R_temp;
end process reg;

答案 3 :(得分:0)

您应该可以添加包含值1的向量,因为您正在使用numeric_std库:

R <= R + x"0001";

答案 4 :(得分:0)

我使用了以下库,并且能够执行类似的操作

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

...

signal cnt : std_logic_vector(3 downto 0);


begin
    process(clk, reset, ce, cnt)
        begin
            if(reset = '1') then
                cnt <= "0000";
            elsif(clk'event and clk='1') then 
                if(ce='1') then
                    if(cnt = "1001") then
                        cnt <= "0000";
                    else
                        cnt <= cnt + 1;