Kā uzrakstīt VHDL vienkāršā algoritma aprakstu: kontroles ceļš

Start Strong 6. nodarbība. Kā uzrakstīt motivācijas vēstuli? (Jūnijs 2019).

$config[ads_text] not found
Anonim

Kā uzrakstīt VHDL vienkāršā algoritma aprakstu: kontroles ceļš


Ar šo diskusiju Steve Arar turpina savu VHDL sēriju par vienkāršā algoritma pārvēršanu VHDL aprakstā - šoreiz koncentrējoties uz digitālā dizaina kontroles ceļa daļu.

Savā pēdējā rakstā es aprakstīju kā rakstīt VHDL vienkāršā algoritma aprakstu. Es noteicu atšķirību starp datu ceļu un kontroles ceļu digitālajā dizainā un pēc tam turpināju ienirt datu ceļā. Šajā rakstā mēs aplūkosim kontroles ceļu.

Šajā rakstā tiks apskatīts vienkāršā algoritma pārveidošana par VHDL aprakstu. Kā piemēru mēs izmantosim vismaz kopīgu daudzkārtēju (LCM) algoritmu.

Datu ceļa pārskats

Iepriekšējā rakstā mēs redzējām, ka, lai īstenotu LCM algoritma datu ceļu, ko aprakstījis pseidokode 1. sarakstā, mēs varam izmantot shēmu, kas parādīta 1. attēlā.

1. lappuse

 1 a=m 2 b=n 3 while (a != b) 4 { 5 if ( a < b ) 6 { 7 a=a+m 8 b=b 9 } 10 else 11 { 12 a=a 13 b=b+n 14 } 15 } 16 lcm=a 

1. attēls

Izmantojot atbilstošos loģikas līmeņus multiplekseru izvadei, mēs varam izvēlēties, kura darbība tiks veikta. Šajā rakstā mēs izveidosim ķēdi, kas ģenerē atbilstošu "sel" signālu, lai 1. attēlā norādītais datu ceļš veiktu darbības, kas vajadzīgas, lai aprēķinātu izejmateriālu LCM.

Pseidokoda mainīšana, lai tas atbilstu MFV aprakstam

1. attēlā "sel" signālam jābūt trīs dažādām vērtībām, lai tas varētu izvēlēties vienu no trim ieejām multipleksorā. Tādējādi ir saprātīgi sagaidīt, ka mums būs nepieciešama trīs valstu MFV, kur katra valsts atbilst vienai no trim iezīmēm, taču mēs redzēsim, ka MFV faktiski var tikt īstenota tikai ar divām valstīm.

Nākamais MFV stāvoklis tiks izvēlēts, pamatojoties uz algoritma plūsmu 1. sarakstā. Algoritma plūsma attiecas vai nu uz nākamo rindu, vai uz lejā uz konkrētu koda punktu, saskaņā ar "brīdī" un "ja" struktūras. Lai padarītu pārapdokumentu Listing 1 tuvāk MFV aprakstam, atkārtoti ierakstiet paziņojumu "while" šādā veidā:

2. lappuse

 1 a=m 2 b=n 3 if (a=b) 4 { 5 goto line 28 6 } 7 else 8 { 9 if ( a < b ) 10 { 11 a=a+m 12 b=b 13 } 14 else 15 { 16 a=a 17 b=b+n 18 } 19 } 20 if( a=b ) 21 { 22 goto line 28 23 } 24 else 25 { 26 goto line 9 27 } 28 lcm=a 

Šī jaunā versija izmanto "if-else" struktūras, lai aizvietotu paziņojumu "while"; tas atvieglo algoritma MFM izstrādi. Šo "ja" paziņojumu nosacījumi var patiešām sniegt mums dažus padomus par nosacījumiem MFV pārejai no vienas valsts uz otru.

Lai padarītu iepriekšminēto algoritmu praktiskāku, mēs pievienosim dažas citas funkcijas: pieņemsim, ka LCM shēmai ir "gatavs" izejas signāls un "sākuma" ievade. Kad "gatavā" izeja ir loģiska augsta, mēs zinām, ka sistēma atrodas "dīkstāvē" režīmā un ir gatava strādāt pie jauna ievades vērtību pāra. Arī apgalvojot, ka "gatavā" izeja ir augsta, tas nozīmē, ka ķēde ir beigusies ar iepriekšējo izejmateriālu LCM atrašanu. Tādējādi, kad mēs sasniedzam algoritma beigas, mums vajadzētu iestatīt "gatavu" izvadi loģikai augstā līmenī.

Turklāt, ja LCM shēmai tiek izmantots derīgs ievades vērtību pārs, mēs iestatām sākuma ievadi loģikai, lai ļautu shēmai uzzināt, ka tam jāuzsāk algoritms.

Algoritma ASMD diagramma

Lai atrastu VHDL algoritma aprakstu, mēs varam izdarīt dažādus kontroles ceļa stāvokļus diagrammā, ko sauc par ASMD, kas nozīmē algoritmisko stāvokļu mašīnu ar datu ceļu. ASMD diagramma ne tikai atspoguļo kontroles ceļa MIF, bet arī apraksta datu pārraides pārraides operācijas. Kā piemēru, kā iegūt konkrēta algoritma ASMD diagrammu, mēs izmantosim LCM algoritmu.

Pamatojoties uz mūsu līdzšinējo diskusiju, šķiet, ka mums vajadzētu izmantot trīs valstu MFV. Katra MFV valsts var atjaunināt a un b reģistru vērtību, piešķirt noteiktas vērtības ķēdes izejām, piemēram, gatavo izvadi, un pārbaudīt "ja" struktūras nosacījumus, lai noteiktu nākamo MFV stāvokli. Visu šo informāciju var attēlot ar algoritma ASMD shēmu.

Turpinājām LCM algoritmu: mēs izsauksim sistēmas sākotnējo stāvokli "dīkstāvē". Šajā stāvoklī sistēma ir gatava pieņemt jaunus ievades porus, tāpēc "gatavs" ir iestatīts uz augstu. Kā parādīts 2. attēlā, mēs varam izmantot taisnstūri, lai pārstāvētu šo stāvokli. Valsts nosaukums (ti, "dīkstāvē") ir rakstīts virs taisnstūra, un uzdevums, kas atbilst "gatavā" izvadei, tiek rakstīts taisnstūrī.

3. attēls

Kādas citas algoritma daļas var veikt šajā stāvokļa "sākuma" ieejā, ir loģiski zema, mēs nedrīkstam sākt aprēķinus, iespējams, tāpēc, ka ievades vēl nav derīgas. Tādēļ, lai "sāktu" = "0", mums vajadzētu palikt stāvoklī "tukšgaitas". Tomēr, ja "sākums" ir loģisks, mums vajadzētu attiecīgi saglabāt ievades, m un n, a un b reģistrā un sākt aprēķinus. Mēs varam saglabāt m un n stāvoklī "tukšgaitas" stāvoklī.

Lai attēlotu nosacītas struktūras, mēs izmantosim zaļu sešstūra formu. Algoritma nosacīto uzdevumu gadījumā izmantosim sarkano elipse. No tā mēs iegūstam:

4. attēls

Ievērojiet, ka uzdevumus reģistriem rāda bultiņa, piemēram, a ← m. Šo apzīmējumu izmanto, lai uzsvērtu, ka šādi uzdevumi stājas spēkā nākamajā pulksteņa malā. Tomēr uzdevumu, kas atbilst "gatavā" izvadei, attēlo ar "<=" apzīmējumu. Tas nozīmē, ka tad, kad mēs esam "tukšgaitas" stāvoklī, "gatavā" izeja vienmēr ir loģiska augsta, neatkarīgi no pulksteņa stāvokļa. Atzīmējiet arī 4.attēlā redzamo punktu kārbu, kas norāda, ka visas šīs operācijas tiek veiktas stāvoklī "dīkstāvē".

Tālāk mēs sasniedzam "if" paziņojumu 3. rindā, kas salīdzina a un b, lai noteiktu nākamo darbību. Kad a = b, algoritms ir pabeigts, un mēs varam piešķirt vērtību a izvades lcm ; to var izdarīt jaunā stāvoklī. Tomēr ir vēl viena alternatīva: mēs varam bez nosacījumiem piešķirt vērtību a - lcm, bet ņemt vērā, ka lcm vērtība ir derīga tikai tad, kad algoritms ir pabeigts.

Citiem vārdiem sakot, lcm ir derīgs tikai tad, ja "gatavā" izeja ir augsta. Tādējādi mēs varam vienkārši pārbaudīt nosacījumu a = b, lai izlemtu, vai algoritms ir pabeigts (tādā gadījumā mēs atgriezīsimies pie "dīkstāves" stāvokļa), vai arī mums ir jāturpina pārējais algoritms. Līdz šim mums ir šāda diagramma:

5. attēls

Paturiet prātā, ka, lai gan nav parādīts 5. attēlā, izvades lcm ir vienāds ar a un ir derīgs, ja "ready" ir loģisks augsts.

Tagad izpētīsim 9. Rindkopas "if" paziņojumu. Vai mēs varam pārbaudīt nosacījumu $ $ a \ leq b $ $ "dīkstāves" stāvoklī? Ievērojiet, ka "if" struktūra, kas sākas 9. līnijā, ir galvenie LCM algoritma aprēķini, un, ņemot vērā "if" paziņojumu 20. līnijā, mēs vairākas reizes varam atgriezties pie līnijas 9 "if" paziņojuma. Tāpēc es ierosinu izvietot 9. līnijas "if" paziņojumu jaunā MFV stāvoklī. Jāatzīmē, ka mēs varētu izveidot vairākas ASMD diagrammas konkrētam projektam, taču dažiem no šiem ASMD var būt vajadzīgs vairāk valstu vai vairāk nosacītu bloku.

Pēc ASMD diagrammas nākamā statusa pievienošanas nepieciešamo bloku pievienošanai mēs nonākam pie pilnīgas algoritma diagrammas, kas parādīta 6. attēlā. Kā redzat, nākamā valsts tiek nosaukta kā op. Pirmais šīs valsts nosacījuma bloks salīdzina ar b un veic nepieciešamo operāciju saskaņā ar salīdzinājuma rezultātu. Visbeidzot tiek pārbaudīts nosacījums $ $ a = b $$. Ja šis nosacījums tiek novērtēts kā patiess, algoritms beidzas un sistēma pāriet stāvoklī "tukšgaitas". Pretējā gadījumā tas atgriežas stāvoklī "op", kā norādīts pseido koda 26. līnijā.

6. attēls

Ir daži punkti, kam jāpievērš tālāka uzmanība: pirmkārt, ASMD diagrammā parādīti tikai tie reģistri, kuru vērtība ir mainījusies. Piemēram, 2. attēlā norādītās 12. un 16. līnijas nav parādītas 6. attēlā. Turklāt, kā redzat, izlaide "gatavs" ir loģiski augsts "dīkstāves" stāvoklī, bet tā vērtība nav norādīta op stāvoklim. Tas ir veids, kā mēs norādām, ka "gatavā" izeja ir augsta tikai "tukšgaitas" stāvoklī, un tādēļ tas tiek uzskatīts par loģiski zemu "op" stāvoklī.

Otrkārt, esiet piesardzīgs attiecībā uz nosacītajiem blokiem, kas tiek ievietoti pēc nodošanas reģistrā. Ņemiet vērā, ka nodošana reģistrā stāsies spēkā nākamajā pulksteņa atzīmei. Tāpēc mums vajadzētu būt uzmanīgiem, lietojot reģistra vērtību nosacītajos blokos: vai mums vajadzētu izmantot pašreizējo reģistra vērtību vai tā nākamo vērtību? ASMD diagramma, kuru esam izveidojuši, ir balstīta uz pseido kodiem, kuros mainīgā vērtība tiek atjaunināta uzreiz pēc noteiktā uzdevuma. Tas nozīmē, ka mums vajadzētu izmantot nākamo a un b reģistru vērtību mūsu diagrammā.

Mēs definēsim divus jaunus signālus add_a un add_b, kas ir vienādi ar + m un b + n, un pēc tam mēs varam no jauna attēlot 6. diagrammu, kā parādīts 7. attēlā. Ņemiet vērā, ka nosacītie bloki tagad izmanto nākamo vērtību reģistrē salīdzinājumos.

7. attēls

Treškārt, lai gan sākotnēji mēs plānojām izveidot trīs valstu MFV, diagramma 7. attēlā rāda, ka mūsu MFV ir tikai divas valstis. Kā redzat, divi a un b reģistru (11.-12. Un 11.-12. Līnijas un 16.-17. Lappuse) ieraksti tiek ievietoti vienā valstī, proti, "op" stāvoklī; tomēr starp šiem diviem uzdevumu kopumiem nebūs konfliktu, jo tikai vienu no tiem var izpildīt noteiktā pulksteņa ciklā.

Patiesībā 7. shēmas plūsmas diagrammai tiks ieviests datu ceļu multipleksers, kā parādīts 8. attēlā. Šī signāla vērtība, kas ir MFV stāvoklis, ir vai nu viena, vai nulle. Tomēr, ja MFV ir stāvoklī "op", salīdzinājuma bloka izlaide noteiks, vai ir jāizpilda pseido koda 11. un 12. līnija vai 16. un 17. līnija.

8. attēls

Pamatojoties uz ASMD diagrammu 7. Attēlā un 8. Attēlā ietverto shematisko modeli, mēs varam atrast algoritma VHDL aprakstu, kas norādīts 3. Sarakstā. VHDL koda komentāri sniedz dažus padomus par aparatūru, uz ko atsaucas katrs koda segments.

Listing 3

 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.NUMERIC_STD.ALL; 4 entity lcm_fsmd is 5 port( clk, reset: in std_logic; 6 start: in std_logic; 7 m, n: in std_logic_vector(2 downto 0); 8 ready: out std_logic; 9 lcm: out std_logic_vector(5 downto 0)); 10 end lcm_fsmd; 11 architecture lcm_arch of lcm_fsmd is 12 type state_type is (idle, op); 13 signal state_reg, state_next: state_type; 14 signal a_reg, a_next, b_reg, b_next: unsigned(5 downto 0); 15 signal add_a, add_b: unsigned(5 downto 0); 16 begin 17 --control path: registers of the FSM 18 process(clk, reset) 19 begin 20 if (reset='1') then 21 state_reg <= idle; 22 elsif (clk'event and clk="1") then 23 state_reg <= state_next; 24 end if; 25 end process; 26 --control path: the logic that determines the next state of the FSM (this part of --the code is written based on the green hexagons of Figure 7) 27 process(state_reg, start, m, n, add_a, add_b) 28 begin 29 case state_reg is 30 when idle => 31 if ( start="1" ) then 32 if ( m=n ) then 33 state_next <= idle; 34 else 35 state_next <= op; 36 end if; 37 else 38 state_next41 if ( add_a = add_b ) then 42 state_next <= idle; 43 else 44 state_next <= op; 45 end if; 46 end case; 47 end process; 48 --control path: output logic 49 ready <= '1' when state_reg = idle else 50 '0'; 51 --data path: the registers used in the data path 52 process(clk, reset) 53 begin 54 if ( reset="1" ) then 55 a_reg'0'); 56 b_reg'0'); 57 elsif ( clk'event and clk="1" ) then 58 a_reg <= a_next; 59 b_reg <= b_next; 60 end if; 61 end process; 62 --data path: the multiplexers of Figure 8 63 process(state_reg, m, n, a_reg, b_reg, add_a, add_b) 64 begin 65 case state_reg is 66 when idle => 67 a_next <= unsigned( "000" & m); 68 b_next70 if ( a_reg < b_reg ) then 71 a_next <= add_a; 72 b_next <= b_reg; 73 else 74 a_next <= a_reg; 75 b_next <= add_b; 76 end if; 77 end case; 78 end process; 79 --data path: functional units 80 add_a <= unsigned(("000" & m)) + a_reg; 81 add_b <= unsigned(("000" & n)) + b_reg; 82 --data path: output 83 lcm <= std_logic_vector(a_reg); 84 end lcm_arch; 

9. attēlā parādīts ISE simulācija iepriekšminētajam kodam.

9. attēls

Šajā simulācijā ieejas ir m = 7 un n = 6 . Algoritma beigās, kad "gatavā" izeja pārsniedz augstu, lcm izlaide ir 42, kas ir visbiežāk atkārtoti 7 un 6.

Kopsavilkums

  • MFM var izmantot kā datu apstrādes algoritma kontrolieris.
  • Rakstot algoritmu, izmantojot "if" paziņojumus, mēs varam vieglāk izstrādāt algoritma FSM. "Noteikumu" nosacījumi var patiešām sniegt mums dažus norādījumus par MFP pārejas nosacījumiem no vienas valsts uz otru.
  • ASMD diagramma ne tikai atspoguļo kontroles ceļa MIF, bet arī apraksta datu pārraides pārraides operācijas.
  • Konkrētam projektam ir iespējams izveidot vairākas ASMD diagrammas, taču dažiem no šiem ASMD var būt nepieciešams vairāk valstu vai vairāk nosacītu bloku.

Lai apskatītu pilnu manu rakstu sarakstu, lūdzu, apmeklējiet šo lapu.