Vhdl 两个过程中的变量不适合我

Vhdl 两个过程中的变量不适合我,vhdl,Vhdl,我有一个很烦人的问题。所以我正在为我即将成为的线跟踪探雷机器人编写VHDL代码。这个问题是关于地雷探测器的代码。基本原理:探雷传感器的频率约为7 kHz。如果传感器位于“地雷”上方,则频率会下降一点,最高为6.9 kHz。我想用VHDL实现这个。我认为到目前为止我所得到的应该是有效的,而且我在代码中输入了错误的值。然而,我对此并不确定。所以,首先,我希望有人能证实这是可行的,我只是对这些价值观很愚蠢。如果是这样,我希望那个人能在价值观方面帮助我;) 代码如下: library IEEE; use

我有一个很烦人的问题。所以我正在为我即将成为的线跟踪探雷机器人编写VHDL代码。这个问题是关于地雷探测器的代码。基本原理:探雷传感器的频率约为7 kHz。如果传感器位于“地雷”上方,则频率会下降一点,最高为6.9 kHz。我想用VHDL实现这个。我认为到目前为止我所得到的应该是有效的,而且我在代码中输入了错误的值。然而,我对此并不确定。所以,首先,我希望有人能证实这是可行的,我只是对这些价值观很愚蠢。如果是这样,我希望那个人能在价值观方面帮助我;) 代码如下:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity MineDetector is
port(clk: in std_logic;
           MineSensor: in std_logic;
     Mine: out std_logic
     );
end MineDetector;

architecture behaviour of MineDetector is

shared variable vClk:  integer := 0;
shared variable vBeat: integer := 0;

begin

  process(MineSensor)
  begin
      if (MineSensor'event AND MineSensor = '1') then
          vBeat := vBeat+1;
      end if;

      if (vBeat > 970) then
          if (vClk < 7142857) then
              Mine <= '0';
          elsif (vClk >= 7142857) then
              Mine <= '1';
          end if;

          vBeat := 0;
      end if;
  end process;

  process(clk)
  begin
      if (vBeat = 0)                 then   vClk := 0;
      elsif(clk'event AND clk = '1') then  vClk := vClk+1;
      end if;
  end process;

end architecture;

-- 7030 Hz without metal
-- < 6900 Hz with metaal

-----
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

entity testbench is
end entity testbench;

architecture test of testbench is

component MineDetector is
port(clk: in std_logic;
           MineSensor: in std_logic;
     Mine: out std_logic
     );
end component;

signal sensor, clk, metal: std_logic; 

begin

  clk     <=         '1' after  0 ns,
                         '0' after 10 ns when clk /= '0' else '1' after 10 ns;
    sensor  <=       '1' after  0 ns,
                         '0' after 73529 ns when sensor /= '0' else '1' after 73529 ns;


lbl1: MineDetector port map (sensor, clk, metal);
end architecture test;
IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
实体探雷器是
端口(时钟:在标准逻辑中;
地雷传感器:标准_逻辑;
我的:出标准逻辑
);
末端探雷器;
地雷探测器的结构特性是
共享变量vClk:integer:=0;
共享变量vBeat:integer:=0;
开始
过程(传感器)
开始
如果(MineSensor'事件和MineSensor='1'),则
vBeat:=vBeat+1;
如果结束;
如果(vBeat>970),则
如果(vClk<7142857),则
我的=7142857)那么

我的你的vBeat计数器从@1开始,而不是从@0开始,因为你的测试台在0ns的时间产生了一个1开信号“传感器”。因此,您的“边缘计数器值”7142857太高(这适用于只有970拍的971拍)


但是,使用信号而不是共享变量(您也可以定义整数信号!)。信号在模拟中是可见的,这有助于您自己验证您的东西;-)

我担心堆栈溢出不是要求其他人验证代码是否正确的地方;您应该使用调试等来确定;)但是,如果您有特定的技术问题,请随意适当地编辑您的问题!使用信号,而不是共享变量,用于进程之间的通信,至少在可合成代码中。布莱恩:如果我使用信号,它们不会计算时钟和传感器周期,是吗?信号只有值0和1,对吗?奥利:我的最后一个问题是技术性的:)事实上我很确定它应该能工作。当我问为什么我的值不是1时,这是一个技术问题吗?整数信号的值是-232到232-1。布尔信号的值为True和False。记录信号有值。。。由你决定。等等事实上,某些东西是一个信号而不是一个变量并不会改变它可以接受的值,只会改变它更新的方式和时间以及它在进程之间的共享方式。