у меня проблема; Мне нужно рассчитать/измерить обороты домашнего тренажера с помощью датчика Холла и магнита на колесе, аппаратное обеспечение должно быть описано на VHDL, мой текущий метод таков:
Если датчик Холла обнаруживает импульс, сброс счетчика
Увеличение счетчика каждый такт
При следующем импульсе сохраните предыдущее значение, сбросьте и повторите.
Код:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity teller is
port(
hallsens : in std_logic;
counter : out std_logic_vector(15 downto 0);
areset : in std_logic;
clk : in std_logic
);
end entity teller;
architecture rtl of teller is
signal counttemp : std_logic_vector(15 downto 0);
signal timerval2 : std_logic_vector(15 downto 0);
signal lastcount : std_logic_vector(15 downto 0);
begin
process(clk, areset)
begin
if areset = '1' then
counter <= "0000000000000000";
counttemp <= "0000000000000000";
timerval2 <= "0000001111101000";
elsif hallsens = '1' then
counter <= lastcount + "1";
timerval2 <= "0000001111101000";
counttemp <= "0000000000000000";
elsif rising_edge(clk) then
timerval2 <= timerval2 - "1";
if timerval2 = "0000000000000000" then
lastcount <= counttemp;
counttemp <= counttemp + "1";
timerval2 <= "0000001111101000";
end if;
end if;
end process;
end rtl;
Но чтобы рассчитать RPM из этого, мне нужно разделить счетчик на тактовую частоту и умножить на 60. Это требует много аппаратного обеспечения на FPGA (Altera Cyclone 2).
Есть ли более эффективный способ сделать это?
ТИА
std_logic_arith
иnumeric_std
.std_logic_arith
— это нестандартный пакет VHDL, поэтому его следует удалить (std_logic_unsngied
тоже нестандартен, но ни с чем не конфликтует) - person Tricky   schedule 20.09.2020if timerval2 = X"0000"
проверяет значениеtimerval2
, которое присутствовало до фактического назначения сигналаtimerval2 <= timerval2 - 1;
? - person aschipfl   schedule 20.09.2020