VHDL-kode spørgsmål

J

jshroff

Guest
Hi All,

Jeg forsøger at lære VHDL bruger en digilent bord og eksempel og har en meget grundlæggende spørgsmål.

Koden er ...Code:-------------------------------------------------- --------------------------------

- Firma: Digilent Inc.

- Ingeniør: Claudia Goga

--

- Opret Dato: 22:33:35 11/25/06

- Modul Navn: PS2_Reader - Behavioral

- Målenheder: CoolRunner2 CPLD

- Tool versioner: Xilinx ISE v7.1i

- Beskrivelse:

- Dette modul hedder scanne koder fra PS2 Port.
Hver gang en

- Nye scanne koden er helt modtaget det mulighed for at fRd signal til en

- Vigtigste ur periode.

--

- Revision 0.01 - File Created

- Yderligere kommentarer:

--

-------------------------------------------------- --------------------------------library IEEE;

brug IEEE.STD_LOGIC_1164.ALL;

brug IEEE.STD_LOGIC_ARITH.ALL;

brug IEEE.STD_LOGIC_UNSIGNED.ALL;enhed PS2_Reader er

Port (mclk: i std_logic; - systemuret

PS2C: i std_logic; - PS2 Ur

PS2D: i std_logic; - PS2 data

RST: i std_logic; - Nulstil BTN0

Ps2Dout: out std_logic_vector (7 downto 0); - ud data

fRd: out std_logic); - data gyldig flag

udgangen PS2_Reader;architecture Behavioral af PS2_Reader er-------------------------------------------------- ----------------------

- SIGNAL og konstant ERKLÆRINGER

-------------------------------------------------- ----------------------

- Konstanterne nedenfor definere state koderne for PS2 Keyboard

- læseren ved at bruge en HOT kodning.konstant tomgang: std_logic_vector (5 downto 0): = "000000";

konstant shift_data: std_logic_vector (5 downto 0): = "000001";

konstant check_parity: std_logic_vector (5 downto 0): = "000010";

konstant check_stopbit: std_logic_vector (5 downto 0): = "000100";

konstant frame_error: std_logic_vector (5 downto 0): = "001000";

konstant parity_error: std_logic_vector (5 downto 0): = "010000";

konstant end_char: std_logic_vector (5 downto 0): = "100000";- statens register og næste statslige register for FSM

signal state, next_state: std_logic_vector (5 downto 0): = tomgang;signal D_PS2C: std_logic: ='0 '; - debounced PS2C

signal Q1, Q2: std_logic: ='0 ';- skift register gemmer de modtagne bits

signal REG: std_logic_vector (7 downto 0): = X "00";signal ptysum: std_logic: ='0 '; - paritet summen

signal ptycheck: std_logic: ='0 '; - paritet kontrollere bitsignal cnt: heltal fra 0 til 7: = 0; - counter- Attributterne nedenfor forhindre ISE compiler fra

- optimering af staten maskiner.
De vil blive gennemført som

- beskrevet i konstant erklæringer ovenfor.Attributten fsm_extract: string;

Attributten fsm_extract stats: signal er "nej";

Attributten fsm_extract af next_state: signal er "nej";Attributten fsm_encoding: string;

Attributten fsm_encoding stats: signalet er "bruger";

Attributten fsm_encoding af next_state: signalet er "bruger";Attributten signal_encoding: string;

Attributten signal_encoding stats: signalet er "bruger";

Attributten signal_encoding af next_state: signalet er "bruger";begynd-------------------------------------------------- --------------------

- MODUL GENNEMFØRELSE

-------------------------------------------------- ------------------------------------- Sample Keyboard Indgange -----------------------------debounce: processen (mclk, PS2C, Q1, Q2)

begynd

hvis mclk'event og mclk ='1 'og derefter

Q1 <= PS2C;

Q2 <= Q1;

udgangen, hvis;

ende proces debounce;D_PS2C <= (IKKE Q1) og Q2;----------------- Synkroniseringsprocessen ----------------------------regstate: processen (mclk, next_state, RST)

begynd

hvis RST ='1 'og derefter

state <= tomgang - State Machine nulstille

elsif mclk'EVENT og mclk ='1 'og derefter

state <= next_state;

udgangen, hvis;

ende proces regstate;-------------------- Stat Overgange ---------------------------- ---overgang: proces (stat, D_PS2C, PS2D, cnt, ptycheck)

begynd

tilfælde staten

når inaktiv => - tomgang

hvis D_PS2C ='1 'og PS2D ='0' og derefter - kontrollere start bit

next_state <= shift_data;

anden

next_state <= tomgang;

udgangen, hvis;når shift_data => - skift i data

hvis D_PS2C ='1 'og cnt = 7 derefter

next_state <= check_parity - gå og kontrollere paritet

anden

next_state <= shift_data;

udgangen, hvis;når check_parity => - kontrollere paritet

hvis D_PS2C ='1 'og PS2D = ptycheck derefter

next_state <= check_stopbit - gyldig paritet bit

- Gå ud og kontrollere stopbit

elsif D_PS2C ='1 'og derefter

next_state <= parity_error - paritet fejl

anden

next_state <= check_parity;

udgangen, hvis;når check_stopbit => - kontrollere stopbit;

hvis D_PS2C ='1 'og PS2D ='1' og derefter

next_state <= end_char - gyldig stopbit, slutningen Alfanum

elsif D_PS2C ='1 'og derefter

next_state <= frame_error - Frame Fejl

anden

next_state <= check_stopbit;

udgangen, hvis;når frame_error => - Frame Fejl

next_state <= tomgang;når parity_error => - Parity Error

next_state <= tomgang;når end_char => - slutningen Alfanum

next_state <= tomgang;når andre => next_state <= tomgang;

ende sag;

ende proces overgang;------ Optælling bits og registrering når state = shift_data ---------------Regin: processen (mclk, D_PS2C, PS2D, cnt, ptysum, stat)

begynd

hvis staten / = shift_data derefter

cnt <= 0;

ptysum <='0 ';

elsif mclk'EVENT og mclk ='1 'og derefter

hvis D_PS2C ='1 'og derefter

ptysum <= ptysum XOR PS2D - beregning paritet summen

REG (7 downto 0) <= PS2D & REG (7 downto 1) - at flytte data i registerhvis cnt = 7 derefter

cnt <= 0;

anden

cnt <= cnt 1;

udgangen, hvis;

udgangen, hvis;

udgangen, hvis;

ende proces Regin;------------------ PARITIY SUM ------------------------------ -------------parity_sum: processen (mclk, D_PS2C, PS2D, cnt, statslige ptysum)

begynd

hvis mclk'EVENT og mclk ='1 'og derefter

hvis state = shift_data og D_PS2C ='1 'og cnt = 7 derefter

ptycheck <= (IKKE ptysum) XOR PS2D - paritet kontrollere bit

udgangen, hvis;

udgangen, hvis;

ende proces parity_sum;---------------- OUTPUT ASSIGNEMENT -------------------------------- ------Ps2Dout <= REG;

fRd <='1 ', når state = end_char ellers'0';udgangen Behavioral;

 
Hej,

dette er en synkron kant afsløring (falling_edge i dette tilfælde).Du skal henvisning signal opgaver i et ur synkrone fortløbende proces som instantiation af flipflops, resultatet får virkning i den næste taktcyklus.Således Q1 udgør nutidsværdien af PS2C, Q2 den tidligere værdi.

Udtrykket (IKKE Q1) og Q2 er rigtigt for en taktcyklus på PS2C henhoerende kant, når Q1 er allerede'0 'og Q2 stadig'1'.Denne måde, du oprette en begivenhed fra PS2C falling_edge, men synkroniseret med mclk, som er brugbare til at behandle PS2 data i mclk domæne.

Hilsen,
Frank

 
For nogen bare i VHDL dont du tror, at dette er en smule over dit hoved?Im ikke sige du cant gøre det, men din frustration plan vil være langt mindre, hvis du forsøger kode / funktioner, der er lidt mere inline med indlæringsvanskeligheder de ins og outs af VHDL.

Hvis du leder efter en stor tutorial metode prøve Cypress Warp kit.Leveres med en VHDL bog og software.

E

 
henviser til synchronizers teori, hvis du virkelig er interesseret ..
det er givet godt i
digital design af John wakerly.
ellers bare google hvordan man kan styre async signal i synkron domæne
henvise til følgende ppt
Beklager, men du skal login for at se denne tilslutningskrav

 

Welcome to EDABoard.com

Sponsor

Back
Top