2个过程中的变量对我来说不合适

时间:2013-06-01 20:54:47

标签: vhdl

我有一个非常讨厌的问题。因此我正在研究我即将成为线下跟踪探测机器人的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;

我是怎么想出这些值的?: 没有金属,频率<6900。我拿6800进行模拟。我想测量的频率超过1秒,所以我把它除以7。 6800/7 =约971.&lt; == vBeat&gt; 970 我的时钟是50 MHz。我也把它除以7。 50M / 7 =约7142857.因此vClk> OR&lt; = 7142857.我的VHDL代码基本上计算了时钟和MineSensor的上升沿。那你觉得怎么样?代码应该运作;我刚刚搞砸了价值观吗?或者有什么不对吗?请让我吧?出于某种原因,我总是将值设为“0”,而我希望它为“1”。

还有一件事;我收到以下警告:“共享变量必须是受保护的类型。”这会影响代码的结果吗?我该如何解决这个问题?

谢谢大家阅读这个大问题。我希望有人可以帮助我:D

1 个答案:

答案 0 :(得分:1)

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

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