J
jshroff
Guest
Hi All,
Estic intentant aprendre VHDL utilitzant un digilent bord i l'exemple i tenir una qüestió molt bàsica.
El codi és ...Codi:-------------------------------------------------- --------------------------------
- Empresa: Digilent Inc
- Enginyer: Claudia Goga
--
- Crear Data: 22:33:35 11/25/06
- Mòdul Nom: PS2_Reader - Comportament
- Els dispositius de destinació: CoolRunner2 CPLD
- Eina de versions: Xilinx ISE v7.1i
- Descripció:
- Aquest mòdul llegeix els codis d'exploració des del port PS2.
Cada vegada que un
- Nou codi d'exploració és completament rebut permet la FRD senyal per a un
- Període de rellotge principal.
--
- Revisió 0,01 - Arxiu Creat
- Comentaris addicionals:
--
-------------------------------------------------- --------------------------------IEEE biblioteca;
IEEE.STD_LOGIC_1164.ALL ús;
IEEE.STD_LOGIC_ARITH.ALL ús;
IEEE.STD_LOGIC_UNSIGNED.ALL ús;entitat és PS2_Reader
Port (mclk: a std_logic; - Rellotge del sistema
PS2C: a std_logic; - PS2 Rellotge
PS2D: a std_logic; - PS2 dades
primer: en std_logic; - Restablir BTN0
Ps2Dout: a std_logic_vector (7 downto 0); - les dades
FRD: a std_logic); - dades vàlides bandera
PS2_Reader final;Comportament de l'arquitectura és PS2_Reader-------------------------------------------------- ----------------------
- SIGNAL i CONSTANTS DECLARACIONS
-------------------------------------------------- ----------------------
- Les constants per sota dels codis per definir l'estat de teclat PS2
- Lector utilitzant una codificació CALENT.constant inactivitat: std_logic_vector (5 downto 0): = "000000";
constant shift_data: std_logic_vector (5 downto 0): = "000001";
constant check_parity: std_logic_vector (5 downto 0): = "000010";
constant check_stopbit: std_logic_vector (5 downto 0): = "000100";
constant frame_error: std_logic_vector (5 downto 0): = "001000";
constant parity_error: std_logic_vector (5 downto 0): = "010000";
constant end_char: std_logic_vector (5 downto 0): = "100000";- Registre d'estat i el proper registre d'estat per als Estats Federats de Micronèsia
senyal d'estat, next_state: std_logic_vector (5 downto 0): = inactiu;senyal D_PS2C: std_logic: ='0 '; - debounced PS2C
senyal de Q1, Q2: std_logic: ='0 ';- Canvi de registre; emmagatzema els bits rebuts
REG senyal: std_logic_vector (7 downto 0): = X "00";senyal ptysum: std_logic: ='0 '; - suma paritat
senyal ptycheck: std_logic: ='0 '; - comprovar la paritat de bitssenyal cnt: integer rang de 0 a 7: = 0; - comptador- Els atributs impedir la continuació de compilador ISE
- Optimització de la maquinària estatal.
Els estats es durà a terme com
- Descrits en les constants declaracions anteriorment.atribut fsm_extract: string;
fsm_extract atribut d'Estat: el senyal és "no";
fsm_extract atribut de next_state: el senyal és "no";atribut fsm_encoding: string;
fsm_encoding atribut d'Estat: el senyal és "usuari";
fsm_encoding atribut de next_state: el senyal és "usuari";atribut signal_encoding: string;
signal_encoding atribut d'Estat: el senyal és "usuari";
signal_encoding atribut de next_state: el senyal és "usuari";començar-------------------------------------------------- --------------------
- MÒDUL D'APLICACIÓ
-------------------------------------------------- --------------------Mostra les entrades de teclat ----------------- -----------------------------el rebot: procés (mclk, PS2C, Q1, Q2)
començar
si mclk'event i mclk ='1 'i després
P1 <= PS2C;
Q2 <= Q1;
END IF;
procés de cap de rebot;D_PS2C <= (NO Q1) i Q2;Sincronització de processos ----------------- ----------------------------regstate: procés (mclk, next_state, RST)
començar
si primer ='1 'i després
estat <= inactiu; - Resetear la màquina d'estats
elsif mclk'EVENT i mclk ='1 'i després
estat <= next_state;
END IF;
procés de cap de regstate;-------------------- Estat Transicions ---------------------------- ---transició: procés (estat, D_PS2C, PS2D, cnt, ptycheck)
començar
cas d'estat és
quan estigui inactiu => - ociós
si D_PS2C ='1 'i PS2D = "0" llavors - comprovar bit d'arrencada
next_state <= shift_data;
una mica més
next_state <= inactiu;
END IF;quan shift_data => - canvi en les dades
si D_PS2C ='1 'i després cnt = 7
next_state <= check_parity; - anar i comprovar la paritat
una mica més
next_state <= shift_data;
END IF;quan check_parity => - comprovar la paritat
si D_PS2C ='1 'i després PS2D = ptycheck
next_state <= check_stopbit; - bit de paritat vàlid
- Anar i comprovar stopbit
elsif D_PS2C ='1 'i després
next_state <= parity_error; - error de paritat
una mica més
next_state <= check_parity;
END IF;quan check_stopbit => - comprovar stopbit;
si D_PS2C ='1 'i PS2D ='1' i després
next_state <= end_char; - stopbit vàlid, final Caràcter
elsif D_PS2C ='1 'i després
next_state <= frame_error; - Carcassa d'error
una mica més
next_state <= check_stopbit;
END IF;quan frame_error => - Carcassa d'error
next_state <= inactiu;quan parity_error => - Error de paritat
next_state <= inactiu;quan end_char => - Caràcter final
next_state <= inactiu;quan els altres => next_state <= inactiu;
cas extrem;
procés de cap de transició;------ Comptar bits i el registre d'estat quan shift_data = ---------------Regina: procés (mclk, D_PS2C, PS2D, cnt, ptysum, estat)
començar
si estat / = shift_data llavors
cnt <= 0;
ptysum <='0 ';
elsif mclk'EVENT i mclk ='1 'i després
si D_PS2C ='1 'i després
ptysum <= ptysum XOR PS2D, - el càlcul de la suma de paritat
REG (7 downto 0) <= PS2D i REG (7 downto 1); - canvi de dades en el registresi cnt = 7 aleshores
cnt <= 0;
una mica més
cnt <= cnt 1;
END IF;
END IF;
END IF;
procés de cap de Regina;------------------------------ ------------------ PARITIY SUMA -------------parity_sum: procés (mclk, D_PS2C, PS2D, cnt, estatals ptysum)
començar
si mclk'EVENT i mclk ='1 'i després
si estat = shift_data i D_PS2C ='1 'i després cnt = 7
ptycheck <= (NO ptysum) XOR PS2D; - comprovar la paritat de bits
END IF;
END IF;
procés de cap de parity_sum;---------------- SORTIDA assignació -------------------------------- ------Ps2Dout <= REG;
FRD <='1 '= end_char quan altre estado'0';final del comportament;
Estic intentant aprendre VHDL utilitzant un digilent bord i l'exemple i tenir una qüestió molt bàsica.
El codi és ...Codi:-------------------------------------------------- --------------------------------
- Empresa: Digilent Inc
- Enginyer: Claudia Goga
--
- Crear Data: 22:33:35 11/25/06
- Mòdul Nom: PS2_Reader - Comportament
- Els dispositius de destinació: CoolRunner2 CPLD
- Eina de versions: Xilinx ISE v7.1i
- Descripció:
- Aquest mòdul llegeix els codis d'exploració des del port PS2.
Cada vegada que un
- Nou codi d'exploració és completament rebut permet la FRD senyal per a un
- Període de rellotge principal.
--
- Revisió 0,01 - Arxiu Creat
- Comentaris addicionals:
--
-------------------------------------------------- --------------------------------IEEE biblioteca;
IEEE.STD_LOGIC_1164.ALL ús;
IEEE.STD_LOGIC_ARITH.ALL ús;
IEEE.STD_LOGIC_UNSIGNED.ALL ús;entitat és PS2_Reader
Port (mclk: a std_logic; - Rellotge del sistema
PS2C: a std_logic; - PS2 Rellotge
PS2D: a std_logic; - PS2 dades
primer: en std_logic; - Restablir BTN0
Ps2Dout: a std_logic_vector (7 downto 0); - les dades
FRD: a std_logic); - dades vàlides bandera
PS2_Reader final;Comportament de l'arquitectura és PS2_Reader-------------------------------------------------- ----------------------
- SIGNAL i CONSTANTS DECLARACIONS
-------------------------------------------------- ----------------------
- Les constants per sota dels codis per definir l'estat de teclat PS2
- Lector utilitzant una codificació CALENT.constant inactivitat: std_logic_vector (5 downto 0): = "000000";
constant shift_data: std_logic_vector (5 downto 0): = "000001";
constant check_parity: std_logic_vector (5 downto 0): = "000010";
constant check_stopbit: std_logic_vector (5 downto 0): = "000100";
constant frame_error: std_logic_vector (5 downto 0): = "001000";
constant parity_error: std_logic_vector (5 downto 0): = "010000";
constant end_char: std_logic_vector (5 downto 0): = "100000";- Registre d'estat i el proper registre d'estat per als Estats Federats de Micronèsia
senyal d'estat, next_state: std_logic_vector (5 downto 0): = inactiu;senyal D_PS2C: std_logic: ='0 '; - debounced PS2C
senyal de Q1, Q2: std_logic: ='0 ';- Canvi de registre; emmagatzema els bits rebuts
REG senyal: std_logic_vector (7 downto 0): = X "00";senyal ptysum: std_logic: ='0 '; - suma paritat
senyal ptycheck: std_logic: ='0 '; - comprovar la paritat de bitssenyal cnt: integer rang de 0 a 7: = 0; - comptador- Els atributs impedir la continuació de compilador ISE
- Optimització de la maquinària estatal.
Els estats es durà a terme com
- Descrits en les constants declaracions anteriorment.atribut fsm_extract: string;
fsm_extract atribut d'Estat: el senyal és "no";
fsm_extract atribut de next_state: el senyal és "no";atribut fsm_encoding: string;
fsm_encoding atribut d'Estat: el senyal és "usuari";
fsm_encoding atribut de next_state: el senyal és "usuari";atribut signal_encoding: string;
signal_encoding atribut d'Estat: el senyal és "usuari";
signal_encoding atribut de next_state: el senyal és "usuari";començar-------------------------------------------------- --------------------
- MÒDUL D'APLICACIÓ
-------------------------------------------------- --------------------Mostra les entrades de teclat ----------------- -----------------------------el rebot: procés (mclk, PS2C, Q1, Q2)
començar
si mclk'event i mclk ='1 'i després
P1 <= PS2C;
Q2 <= Q1;
END IF;
procés de cap de rebot;D_PS2C <= (NO Q1) i Q2;Sincronització de processos ----------------- ----------------------------regstate: procés (mclk, next_state, RST)
començar
si primer ='1 'i després
estat <= inactiu; - Resetear la màquina d'estats
elsif mclk'EVENT i mclk ='1 'i després
estat <= next_state;
END IF;
procés de cap de regstate;-------------------- Estat Transicions ---------------------------- ---transició: procés (estat, D_PS2C, PS2D, cnt, ptycheck)
començar
cas d'estat és
quan estigui inactiu => - ociós
si D_PS2C ='1 'i PS2D = "0" llavors - comprovar bit d'arrencada
next_state <= shift_data;
una mica més
next_state <= inactiu;
END IF;quan shift_data => - canvi en les dades
si D_PS2C ='1 'i després cnt = 7
next_state <= check_parity; - anar i comprovar la paritat
una mica més
next_state <= shift_data;
END IF;quan check_parity => - comprovar la paritat
si D_PS2C ='1 'i després PS2D = ptycheck
next_state <= check_stopbit; - bit de paritat vàlid
- Anar i comprovar stopbit
elsif D_PS2C ='1 'i després
next_state <= parity_error; - error de paritat
una mica més
next_state <= check_parity;
END IF;quan check_stopbit => - comprovar stopbit;
si D_PS2C ='1 'i PS2D ='1' i després
next_state <= end_char; - stopbit vàlid, final Caràcter
elsif D_PS2C ='1 'i després
next_state <= frame_error; - Carcassa d'error
una mica més
next_state <= check_stopbit;
END IF;quan frame_error => - Carcassa d'error
next_state <= inactiu;quan parity_error => - Error de paritat
next_state <= inactiu;quan end_char => - Caràcter final
next_state <= inactiu;quan els altres => next_state <= inactiu;
cas extrem;
procés de cap de transició;------ Comptar bits i el registre d'estat quan shift_data = ---------------Regina: procés (mclk, D_PS2C, PS2D, cnt, ptysum, estat)
començar
si estat / = shift_data llavors
cnt <= 0;
ptysum <='0 ';
elsif mclk'EVENT i mclk ='1 'i després
si D_PS2C ='1 'i després
ptysum <= ptysum XOR PS2D, - el càlcul de la suma de paritat
REG (7 downto 0) <= PS2D i REG (7 downto 1); - canvi de dades en el registresi cnt = 7 aleshores
cnt <= 0;
una mica més
cnt <= cnt 1;
END IF;
END IF;
END IF;
procés de cap de Regina;------------------------------ ------------------ PARITIY SUMA -------------parity_sum: procés (mclk, D_PS2C, PS2D, cnt, estatals ptysum)
començar
si mclk'EVENT i mclk ='1 'i després
si estat = shift_data i D_PS2C ='1 'i després cnt = 7
ptycheck <= (NO ptysum) XOR PS2D; - comprovar la paritat de bits
END IF;
END IF;
procés de cap de parity_sum;---------------- SORTIDA assignació -------------------------------- ------Ps2Dout <= REG;
FRD <='1 '= end_char quan altre estado'0';final del comportament;