# FPGA, CPLD, 74xx loģikas >  RS422 -> HDB3

## lopiks

Ir vajadzība uztaisīt šādu konverteri uz MAX II EPM540T100C5... varbūt kāds var palīdzēt algoritma izstrādē un projektēšanā? Pats tikai mācos  ::

----------


## Vikings

Nu pamatā doma varētu būt, ka jātaisa divi programmas bloki - RS422 uztvērējs un HDB3 raidītājs. Kad pa RS422 ir pienākuši dati, tas tiek paziņots HDB3 raidītājam un tas attiecīgi šos pašus datus pārraida.

----------


## Epis

CIk ta liels datu pārraides ātrums tam RS422 būs ? 
ja ātrums nav liels (zem 1Mbita/s) un var būt neliela laika aizture (kāda 1 baita garumā ) ta nemaz CPLD nav vaidzīgs !, paņem kādu ātru MCU, kā Stm32 72Mhz un caur UART saņemtos datus dod uz IO kur ar C kodu maini IO pinu varības  ::  

domā taisīt to logiku tā ka tiko caur UART ir saņemts valīds Bits tā viņu uzreiz dot ārā tajā HDB3 interfeisā ar minimālu Delay ? šādā gadijumā vaidzēs modificēt kādu esošo uart IP kodu, gatavie IP nederēs.
gatavo IP risinājumi izskataš šādi:
cpld UARTam var atrst Opencores.org vai paņemt kādu citu UART IP, kautvai no Alteras Quartus SOPC buildera komponentēm paņem uart uzmet uz SOPC loga un ta tev vaig uztaisīt to HDB3 sūtītāja IP ar avalon Slave buss interfeisu, un tākā UARTs SOPC builderī arī būs Slave devais ta vaidzēs kādu Master ierīci, moš SOPC bulderī ir kāds papild Master elements(izņemot proci), kas var savienot, pats šitā pataisno nēsu mēginājis neko slēgt, parasti MAster ir Procis (Nios II) ja kas tagat tā vis mazākā versija procim itkā ir pa velti (free), takā ja ir tajā cpld vieta procim + UART IP+HDB3 IP ta atliek uztaisīt tā HDB3 IP uzgenerēt sistēmu ar proci + uzrakstīt procim Asmā, vai C pāris koda rindas lai saņemtos Uart baitus sūta uz HDB3 Ip perifēriju sūtīšanai  ::  īstanībai tas ir līdzīgs variants pirmajam ar MCU tikai MCU jau nebūs tādas HDB3 perifērijas ! tur tā ar C jāsimulē.

----------


## Vikings

Epi, Tu atkal nenormāli sarežģī vienkāršas lietas. Nevajag ne Avalon busu, ne iekšējo CPU. Viss ir vienkārši - ir uztvērējs ar 8 bitu izeju un vienu signālu, kas ziņo, ka ir saņemti jauni dati. Un uztvērējs, kas saņemtos baitus nekavējoties pārraida pa HDB3. Protams, to visu vienkāršāk būtu izdarīt ar kādu MCU, bet ja cilvēks vēlas CPLD - kādēļ gan ne. Par baita aizturi - ja HDB3 ir ātrāks par RS422 konkrētajā gadijumā tad baita aizture sanāks tā vai tā, jo būs jāsagaida RS422 pārrraidāmais baits lai vispār varētu sākt sūtīt to pa HDB3, jo savādāk vēl nebūs pienācis RS422 otrais bits, bet pa HDB3 jau kaut kas būs jāsūta.

----------


## lopiks

man ir tāds uzdevums uz CPLD šito realizēt, īsti nesaprotu ko un kā darīt... so, tāpēc vēršos pie speciem, kas varētu ne tikai ieteikt izlasīt kko vikipēdijā vai kkur citur gūglēt, bet gan reāli palīdzēt ar piemēriem...  ::

----------


## Epis

nu ta saki ko tu nesaproti ? 
tas i:  kurā punktā tālāk ar uzdevmu galā netiec ?

----------


## lopiks

jāsāk jau ar to, ka loģika klibo (nav man tās radošās loģikas sacerēšanas) zinu, kas kā strādā... abus signālus esmu izpētījis, zinu, ko vajag panākt, taču nesanāk... domāju, ka kko darbojoties ar palīgu padomiem es pats spētu saprast un turpmāk neprasīt šķietami elementāras lietas  ::  vajag startu - RS422 uztvērēju

šo uzdevumu domāju realizēt QuartusII web edition 9.1, grafiskajā režīmā.

----------


## Epis

ar blokshēmām neko tālu netiksi, vaig kodēt.vismaz uzspiežot google tavu HDB3 + VHDL atradu lapu kur ir kods domāts priekš cpld un reku ir kods: 
NRZ to HDB3 encoder  (nu  Rs232 itkā vaidzētu būt NRZ kodējumam ta pieņeumu ka RS422 arī vaidzētu būt tādam pašam)
tātad koa ienākošais signāls ir Non Return to Zero formātā un izejošais ir tas HDB3, paņem šito example kodu iemet Quartus VHDL projektā atver wawform simulātoru saliec tur tos PORTU signālus un uzstādi Input sigālus un ta uzsimulē un apsties vai ārā nāk tev vaidzīgie signālu, ja nāk ta pats zini tālāk kā ielādēt kodu iekš cpld  ::  


```
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    special.vhd                                              #
-- #                                                                          #
-- # Component  :    nrz_hdb3 : NRZ to HDB3 encoder (NRZ : Non-Return to Zero,#
-- #                            HDB3 : High Density Bipolar 3).               #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

-- nrz_hdb3 Entity Description
entity nrz_hdb3 is
	port(
		RES, CLK, NRZ: in std_ulogic;
		POS, NEG: out std_ulogic
	);
end nrz_hdb3;

-- nrz_hdb3 Architecture Description
architecture rtl of nrz_hdb3 is
	signal q: unsigned(3 downto 0);	
	signal zero, vl, ch, pos_neg, qzh: std_ulogic;
	
begin
	ch<=vl xor pos_neg;
	zero<=not(q(3) or q(2) or q(1) or q(0));
	qzh<=q(3) or (zero and ch);
	
	POS<=CLK and pos_neg and qzh;
	NEG<=CLK and not(pos_neg) and qzh;

	NRZ_Process:process(CLK, RES)
	begin
		if (RES='0') then
			q<=(OTHERS=>'0');
		   vl<='0';
			pos_neg<='1';
		elsif (rising_edge(CLK)) then
			q(0)<=NRZ;
			q(1)<=(q(0) or zero);
			q(3 downto 2)<=q(2 downto 1);
			if (zero='1') then
				vl<=not(vl);
			end if;
			if(((zero and (not(ch))) or q(3)) = '1') then
				pos_neg<=not(pos_neg);
			end if;
		end if;
	end process NRZ_Process;
end rtl;
```

----------


## lopiks

Redz, lai uzrakstītu to kodu, būtu apmēram jāsaprot, kam tur jānotiek... tāpēc es dodu priekšroku grafiskajam režīmam, pēcāk varētu apgūt VHDL, jo tā jau sanāk tā pati loģikas salikšana. varētu sākt tā pakāpeniski, sākumā tikai ar RS422 uztvērēju... palīdzēsiet?  ::

----------


## Epis

šito koda gabalu vari arī apskatītes grafiskā formā, caur RTL vieweri pec koda nosintezēšanas tur varēs redzēt visus grafiskos elementus, kas kā saslēgts, un ja gribi vari to grafisko shēmu atkārtot grafiskajā editorā (pats vēlreiz uzīmēt)
ja nemāki palaist VHDL kodu ta izmanto Quartus TUTORialu, es pats tam pašā sākumā gāju cauri (pirms vairākiem gadiem) un nav nekas grūts.
un pectam ka redzēsi grafiku gribēsi zināt kā tā visa shēma strādā ieliec VHDL kodā papild Output PORTU "Jaunais_PORTS" -> 
 "entity nrz_hdb3 is
   port(
      RES, CLK, NRZ: in std_ulogic;
      POS, NEG: out std_ulogic;
      Jaunais_PORTS: out std_Logic
   );
end nrz_hdb3;

tālāk pieslēdzies kādam Arhitecture daļā definētajam Signālam pēc Begin: ->

-- nrz_hdb3 Architecture Description
architecture rtl of nrz_hdb3 is
   signal q: unsigned(3 downto 0);   
   signal zero, vl, ch, pos_neg, qzh: std_ulogic;

begin
   ch<=vl xor pos_neg;
   Jaunais_PORTS <= ch;  // skatamies "ch" signālu 

tālāk wawform editorā pievieno Jaunais_PORTS signālu un laid simulātoru redzēsi kā mainās signāli, un šādi pēti visus intresējošos iekšējās logikas signālu vadus, un pēc RTL skaties.

grafiski shēmas zīmējot paiet baigi daudz laika + ja kautkas jāmaina, jāmodificē ta arī laiks skrien, un vispār es shēmas grafiski veidot nemāku, es domāju kodu formātā.
īstanībā ja nepatīk VHDL valoda vari mācītes verlog, tā itkā ir līdzīgāk C sintaksei tipa mazāk jāraksta kods, un ir brīvākas formās.

----------


## Vikings

Epi, Tev ir parastā specializēto pasniedzēju problēma. Tu runā gudras lietas cilvēkam, kurš no tāneko nesaprot.
Sāksim ar to, lopik, vai Tev Quartus ir jau uzinstalēts un cik daudz zini par loģiku programmēšanu? Kādi dzelži ir pieejami uz kuriem to mēģināt?
Jāsāk būtu ar to, ka uz pieejamajiem dzelžiem ( ja tādi ir pieejami, ja nē - tad uz simulatora) būtu jāizveido vismaz kaut kāda programma - kaut vai vienkāršs skaitītājs vai trigeris lai apgūtu pašu procesu no uzrakstīta koda līdz strādājošam dzelzim. Atbildi uz augstāk minētajiem jautājumiem un tad pa solim iziesim cauri visam procesam.

----------


## lopiks

Quartus jau ir uzinstalēts, ir pāris skaitītāju uzbliezti jau... grafisko editoru esmu izpētījis un arī waveform simulatorā esmu visu apguvis... tagad tik uz augšu jātiecās... esmu pamēģinājis asm, C un tas arī ir viss... neesmu nekāds guru, taču kko saprotu arī no loģikas (kas kā strādā, zinu)  :: 

PS. epi, visu cieņu, taču nokopēts nav apgūts un daudz lietderīgāk būtu, ja man izstāstītu, kam tur jānotiek, kāpēc ...  ::

----------


## Epis

vispār grūti saprast  tā piemēr koda RTL shēmu , un kodu arī, tur viss tā baigi soptimizēti uzkodēts ka neko saprast nevar. proti viss saspiests vienā processā, ar 1nu registru, bez nekāda lielāka pipline. es  darītū tā nosākuma dekodētu to NRZ iegūtu normālu seriālu signālu (tur būtu 1 registrs) un ta taisītu jaunu procesu kas ņemtu to normālo signālu un veidotu to HDB3 signālu atsevišķi. a tur vis vienā katlā samest, 
vari lopik sākt ar tā NRZ parveidi uz parasto signālu, tipa 


tipa kods tāds: ja iepriekšejais bits nav mainījies tad
reku screenShoti
[attachment=0:38qvyalu]nrz_hdb3.JPG[/attachment:38qvyalu]
[attachment=1:38qvyalu]nrz_hdb3vaveform.JPG[/attachment:38qvyalu]

karoči reku ir mans koda variants kā es dekodētu NRZ signālu: 
A- input signāls NRZ: 
B - output signāls binārais parastais;
clk- iekšejais cpld clock kas ir 4x lielāku frekvenci
CLK_in- RS422 cloks
NEG - ir  Toggle signāls kas fiksē transakciju no 1->0, un 0->1

[attachment=2:38qvyalu]nrz_epis.JPG[/attachment:38qvyalu]



```
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

-- nrz_hdb3 Entity Description
entity nrz_hdb3 is
   port(
     CLK_IN, RES,A, CLK, NRZ: in std_ulogic;
      POSp, NEG, B,T,T1: out std_ulogic;
Jaunais_PORTS: out std_Logic
   );
end nrz_hdb3;

-- nrz_hdb3 Architecture Description
architecture rtl of nrz_hdb3 is
   signal q: unsigned(3 downto 0);   
   signal c,C2,c3,b2,a2, Sout : std_ulogic;
   signal enable : std_logic :='1';
   
begin
   process(clk)
   begin
      if rising_edge(clk) then
		if  (a2='1') then
			C<='1';
		else C<='0';
    end if; 
    end if;
   end process;
   process(clk)
   begin
      if rising_edge(clk) then
		if  (a='1') then
			a2<='1';
		else a2<='0';
    end if; 
    end if;
   end process;
   C2<= a2 xor C; -- šeit iegūst vaidzīgo rezultātu, bet šādu pašu XOR funkciju var arī aprakstīt ar VHDL kodu
   -- kā piemēram šeit lejā ir tas pats tikai XOR funkcionalitāte ir sasniegta ar if,else kodu kas uzgenerē MUX2-1
process(clk)
begin
	if rising_edge(clk) then
		if(a2 ='0')then
			if  (C='1') then
				b2<='1';
			else b2<='0';
			end if; 
		else
			if (C='1') then
				b2<='0';
			else b2<='1';
			end if; 	
		end if;
	end if;
end process;
   
process(clk)
begin
if rising_edge(clk) then
	if(C2 ='1') then
	-- change Enable signāla stāvokli:
		if(enable='1') then
			enable <='0';
		else enable <='1';
		end if;
	end if;
	end if;	
end process;

process(clk)
begin
if rising_edge(CLK_IN) then
	if(enable ='1') then
		if(Sout ='1') then
			Sout<='0';
		else Sout<='1';
		end if;
	end if;
	end if;	
end process;

NEG<=C2;
B<=Sout;
end rtl;
```

----------


## Epis

vardsakot es savā varsijā izmantoju iekšejai detektēšanas logikai biški lielāku frekvenci (man tā vienkāršāk) lai generētu impulsu katrā reizē kad mainās ienākošais signāls, pēctam es ar to impulsu mainu Enable bita vertību, proti pēc katra impulsa Enable maina savu vertību, svkārt Enable bits ieslēdz vai apstādina Sout signālu (izejošais B signāls) kas tad kad Enable =1 maina savu vertību atkarībā no CLK_IN (RS422 clock) rising_edge, proti katra pulkstens tikša laikā Sout maina vertību ja enable=1, ja enable=0 ta paliek vecā vertība, un finālā dabūnam to dekosēšanas funkcionalitāti.  tākā var likt klāt kodētāju kas sakodēs to signālu tajā HDB3 formātā. 
Logika ir tāda lieta ka vienu un to pašu var izdarīt 10 veidos, un stili kā to dara ir dažādi, var visu uzkodēt tā lai rezultāts = 1 clk ciklā var ar vairāk cikliem, kā es izdarīju.
ā man tur ienākošam A (Rs422) signālam ir uzlikts 1 stabilizācijas registrs, tas lai signāls tīrāks (simulātorā arī labāk var redzēt kad signāls tiek noķerts ja pavirši samet Input A signālā tos 1,0 perjodus )

reku  mana kods RTL shema
[attachment=0:n5tf52td]nrz_epis_RTL.JPG[/attachment:n5tf52td]

----------


## lopiks

papētīju šito valodu... nav nemaz tik sarežģīta, protams, jāzina pāris fiškas, taču sintakse nav pārāk sarežģīta, paldies par palīdzību, gan jau vēl radīsies jautājumi, vaicāšu  ::

----------

