VHDL-Forum - Allgemeines

Frequenzmessung mit VHDL

Frequenzmessung mit VHDL

Hallo Leute,

da ich in VHDL noch kein wirklicher Profi bin, bräuchte ich mal eure Hilfe.
Ich arbeite mit Spartan 3 von Xilinx (50 MHz Quarz). Ich möchte einen
Frequenzeingang an meinem FPGA reservieren, der ein offsetbehaftetes
Rechtecksignal mit einer Periodendauer von 50% misst. Genauer, dessen
Frequenz misst. Der Frequenzbereich des Rechtecksignal liegt zw.
28,9kHz und ca. 45kHz. Das Ergebnis würde ich gerne als
std_logic_vector weiterverarbeiten und am Ausgang als
frequenzsynchrones Pulssignal wieder ausgeben. Dabei soll die
Pulsbreite über eine Konstante im Quellcode eingestellt werden können.


Habe leider noch wenig Erfahrung mit VHDL und freue mich deshalb über
jede Hilfe die ich kriegen kann.

Vielleicht könnt Ihr mir ja weiterhelfen oder habt ein ähnliches
Problem schon mal gehabt.

Vielen Dank im Voraus

Gruß
Daniel

Re: Frequenzmessung mit VHDL

Also, die Frequenz an einem Eingang würd grob gesagt ich so messen:

Re: Frequenzmessung mit VHDL

Hallo Leute

Ich habe das mit der Frequenzmessung mal umgesetzt... allerdings funktioniert es irgendwie nicht so ganz und weiss nicht, ob meine Umsetzung fehlerhaft ist oder ob mein Xilinx-Board den Geist aufgegeben hat...


Der Code kommt aus dem folgenden Kontext heraus. Eine Hardware (Stimmgerät mit Mikrophon) liefert ein Rechtecksignal mit der Frequenz der am Mikrofon eingespielten Tonhöhe. Diese Frequenz soll ermittelt werden und die Differenz von der Grundwelle (a, 440hz) aufm Display ausgegeben werden.


et voilà... vielleicht sieht jemand was aufn ersten Blick, wäre cool!

************************


library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;

entity FreqFind is
generic (
CLK_rate :integer := 50_000_000
);
Port(
rst: in std_logic;
clk: in std_logic;
FreqIn: in std_logic;
FreqOut: out std_logic_VECTOR(15 downto 0);
CountOut: out std_logic_VECTOR(15 downto 0)
);

end FreqFind;

architecture A1 of FreqFind is

begin

process(rst,clk)

variable abtastzaehler :integer :=0;
variable temp :integer;
variable FreqInV :std_logic;
variable FreqInV_1 :std_logic;
variable Tcount :integer;

begin
if rst = '1' then -- im Resetfall
abtastzaehler :=0;
Tcount := 11;

elsif rising_edge(clk) then -- im Normalfall

FreqInV := FreqIn; -- Zuweisung des Eingangssignals

abtastzaehler := abtastzaehler+1; -- Abtastcounter






if FreqInV_1 ='0' and FreqInV='1' then
Tcount := Tcount-1;
FreqInV_1 := FreqInV;
end if;

if (Tcount = 0) then

CountOut <=conv_std_logic_vector(abtastzaehler,16);
FreqOut <= conv_std_logic_vector(11*50_000_000,16); -

Tcount := 11;
abtastzaehler :=0;

end if;
end if;
end process;
end A1;