0

我需要real在两个进程之间共享一个值(a),但是当我尝试运行我的代码时,quartus给了我一个错误。

library IEEE;
USE ieee.std_logic_1164.all; 
USE ieee.std_logic_arith.all; 
USE ieee.std_logic_unsigned.all; 
use IEEE.MATH_REAL.ALL;

entity de0nano is
port (
 CLOCK_50      : in  std_logic;
KEY           : in  std_logic_vector(1 downto 0);
 SW            : in  std_logic_vector(3 downto 0);
 LED           : out std_logic_vector(7 downto 0);
 GPIO           : inout std_logic_vector(35 downto 0)


  );
end de0nano;

architecture struct of de0nano is
--declarations
signal   PN                 :  real :=0.0 ;
signal   PR                 :  real :=0.0 ;
signal   RC             :  integer :=1;
signal   NC             :  integer :=1;
signal   BET                :  integer :=1;


begin
count : process (CLOCK_50, GPIO)
begin 
 --A <= KEY(0);
 GPIO(24) <= '1';
--functional coding
LED <= "00011000";
 if (pn > pr) then
GPIO(26) <= '1';
LED <= "00000001";
else
GPIO(26) <= '0';                    
    end if;
 if (pn = pr) then
GPIO(26) <= '1';
LED <= "00000010";
else
GPIO(26) <= '0';                    
end if;
 if (pn < pr) then
GPIO(26) <= '1';
LED <= "00000011";
else
GPIO(26) <= '0';                    
end if;

end process;

probabilityController : process (CLOCK_50, KEY)
begin
--stato iniziale
if((RC + NC + BET)=1) then
pr <= 0.5;
pn <= 0.5;
end if;
--sequenza rossi consecutivi
if(RC>0) then
pr <= (5)**RC;
pn <= 1- (5)**RC;
end if;
--sequenza neri consecutivi
if(NC>0) then
pr <= (5)**NC;
pn <= 1- (5)**NC;
end if;

end process;

betController : process (CLOCK_50)
begin

end process;

colorController : process (CLOCK_50, KEY)
begin
if(KEY(0)='1') then
NC<=0;
RC <= RC+1;
end if;

if(KEY(1)='1') then
RC<=0;
NC <= NC+1;
end if;


end process;

end str

如何在来自两个不同进程的相同信号/变量中进行操作?

4

1 回答 1

1

VHDL 是一种硬件描述语言。VHDL 描述可以被模拟(有点像大多数编程语言一样执行)或合成(在互连的简单硬件元素的网络中转换)。一些工具是纯模拟器(Mentor Graphics Modelsim、Cadence ncsim...),另一些是纯合成器(Mentor Graphics Precision RTL、Cadence RTL 编译器...),而另一些则可以两者兼得。Quartus 属于最后一个类别。所以,首先要做的是决定是要模拟、合成还是两者兼而有之。

如果你想模拟你必须修复三个错误:

  • 你的信号声明的位置,
  • 你分配它的方式(:=)是变量赋值运算符,而不是信号分配(<=
  • 以及您从两个进程驱动它的事实,而它是未解决的类型(real)。有关已解决/未解决的 VHDL 类型,请参阅此其他答案

然后您的代码可能看起来像这样(但由于我不知道您要做什么,它可能不是您想要的):

architecture V1 of AOI is
    Signal foobar : real := 0.0;
begin
    OneTwo : process (clk)
    Begin
         Foobar <= foobar + 2.0;
    End process;
end V1;

如果要合成,则必须解决更多问题:

  • 您正在使用real浮点 VHDL 类型的类型。这不是我知道的合成器可以合成的。确实,您希望合成器做什么?实例化一个完整的浮点单元?什么牌子?因此,您将不得不用real其他类型(整数、位向量...)替换。
  • 您正在将信号分配在我认为是您的时钟(clk)的两个边缘。这可能不是你想要的。
  • 您在声明时初始化信号。这通常不能由我知道的合成器合成。其实这initialization time对于模拟有着明确的意义:它是模拟的开始。但是硬件呢?beginning一个硬件是什么?制造业?充电?因此,如果您希望在某个时候初始化信号,则必须添加由reset输入驱动的硬件复位。

总而言之,您可以拥有类似的东西:

architecture V1 of AOI is
    Signal foobar : natural range 0 to 255;
begin
    OneTwo : process (clk)
    Begin
         if rising_edge(clk) then
              if reset = '1' then
                  foobar <= 0;
              else
                  foobar <= foobar + 2;
              end if;
         end if;
    End process;
end V1;

笔记:

  • VHDL 不区分大小写,但您应该尽量保持一致,它会对您有所帮助。
  • 在尝试使用该语言之前,您可能应该参加 VHDL 课程或阅读 VHDL 入门。它与您已经知道的编程语言完全不同。硬件和软件是完全不同的世界,即使它们最终紧密相连。
于 2015-09-02T06:30:26.677 回答