我有一个非常讨厌的问题。因此我正在研究我即将成为线下跟踪探测机器人的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
答案 0 :(得分:1)
你的vBeat计数器从@ 1开始而不是@ 0,因为你的测试平台在0 ns时产生一个1开信号“传感器”。因此,你的“边缘计数器值”7142857太高了(这是971节拍,你只有970)。
但是,使用信号而不是共享变量(您也可以定义整数信号!)。在模拟中可以看到信号,这有助于您自己验证您的东西; - )