RS-232 interfaţare cu FPGA

D

dadda007

Guest
Am scris un cod de a lua în datele de la un serial RS-232 link-ul şi îl poate păstra într-un registru.Intenţionez să genera 2 semnale, un semnal ack1 care merge de mare, după un pic valabil început a fost obţinut şi un alt semnal de ack2 după ce toate cele 8 biti de date au fost primite in mod corect.Pentru a verifica validitatea i s-au folosit un ceas cu supraeşantionare care probelor Fiecare durata de biţi la 16 ori mai mare decât ceasul Baud Rate si foloseste logica maxime pentru evaluarea la fel.Cu toate acestea, după ce am de simulare a fost obtinerea nici o valoare în registru şi valoarea, de asemenea, deteriorat pentru ack1 şi ack2 .... te rog ajuta !!!!!

Cod:IEEE biblioteca;

utilizarea IEEE.STD_LOGIC_1164.all;rs232_lport entitate esteport (de date: in BIT;

clk_rs232: inout std_logic;

baudrate: in std_logic;

- Lport_clk: out BIT: = '0 ';

ack1: out BIT;

ack2: out BIT;

- Verifica: out BIT;

- Lport_data: out BIT_VECTOR (3 downto 0);

input_reg: BIT_VECTOR tampon (7 downto 0): = "00000000");entitate scop;rs232_lport_behav arhitectura rs232_lport este deShared variabilă Med, med1: BIT_VECTOR (4 downto 0);

Shared I variabilă, lcount_16, dcount, nos_0, nos_1: integer;

Shared variabilă mari, big1, dbit: bit;

Shared first_4 variabil, last_4: BIT_VECTOR (3 downto 0);Tipul de state_rs232 este (S0, S1, S2);

state_lport tip este (inactiv, F4, L4);

l_state semnalului: state_lport;

rs_state semnal: state_rs232; - starea iniţială este S0.începeproces (date)începers_state caz esteatunci când s0 => - starea Idle de maşini de statîn cazul în care (date = '1 '), apoi - În cazul în care datele sunt o apoi setaţi tuturor parametrilor de la zero.ack1 <= '0 ';

rs_state <= S0; - Înapoi la mers în gol de stat .....altrs_state <= S1; - Dacă linia de date este zero, atunci du-te la starea S1.sfârşitul anului în cazul în care;atunci când S1 => - verifică validitatea biţi de start.- Să verifice <= '1 ';pentru lcount_16 la 1 la 16 bucla - controale valoarea biţi începe primul.ack2 <= '0 ';

ack1 <= '0 ';în cazul în care (clk_rs232'event) şi (clk_rs232 = '1 ') şi (clk_rs232'last_value = '0'), apoiîn cazul în care (lcount_16 = 7), atunci

med (0): = de date;

sfârşitul anului în cazul în care;în cazul în care (lcount_16 = 8), atunci

med (1): = de date;

sfârşitul anului în cazul în care;în cazul în care (lcount_16 = 9), apoi

med (2): = de date;

sfârşitul anului în cazul în care;în cazul în care (lcount_16 = 10), apoi

med (3): = de date;

sfârşitul anului în cazul în care;în cazul în care (lcount_16 = 11), apoi

med (4): = de date;

sfârşitul anului în cazul în care;sfârşitul anului în cazul în care;bucla scop;for i in 0 la 4 bucla - controale valoarea de biţi a începe să utilizaţi logica maxima.în cazul în care (med (i) = '0 '), apoi

nos_0: nos_0 = 1;

sfârşitul anului în cazul în care;bucla scop;for i in 0 la 4 buclaîn cazul în care (med (i) = '1 '), apoi

nos_1: nos_1 = 1;

sfârşitul anului în cazul în care;bucla scop;în cazul în care (nos_1> nos_0), apoi

mare: = '1 ';

alt

mare: = '0 ';

sfârşitul anului în cazul în care;în cazul în care (Big = '0 '), apoi - În cazul în care valoarea de biţi de start este zero, apoi setaţi valoarea de biţi ack1 la una .....

ack1 <= '1 ';

rs_state <= S2; - Du-te la starea S2altack1 <= '0 ';

rs_state <= S0; - În cazul în care începe de biţi este de 1 Du-te la starea inactiv.sfârşitul anului în cazul în care;atunci când S2 => - Această stare ia în valoarea în registru şi păstrează deplasarea acesteia.- În cazul în care (ack1 = '1 '), apoipentru dcount la 0 la 7 buclaîn cazul în care (baudrate'event şi baudrate = '1 '), apoidbit: = de date;

input_reg <= '0 '& input_reg (7 downto 1);

input_reg (7) <= dbit;sfârşitul anului în cazul în care;bucla scop;ack2 <= '1 '; - După toate 8 biţi s-au deplasat stabilit valoarea ack2 biţi de mare.rs_state <= S0; - Du-te la starea s0, adică statul inactiv .....cazul scop;Procesul de sfârşitul anului;rs232_lport_behav scop;
 
Vă sugerez să folosiţi un proiect existent receptor UART ca şablon.În ceea ce priveşte codul de faţă, eu sunt în imposibilitatea de a forsee It's comportament.Folosind un ceas expresie sensibilă în interiorul o buclă de repetare este dincolo de orizontul meu, şi complet unsynthesizable cred.Un simulator poate accepta din fericire, fără erori, dar care nu dă în mod necesar un sens la codul.

Este instructiv, în general, pentru a scrie astfel de modele de la zero.Dar tu ar trebui să urmeze regulile de proiectare obişnuite pentru desene sau modele sincronice cu maşini de stat.Compilarea de design cu un instrument FPGA precoce poate ajuta la identificarea unsynthesizable construieşte.

 
Multumesc pentru raspuns, am încercat în următorul cod, dar cu rezultatul puţin ....

Cod:IEEE biblioteca;

utilizarea IEEE.STD_LOGIC_1164.all; - Header declaraţia de fişierers232_lport entitate esteport (

de date: in BIT; - RS-232 de date de intrare în serie

clk_rs232: in std_logic; - Latching ceas

baudrate: in std_logic; - rata de biţi

ack: out std_logic: = '0 '; - Acknoledge merge de mare atunci când 8 biţi de date sosi

input_reg: BIT_VECTOR InOut (7 downto 0): = "00000000"); - magazine de intrare registru de date de serieentitate scop;rs232_lport_behav arhitectura rs232_lport este deTipul de state_rs232 este (S0, S1, S2); - 3 stări de FSM receiever

state_lport tip este (inactiv, F4, L4);

l_state semnalului: state_lport;

rs_state semnal: state_rs232; - starea iniţială este S0.Shared I variabilă, lcount_16, dcount, nos_0, nos_1: integer: = 0;

Shared variabilă Med, med1: bit; - Magazine centrul de probă.

RST semnal: std_logic: = '1 ';

- împărtăşit ack_v variabile: std_logic;începerxclk: proces (clk_rs232, RST) - Acest proces utilizează o RS-232 ceas şi un semnal de RST pentru a genera un ceas receptor.începeîn cazul în care (RST = '0 '), apoiîn cazul în care (clk_rs232'event şi clk_rs232 = '1 '), apoi - generează un contor care menţine pe de numărare pe durata de timp de LATCHING ceas.în cazul în care (lcount_16 = 15), apoilcount_16: = 0;altlcount_16: lcount_16 = 1;sfârşitul anului în cazul în care;sfârşitul anului în cazul în care;altlcount_16: = 0;sfârşitul anului în cazul în care;Procesul de sfârşitul anului;rx_fsm: proces (clk_rs232, RST) - FSM pentru modul receptor.începers_state caz esteatunci când s0 => - de stat Idleîn cazul în care (date = '1 '), apoiRST <= '1 ';

dcount: = 0;

input_reg <= "00000000";

rs_state <= S0;altrs_state <= S1;sfârşitul anului în cazul în care;atunci când S1 => - Aceasta stare verifică validitatea biţi de start.RST <= '0 ';în cazul în care (lcount_16 = 8), atunci

med: = de date;

sfârşitul anului în cazul în care;în cazul în care (med = '0 '), apoi - Daca bitul de start este valabil.

RST <= '1 ';

rs_state <= S2;

Altele - Dacă nu du-te la mers în gol de stat.

rs_state <= S0;

sfârşitul anului în cazul în care;atunci când S2 => - Aceasta stare menţine pe trecerea biti de date într-un registru de intrare.RST <= '0 ';în cazul în care (dcount <8), apoi - Repeta de 8 ori, adică până la toate biti de date au fost primite.în cazul în care (lcount_16 = 8), apoi - Se ia proba de mijloc

med1: = de date;

sfârşitul anului în cazul în care;în cazul în care (lcount_16 = 15), apoi - La sfârşitul fiecărei durată bit schimbare a valorii datelor în registru.

input_reg <= '0 '& input_reg (7 downto 1);

input_reg (7) <= med1;

dcount: = dcount 1; - Increment conta.

rs_state <= S2; - Du-te inapoi la starea S2, adică Du-te inapoi la stat care ţine pe trecerea de valoarea datelor în registru.

sfârşitul anului în cazul în care;sfârşitul anului în cazul în care;în cazul în care (dcount = 8), apoi - După toate cele 8 biti de date s-au mutat mă întorc la mers în gol de stat.ACK <= '1 '; - Seturi ack semnal de înaltă după ce toate cele 8 biti de date au fost primite.

RST <= '1 ';

rs_state <= S0;sfârşitul anului în cazul în care;cazul scop;Procesul de sfârşitul anului;rs232_lport_behav scop;
 

Welcome to EDABoard.com

Sponsor

Back
Top