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

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 に答える