Waveform+Generator

=Waveform Generator=



Step 1: Create the basic Waveform Generator
Fwaveform = Faddress / Nsamples = Fsystem / (Nsamples * Prescaler * WF.FREQ) Example: Fwaveform = 12 MHz / (180 * 4 * 16 samples) = 1041 Hz The ROM initialization file provided contains a sinusoid with 180 samples (Nsamples = 180). A good choice for the pre-scaler is 4.

Dette betyder at vi skal lave to processer, en adresse tæller og en clock neddeler, hvor den sidste giver en CountEnable som inkrementerer vores adressetæller.

Den første process skal generere vores CountEnable signal.

Frekvensen af vore CountEnable signal skal være den ønskede output frekvens gange antallet af ROM samples som vi skal løbe igennem:
 * Fcount_enb = fwaveform * 180 samples

På den øverste ligning ses det at vi skal dele med følgende: Dvs. vi skal lave en counter som kører på vores 12MHz clock og som skal tælle til WF.FREQ * Prescaler.
 * Fcount_enb = 12MHz / (Prescaler * WF.FREQ);

Vores Prescaler er fixed 4. Skal vi gange med 4 gøres dette nemt ved at skifte til venstre, dvs brug shift_left(vector, antal skift)

Pseudo kode: code elsif AudioClk12MHz'event and AudioClk12MHz = '1' then if AudioClkCnt = shift_left(WF_FREQ, nbr_shifts) then AudioClkCnt <= 0; else AudioClkCnt <= AudioClkCnt + 1; end if;

code

Når adressetælleren fungerer skal den forbindes til ROM'en

Generer en ROM som vist her : Create ROM HowTo

Forbind adressetælleren til ROM'ens adresse og 12MHz clock'en til ROM'ens clock input. Lav et signal og forbind det til ROM'ens output. Dette skal indtil videre kun bruges til simulering.

Simuler igen og verificer at outputtet bliver skiftet som forventet:



Step 4:
Compile it in Quartus Afhængig af jeres Quartus opsætning, kan det være at AudioData outputtet bliver reduceret væk da det ikke bliver brugt til noget. Der vil i jeres kompilerings "warnings" stå at den har reduceret dele af designet væk, da det ikke bruges nogen steder. Min reducerede også ROM'en væk! Det kan derfor være nødvendigt af lave en port i amve.vhd entity'en som vi sender AudioData up på. code entity amve is ... port (   Clk                    : in  std_logic;    BrdAddress             : in  std_logic_vector(7 downto 0);    BrdWrData              : in  std_logic_vector(7 downto 0);    ...    AudioData              : out std_logic_vector(23 downto 0)); -- DEBUG end amve;

code Det giver ikke mening at programmere kredsen med AudioData porten på, da vi ikke har noget at forbinde den til. Det er udelukkende til at debugge med. I næste øvelse, kommer vi til at forbinde outputtet sammen med det codec interface som vi skal lave der. Vi forsøger derved at få den genererede tone ud på DE2 boardets line-out stik og ud i et par hørebøffer.

Beregning af Prescaler