Vhdl 两个过程中的变量不适合我
我有一个很烦人的问题。所以我正在为我即将成为的线跟踪探雷机器人编写VHDL代码。这个问题是关于地雷探测器的代码。基本原理:探雷传感器的频率约为7 kHz。如果传感器位于“地雷”上方,则频率会下降一点,最高为6.9 kHz。我想用VHDL实现这个。我认为到目前为止我所得到的应该是有效的,而且我在代码中输入了错误的值。然而,我对此并不确定。所以,首先,我希望有人能证实这是可行的,我只是对这些价值观很愚蠢。如果是这样,我希望那个人能在价值观方面帮助我;) 代码如下:Vhdl 两个过程中的变量不适合我,vhdl,Vhdl,我有一个很烦人的问题。所以我正在为我即将成为的线跟踪探雷机器人编写VHDL代码。这个问题是关于地雷探测器的代码。基本原理:探雷传感器的频率约为7 kHz。如果传感器位于“地雷”上方,则频率会下降一点,最高为6.9 kHz。我想用VHDL实现这个。我认为到目前为止我所得到的应该是有效的,而且我在代码中输入了错误的值。然而,我对此并不确定。所以,首先,我希望有人能证实这是可行的,我只是对这些价值观很愚蠢。如果是这样,我希望那个人能在价值观方面帮助我;) 代码如下: library IEEE; use
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。记录信号有值。。。由你决定。等等事实上,某些东西是一个信号而不是一个变量并不会改变它可以接受的值,只会改变它更新的方式和时间以及它在进程之间的共享方式。