3
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;

-- entity part contain R for output of Register
    
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 ;

-- it have to parallel process    

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;

-- my error in this step    

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

end behavioral;

主进程 (reg) 正常工作,但其他进程添加 1 时出错。

4

5 回答 5

14

您将不得不再次将向量转换为整数,这是一个示例:

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/

于 2014-08-06T09:48:36.020 回答
6

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

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

通过您的代码,我了解到您正在尝试编写一个带有增量、加载和清除信号的计数器。我不只是想给你代码(这会破坏你的学习体验),而是尝试使用以下模板将整个计数器放入一个进程中:

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;
于 2013-04-11T07:47:47.280 回答
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;
于 2013-04-10T05:45:42.457 回答
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;
于 2020-10-31T04:48:06.480 回答
0

您应该能够添加一个包含值 1 的向量,因为您正在使用 numeric_std 库:

R <= R + x"0001";
于 2017-01-20T13:26:32.960 回答