<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sduda</id>
	<title>WikiLabs - Contribuții utilizator [ro]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sduda"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Sduda"/>
	<updated>2026-05-24T17:01:23Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6895</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6895"/>
		<updated>2021-03-21T14:56:46Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory) este un circuit combinational folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru a intelege termenul de memorie, putem face urmatorul  exercitiu de imaginatie: sa ne gandim  la un  dulap cu mai  multe  sertare. Continutul memoriei este reprezentat de continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am intalnit memoria ROM in aplicatiile anterioare, atunci cand am vorbit despre structura unui FPGA. Am vazut atunci ca functiile logice erau implementate pe FPGA prin intermediul unor LUT-uri (memorii  ROM), care stocau iesirile corespunzatoare unor  combinatii de intrari. Asadar, in cazul acela, adresele erau reprezentate de combinatii ale intrarilor, iar continutul memoriei era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametri: numarul de biti ai adresei, care este legat de numarul de locatii de memorie (cu n biti de adresa putem  forma 2𝑛 combinatii diferite, deci putem accesa maxim 2𝑛 locatii de memorie) si dimensiunea locatiei de memorie,  care ne spune cat de multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biti, asadar putem accesa cu aceasta 16 locatii diferite de memorie. Dimensiunea fiecarei locatii este de 8 biti, asadar fiecare locatie de memorie poate stoca numere de 8 biti. Spunem ca memoria ROM este o memorie 4x8.  Capacitatea acestei memorii este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea comportamentala a unui decodor, testarea acestuia prin simulare si sinteza pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera la iesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplu, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondenta intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biti, care va reprezenta adresa memoriei ROM si o iesire pe 4 biti, reprezentand continuturile memoriei ROM corespunzatoare fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul instructiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acopera toate cazurile posibile (toate combinatiile de 2 biti), este bine sa punem si un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita  inserarea in locul circuitului combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe FPGA are ca tinta doar modulul in  sine (Decoder), modulul de test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de intrare vor fi legate la dispozitive care comanda stari, iar iesirile la dispozitive care observa stari. Asadar, vom alege aici comutatoare pentru intrari (cate  un  comutator  pentru fiecare bi tal fiecarei intrari –2 in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Fpga connections.PNG ‎| 600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Implementarea  unui  circuit  de afisare  a  sumei  dintre  doua  numere  pe  2  biti,  folosind afisajul cu 7 segmente&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display.PNG ‎| 500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea Verilog amodululuiAdder2b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder2b(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output reg [2:0] sum&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    sum = in0 + in1;&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Suma a doua numere pe n biti este un numar pe n+1 biti, cel de-al n+1 -ulea fiind bitul de carry. De aceea, aici suma a doua numere pe 2 biti va fi un numar pe 3 biti.&lt;br /&gt;
* Aici consideram un sumator simplu, pentru care carry este inglobat in suma (nu este explicit un port separat).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiAfisaj7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Inainte de a prezenta codul  Verilog, trebuie sa intelegem cum functioneaza afisajul cu 7 segmente.  Acest dispozitiv de afisare este format, asa cum sugereaza si numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controland tensiunea aplicata pe acesta. Pentru acest afisaj, comanda este negativa: aplicand  0  logic pe un segment acesta se va aprinde, iar aplicand 1 logic, acesta se va stinge.&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentata in imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1.&lt;br /&gt;
&lt;br /&gt;
In cazul circuitului nostru, vom vrea sa afisam numerele de la 0 la 6, deoarece suma maxima ce poate fi obtinuta este 6. Pentru aceasta, implementam o memorie ROM care va contine codurile de aprins-stins  pentru  fiecare  segment,  fiind  accesate  pe  baza  numarului  pe  care  dorim  sa  il afisam. Asadar,  intrarea  memoriei  ROM  (adresa)  va  fi  pe  3  biti  (3  biti sunt  de  ajuns  pentru  a  reprezenta numerele  de  la  0  la 6),  iar  iesirea  va  fi  pe  7  biti,  cate  un  bit  de  stare  pentru  fiecare  segment. Vom considera, asadar, ca bitul 0 al iesirii se va lega la segmentul 0, bitul 1 la segmentul 1 si tot asa.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca la intrare  vom avea  0, memoria ROM va trebui sa dea la iesire sirul 1000000, stingand segmentul 6 si aprinzandu-le pe toate celelalte. Extinzand pentru toate numerele de la 0 la 7, obtinem:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Numar&amp;#039;&amp;#039;&amp;#039; ||  &amp;#039;&amp;#039;&amp;#039;Sir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 7&amp;#039;b000_0010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiDisplay7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input [2:0] in,&lt;br /&gt;
  output reg [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      3&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      3&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      3&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      3&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      3&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      3&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      3&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului AddAndDisplay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output [6:0] displayCode&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  wire [2:0] sum;&lt;br /&gt;
&lt;br /&gt;
  Adder2b ADD (&lt;br /&gt;
    .in0(in0),&lt;br /&gt;
    .in1(in1),&lt;br /&gt;
    .sum(sum)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  Display7Seg DISPLAY(&lt;br /&gt;
    .in(sum),&lt;br /&gt;
    .out(displayCode)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay_TB();&lt;br /&gt;
&lt;br /&gt;
  reg [1:0] in0_t, in1_t;&lt;br /&gt;
  wire [6:0] displayCode_t;&lt;br /&gt;
&lt;br /&gt;
  integer idx, jdx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      for(jdx=0; jdx&amp;lt;4; jdx = jdx + 1) begin&lt;br /&gt;
        in0_t = idx;&lt;br /&gt;
        in1_t = jdx;&lt;br /&gt;
        #1;&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  AddAndDisplay DUT(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .displayCode(displayCode_t)&lt;br /&gt;
  );  &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Implementarea  pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (AddAndDisplay),  modulul  de  test (AddAndDisplay_TB) fiind nesintetizabil.&lt;br /&gt;
&lt;br /&gt;
Conform  indicatiilor  din  Introducere,  semnalele  de  intrare  vor  fi  legate  la  dispozitive  care  comanda stari,  iar  iesirile  la  dispozitive  care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari (cate  un  comutator  pentru  fiecare  bit  al  fiecarei  intrari –4 in  total) si afisajul cu 7 segmente Digit 0 pentru iesire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[2] || SW2 || AF9&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[3] || SW3 || AF10&lt;br /&gt;
&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || HEX0[0] || AE26&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || HEX0[1] || AE27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || HEX0[2] || AE28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || HEX0[3] || AG27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[4] || HEX0[4] || AF28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[5] || HEX0[5] || AG28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[6] || HEX0[6] || AH28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display fpga conn.PNG | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6894</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6894"/>
		<updated>2021-03-21T14:27:24Z</updated>

		<summary type="html">&lt;p&gt;Sduda: /* Exemplul 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire   pe   4   biti,   reprezentand   continuturile   memoriei   ROM   corespunzatoare   fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Fpga connections.PNG ‎| 600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Implementarea  unui  circuit  de afisare  a  sumei  dintre  doua  numere  pe  2  biti,  folosind afisajul cu 7 segmente&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display.PNG ‎| 500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea Verilog amodululuiAdder2b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder2b(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output reg [2:0] sum&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    sum = in0 + in1;&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Suma a doua numere pe n biti este un numar pe n+1 biti, cel de-al n+1 -ulea fiind bitul de carry.De aceea, aici suma a doua numere pe 2 biti va fi un numar pe 3 biti.&lt;br /&gt;
* Aici  consideram  un  sumator  simplu,  pentru  care  carry  este  inglobat  in  suma  (nu  este explicit un port separat).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiAfisaj7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Inainte de  a  prezenta  codul  Verilog,  trebuie  sa intelegem  cum  functioneaza  afisajul cu  7 segmente.  Acest  dispozitiv  de  afisare  este  format,  asa  cum sugereaza  si  numele,  din  7 segmente  ce pot fi controlate separat. Putem aprinde sau stinge fiecare segmentcontroland tensiunea aplicata pe acesta.  Pentru  acest  afisaj,  comanda  este  negativa:  aplicand  0  logic  pe  un  segment  acesta  se  va aprinde, iar aplicand 1 logic, acesta se va stinge.&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentata in imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru  a  reprezenta,  de  exemplu, cele  16  numere  hexa,segmentele  trebuie  aprinse  conform Anexei 1.&lt;br /&gt;
&lt;br /&gt;
In cazul circuitului nostru, vom vrea sa afisam numerele  de  la 0 la 6, deoarece suma maxima ce poate fi obtinuta este 6. Pentru aceasta, implementam o memorie ROM care va contine codurile de aprins-stins  pentru  fiecare  segment,  fiind  accesate  pe  baza  numarului  pe  care  dorim  sa  il afisam. Asadar,  intrarea  memoriei  ROM  (adresa)  va  fi  pe  3  biti  (3  bitisunt  de  ajuns  pentru  a  reprezenta numerele  de  la  0  la 6),  iar  iesirea  va  fi  pe  7  biti,  cate  un  bit  de  stare  pentru  fiecare  segment. Vom considera, asadar, ca bitul 0 al iesirii se va lega la segmentul 0, bitul 1 la segmentul 1 si tot asa.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca la intrare  vom avea  0, memoria ROM va trebui sa dea  la iesire sirul 1000000, stingand segmentul 6 si aprinzandu-le pe toate celelalte.Extinzand pentru toate numerele de la 0 la 7, obtinem:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Numar&amp;#039;&amp;#039;&amp;#039; ||  &amp;#039;&amp;#039;&amp;#039;Sir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 7&amp;#039;b000_0010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiDisplay7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input [2:0] in,&lt;br /&gt;
  output reg [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      3&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      3&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      3&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      3&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      3&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      3&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      3&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului AddAndDisplay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output [6:0] displayCode&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  wire [2:0] sum;&lt;br /&gt;
&lt;br /&gt;
  Adder2b ADD (&lt;br /&gt;
    .in0(in0),&lt;br /&gt;
    .in1(in1),&lt;br /&gt;
    .sum(sum)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  Display7Seg DISPLAY(&lt;br /&gt;
    .in(sum),&lt;br /&gt;
    .out(displayCode)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay_TB();&lt;br /&gt;
&lt;br /&gt;
  reg [1:0] in0_t, in1_t;&lt;br /&gt;
  wire [6:0] displayCode_t;&lt;br /&gt;
&lt;br /&gt;
  integer idx, jdx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      for(jdx=0; jdx&amp;lt;4; jdx = jdx + 1) begin&lt;br /&gt;
        in0_t = idx;&lt;br /&gt;
        in1_t = jdx;&lt;br /&gt;
        #1;&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  AddAndDisplay DUT(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .displayCode(displayCode_t)&lt;br /&gt;
  );  &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Implementarea  pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (AddAndDisplay),  modulul  de  test (AddAndDisplay_TB) fiind nesintetizabil.&lt;br /&gt;
&lt;br /&gt;
Conform  indicatiilor  din  Introducere,  semnalele  de  intrare  vor  fi  legate  la  dispozitive  care  comanda stari,  iar  iesirile  la  dispozitive  care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari (cate  un  comutator  pentru  fiecare  bit  al  fiecarei  intrari –4in  total)  si afisajul cu  7  segmente Digit 0 pentru iesire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[2] || SW2 || AF9&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[3] || SW3 || AF10&lt;br /&gt;
&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || HEX0[0] || AE26&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || HEX0[1] || AE27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || HEX0[2] || AE28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || HEX0[3] || AG27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[4] || HEX0[4] || AF28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[5] || HEX0[5] || AG28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[6] || HEX0[6] || AH28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display fpga conn.PNG | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6893</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6893"/>
		<updated>2021-03-21T14:26:38Z</updated>

		<summary type="html">&lt;p&gt;Sduda: /* TODO: Add image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire   pe   4   biti,   reprezentand   continuturile   memoriei   ROM   corespunzatoare   fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Fpga connections.PNG ‎| 600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Implementarea  unui  circuit  de afisare  a  sumei  dintre  doua  numere  pe  2  biti,  folosind afisajul cu 7 segmente&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display.PNG ‎| 500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea Verilog amodululuiAdder2b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder2b(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output reg [2:0] sum&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    sum = in0 + in1;&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Suma a doua numere pe n biti este un numar pe n+1 biti, cel de-al n+1 -ulea fiind bitul de carry.De aceea, aici suma a doua numere pe 2 biti va fi un numar pe 3 biti.&lt;br /&gt;
* Aici  consideram  un  sumator  simplu,  pentru  care  carry  este  inglobat  in  suma  (nu  este explicit un port separat).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiAfisaj7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Inainte de  a  prezenta  codul  Verilog,  trebuie  sa intelegem  cum  functioneaza  afisajul cu  7 segmente.  Acest  dispozitiv  de  afisare  este  format,  asa  cum sugereaza  si  numele,  din  7 segmente  ce pot fi controlate separat. Putem aprinde sau stinge fiecare segmentcontroland tensiunea aplicata pe acesta.  Pentru  acest  afisaj,  comanda  este  negativa:  aplicand  0  logic  pe  un  segment  acesta  se  va aprinde, iar aplicand 1 logic, acesta se va stinge.&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentata in imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 400px]]&lt;br /&gt;
&lt;br /&gt;
Pentru  a  reprezenta,  de  exemplu, cele  16  numere  hexa,segmentele  trebuie  aprinse  conform Anexei 1.&lt;br /&gt;
&lt;br /&gt;
In cazul circuitului nostru, vom vrea sa afisam numerele  de  la 0 la 6, deoarece suma maxima ce poate fi obtinuta este 6. Pentru aceasta, implementam o memorie ROM care va contine codurile de aprins-stins  pentru  fiecare  segment,  fiind  accesate  pe  baza  numarului  pe  care  dorim  sa  il afisam. Asadar,  intrarea  memoriei  ROM  (adresa)  va  fi  pe  3  biti  (3  bitisunt  de  ajuns  pentru  a  reprezenta numerele  de  la  0  la 6),  iar  iesirea  va  fi  pe  7  biti,  cate  un  bit  de  stare  pentru  fiecare  segment. Vom considera, asadar, ca bitul 0 al iesirii se va lega la segmentul 0, bitul 1 la segmentul 1 si tot asa.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca la intrare  vom avea  0, memoria ROM va trebui sa dea  la iesire sirul 1000000, stingand segmentul 6 si aprinzandu-le pe toate celelalte.Extinzand pentru toate numerele de la 0 la 7, obtinem:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Numar&amp;#039;&amp;#039;&amp;#039; ||  &amp;#039;&amp;#039;&amp;#039;Sir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 7&amp;#039;b000_0010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiDisplay7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input [2:0] in,&lt;br /&gt;
  output reg [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      3&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      3&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      3&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      3&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      3&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      3&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      3&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului AddAndDisplay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output [6:0] displayCode&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  wire [2:0] sum;&lt;br /&gt;
&lt;br /&gt;
  Adder2b ADD (&lt;br /&gt;
    .in0(in0),&lt;br /&gt;
    .in1(in1),&lt;br /&gt;
    .sum(sum)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  Display7Seg DISPLAY(&lt;br /&gt;
    .in(sum),&lt;br /&gt;
    .out(displayCode)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay_TB();&lt;br /&gt;
&lt;br /&gt;
  reg [1:0] in0_t, in1_t;&lt;br /&gt;
  wire [6:0] displayCode_t;&lt;br /&gt;
&lt;br /&gt;
  integer idx, jdx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      for(jdx=0; jdx&amp;lt;4; jdx = jdx + 1) begin&lt;br /&gt;
        in0_t = idx;&lt;br /&gt;
        in1_t = jdx;&lt;br /&gt;
        #1;&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  AddAndDisplay DUT(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .displayCode(displayCode_t)&lt;br /&gt;
  );  &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Implementarea  pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (AddAndDisplay),  modulul  de  test (AddAndDisplay_TB) fiind nesintetizabil.&lt;br /&gt;
&lt;br /&gt;
Conform  indicatiilor  din  Introducere,  semnalele  de  intrare  vor  fi  legate  la  dispozitive  care  comanda stari,  iar  iesirile  la  dispozitive  care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari (cate  un  comutator  pentru  fiecare  bit  al  fiecarei  intrari –4in  total)  si afisajul cu  7  segmente Digit 0 pentru iesire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[2] || SW2 || AF9&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[3] || SW3 || AF10&lt;br /&gt;
&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || HEX0[0] || AE26&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || HEX0[1] || AE27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || HEX0[2] || AE28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || HEX0[3] || AG27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[4] || HEX0[4] || AF28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[5] || HEX0[5] || AG28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[6] || HEX0[6] || AH28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display fpga conn.PNG | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:7LED_display.PNG&amp;diff=6892</id>
		<title>Fișier:7LED display.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:7LED_display.PNG&amp;diff=6892"/>
		<updated>2021-03-21T14:26:04Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6891</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6891"/>
		<updated>2021-03-21T14:25:01Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire   pe   4   biti,   reprezentand   continuturile   memoriei   ROM   corespunzatoare   fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Fpga connections.PNG ‎| 600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Implementarea  unui  circuit  de afisare  a  sumei  dintre  doua  numere  pe  2  biti,  folosind afisajul cu 7 segmente&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display.PNG ‎| 500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea Verilog amodululuiAdder2b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder2b(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output reg [2:0] sum&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    sum = in0 + in1;&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Suma a doua numere pe n biti este un numar pe n+1 biti, cel de-al n+1 -ulea fiind bitul de carry.De aceea, aici suma a doua numere pe 2 biti va fi un numar pe 3 biti.&lt;br /&gt;
* Aici  consideram  un  sumator  simplu,  pentru  care  carry  este  inglobat  in  suma  (nu  este explicit un port separat).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiAfisaj7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Inainte de  a  prezenta  codul  Verilog,  trebuie  sa intelegem  cum  functioneaza  afisajul cu  7 segmente.  Acest  dispozitiv  de  afisare  este  format,  asa  cum sugereaza  si  numele,  din  7 segmente  ce pot fi controlate separat. Putem aprinde sau stinge fiecare segmentcontroland tensiunea aplicata pe acesta.  Pentru  acest  afisaj,  comanda  este  negativa:  aplicand  0  logic  pe  un  segment  acesta  se  va aprinde, iar aplicand 1 logic, acesta se va stinge.&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentata in imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
== TODO: Add image  == &lt;br /&gt;
&lt;br /&gt;
Pentru  a  reprezenta,  de  exemplu, cele  16  numere  hexa,segmentele  trebuie  aprinse  conform Anexei 1.&lt;br /&gt;
&lt;br /&gt;
In cazul circuitului nostru, vom vrea sa afisam numerele  de  la 0 la 6, deoarece suma maxima ce poate fi obtinuta este 6. Pentru aceasta, implementam o memorie ROM care va contine codurile de aprins-stins  pentru  fiecare  segment,  fiind  accesate  pe  baza  numarului  pe  care  dorim  sa  il afisam. Asadar,  intrarea  memoriei  ROM  (adresa)  va  fi  pe  3  biti  (3  bitisunt  de  ajuns  pentru  a  reprezenta numerele  de  la  0  la 6),  iar  iesirea  va  fi  pe  7  biti,  cate  un  bit  de  stare  pentru  fiecare  segment. Vom considera, asadar, ca bitul 0 al iesirii se va lega la segmentul 0, bitul 1 la segmentul 1 si tot asa.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca la intrare  vom avea  0, memoria ROM va trebui sa dea  la iesire sirul 1000000, stingand segmentul 6 si aprinzandu-le pe toate celelalte.Extinzand pentru toate numerele de la 0 la 7, obtinem:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Numar&amp;#039;&amp;#039;&amp;#039; ||  &amp;#039;&amp;#039;&amp;#039;Sir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 7&amp;#039;b000_0010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiDisplay7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input [2:0] in,&lt;br /&gt;
  output reg [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      3&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      3&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      3&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      3&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      3&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      3&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      3&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului AddAndDisplay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output [6:0] displayCode&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  wire [2:0] sum;&lt;br /&gt;
&lt;br /&gt;
  Adder2b ADD (&lt;br /&gt;
    .in0(in0),&lt;br /&gt;
    .in1(in1),&lt;br /&gt;
    .sum(sum)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  Display7Seg DISPLAY(&lt;br /&gt;
    .in(sum),&lt;br /&gt;
    .out(displayCode)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay_TB();&lt;br /&gt;
&lt;br /&gt;
  reg [1:0] in0_t, in1_t;&lt;br /&gt;
  wire [6:0] displayCode_t;&lt;br /&gt;
&lt;br /&gt;
  integer idx, jdx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      for(jdx=0; jdx&amp;lt;4; jdx = jdx + 1) begin&lt;br /&gt;
        in0_t = idx;&lt;br /&gt;
        in1_t = jdx;&lt;br /&gt;
        #1;&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  AddAndDisplay DUT(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .displayCode(displayCode_t)&lt;br /&gt;
  );  &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Implementarea  pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (AddAndDisplay),  modulul  de  test (AddAndDisplay_TB) fiind nesintetizabil.&lt;br /&gt;
&lt;br /&gt;
Conform  indicatiilor  din  Introducere,  semnalele  de  intrare  vor  fi  legate  la  dispozitive  care  comanda stari,  iar  iesirile  la  dispozitive  care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari (cate  un  comutator  pentru  fiecare  bit  al  fiecarei  intrari –4in  total)  si afisajul cu  7  segmente Digit 0 pentru iesire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[2] || SW2 || AF9&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[3] || SW3 || AF10&lt;br /&gt;
&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || HEX0[0] || AE26&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || HEX0[1] || AE27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || HEX0[2] || AE28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || HEX0[3] || AG27&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[4] || HEX0[4] || AF28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[5] || HEX0[5] || AG28&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[6] || HEX0[6] || AH28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display fpga conn.PNG | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Anexa1.PNG&amp;diff=6890</id>
		<title>Fișier:Anexa1.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Anexa1.PNG&amp;diff=6890"/>
		<updated>2021-03-21T14:23:56Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Add_and_display_fpga_conn.PNG&amp;diff=6889</id>
		<title>Fișier:Add and display fpga conn.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Add_and_display_fpga_conn.PNG&amp;diff=6889"/>
		<updated>2021-03-21T14:23:25Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6888</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6888"/>
		<updated>2021-03-21T14:16:20Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire   pe   4   biti,   reprezentand   continuturile   memoriei   ROM   corespunzatoare   fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Fpga connections.PNG ‎| 600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Implementarea  unui  circuit  de afisare  a  sumei  dintre  doua  numere  pe  2  biti,  folosind afisajul cu 7 segmente&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Add and display.PNG ‎| 500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Implementarea Verilog amodululuiAdder2b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder2b(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output reg [2:0] sum&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    sum = in0 + in1;&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Suma a doua numere pe n biti este un numar pe n+1 biti, cel de-al n+1 -ulea fiind bitul de carry.De aceea, aici suma a doua numere pe 2 biti va fi un numar pe 3 biti.&lt;br /&gt;
* Aici  consideram  un  sumator  simplu,  pentru  care  carry  este  inglobat  in  suma  (nu  este explicit un port separat).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiAfisaj7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Inainte de  a  prezenta  codul  Verilog,  trebuie  sa intelegem  cum  functioneaza  afisajul cu  7 segmente.  Acest  dispozitiv  de  afisare  este  format,  asa  cum sugereaza  si  numele,  din  7 segmente  ce pot fi controlate separat. Putem aprinde sau stinge fiecare segmentcontroland tensiunea aplicata pe acesta.  Pentru  acest  afisaj,  comanda  este  negativa:  aplicand  0  logic  pe  un  segment  acesta  se  va aprinde, iar aplicand 1 logic, acesta se va stinge.&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentata in imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
== TODO: Add image  == &lt;br /&gt;
&lt;br /&gt;
Pentru  a  reprezenta,  de  exemplu, cele  16  numere  hexa,segmentele  trebuie  aprinse  conform Anexei 1.&lt;br /&gt;
&lt;br /&gt;
In cazul circuitului nostru, vom vrea sa afisam numerele  de  la 0 la 6, deoarece suma maxima ce poate fi obtinuta este 6. Pentru aceasta, implementam o memorie ROM care va contine codurile de aprins-stins  pentru  fiecare  segment,  fiind  accesate  pe  baza  numarului  pe  care  dorim  sa  il afisam. Asadar,  intrarea  memoriei  ROM  (adresa)  va  fi  pe  3  biti  (3  bitisunt  de  ajuns  pentru  a  reprezenta numerele  de  la  0  la 6),  iar  iesirea  va  fi  pe  7  biti,  cate  un  bit  de  stare  pentru  fiecare  segment. Vom considera, asadar, ca bitul 0 al iesirii se va lega la segmentul 0, bitul 1 la segmentul 1 si tot asa.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca la intrare  vom avea  0, memoria ROM va trebui sa dea  la iesire sirul 1000000, stingand segmentul 6 si aprinzandu-le pe toate celelalte.Extinzand pentru toate numerele de la 0 la 7, obtinem:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Numar&amp;#039;&amp;#039;&amp;#039; ||  &amp;#039;&amp;#039;&amp;#039;Sir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 7&amp;#039;b000_0010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modululuiDisplay7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input [2:0] in,&lt;br /&gt;
  output reg [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      3&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      3&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      3&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      3&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      3&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      3&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      3&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului AddAndDisplay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AddAndDisplay(&lt;br /&gt;
  input [1:0] in0,&lt;br /&gt;
  input [1:0] in1,&lt;br /&gt;
  output [6:0] displayCode&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  wire [2:0] sum;&lt;br /&gt;
&lt;br /&gt;
  Adder2b ADD (&lt;br /&gt;
    .in0(in0),&lt;br /&gt;
    .in1(in1),&lt;br /&gt;
    .sum(sum)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  Display7Seg DISPLAY(&lt;br /&gt;
    .in(sum),&lt;br /&gt;
    .out(displayCode)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Add_and_display.PNG&amp;diff=6887</id>
		<title>Fișier:Add and display.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Add_and_display.PNG&amp;diff=6887"/>
		<updated>2021-03-21T13:58:39Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Fpga_connections.PNG&amp;diff=6886</id>
		<title>Fișier:Fpga connections.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Fpga_connections.PNG&amp;diff=6886"/>
		<updated>2021-03-21T13:51:47Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6885</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6885"/>
		<updated>2021-03-21T13:50:17Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire   pe   4   biti,   reprezentand   continuturile   memoriei   ROM   corespunzatoare   fiecarei combinatii de la intrare.&lt;br /&gt;
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea pe FPGA:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.&lt;br /&gt;
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Semnal&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Dispozitiv&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;PIN&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[0] || SW0 || AB12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| in[1] || SW1 || AC12&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[0] || LEDR0 || V16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[1] || LEDR1 || W16&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[2] || LEDR2 || V17&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| out[3] || LEDR3 || V18&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6884</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6884"/>
		<updated>2021-03-21T13:45:53Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM–Introducere == &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am  intalnit memoria  ROM in  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici,  adresa  are  dimensiunea  de  4  biti,  asadar  putem  accesa  cu  aceasta  16  locatii  diferite  de memorie. Dimensiunea  fiecarei  locatii este  de  8  biti, asadar  fiecare  locatie  de  memorie  poate  stoca numere  de  8  biti.  Spunem ca  memoria  ROM este  o memorie 4x8.  Capacitatea acestei memorii  este de 16 x 8 biti = 128 biti.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea  comportamentala  a  unui decodor,  testarea  acestuia  prin  simulare  si  sinteza  pe FPGA.&lt;br /&gt;
&lt;br /&gt;
Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca o memorie ROM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input [1:0] in,&lt;br /&gt;
  output reg [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always@(in) begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001;&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010;&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100;&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000;&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  reg [1:0] in_t;&lt;br /&gt;
  wire [3:0] out_t;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Decoder.PNG&amp;diff=6883</id>
		<title>Fișier:Decoder.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Decoder.PNG&amp;diff=6883"/>
		<updated>2021-03-21T13:41:04Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:ROM_memory.PNG&amp;diff=6882</id>
		<title>Fișier:ROM memory.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:ROM_memory.PNG&amp;diff=6882"/>
		<updated>2021-03-21T13:32:28Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6881</id>
		<title>CID Aplicatii 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_4&amp;diff=6881"/>
		<updated>2021-03-21T13:30:22Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Pagină nouă: Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si di...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memoria  ROM(Read-Only  Memory)este  un  circuit  combinationalfolosit  pentru  stocarea  unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata. &lt;br /&gt;
&lt;br /&gt;
Pentru  a  intelege  termenul  de  memorie,  putem  face  urmatorul  exercitiude  imaginatie:  sa  ne gandim  la  un  dulap  cu  mai  multe  sertare.  Continutul  memoriei  este  reprezentat  de  continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Am  intalnit memoria  ROMin  aplicatiile anterioare, atunci  cand  am vorbit  despre  structura  unui FPGA. Am vazut  atunci cafunctiile logice erau implementate pe  FPGA prin intermediul unor LUT-uri (memorii  ROM),  care  stocau  iesirile  corespunzatoare  unor  combinatii  de  intrari.  Asadar,  in  cazul acela,   adreseleerau   reprezentate   de combinatii   ale   intrarilor,   iar   continutul   memoriei   era reprezentat de iesirile aferente acestor combinatii. &lt;br /&gt;
&lt;br /&gt;
O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de  locatii  de  memorie  (cu  n  biti  de  adresa  putem  forma 2𝑛combinatii  diferite,  deci  putem  accesa maxim 2𝑛locatii  de  memorie)  si  dimensiunea  locatiei  de  memorie,  care  ne  spune  cat  de  multa informatie poate stoca o locatie de memorie.&lt;br /&gt;
&lt;br /&gt;
Sa urmarim exemplul din figura urmatoare:&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6862</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6862"/>
		<updated>2021-03-08T18:02:38Z</updated>

		<summary type="html">&lt;p&gt;Sduda: /* Exemplul 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;wire&amp;#039;&amp;#039; sunt folosite pentru a conecta elemente dintr-un design. Acestea pot fi citite sau asignate, insa nu pot stoca valori&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; sunt folosite pentru a stoca date.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
Descrieti structural circuitul reprezentat mai jos si creati pentru acesta un modul de test.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tipul de date &amp;#039;&amp;#039;integer&amp;#039;&amp;#039; este reprezinta o variabila de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; definit pe 32 de biti (&amp;#039;&amp;#039;reg[31:0]&amp;#039;&amp;#039; )&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;initial&amp;#039;&amp;#039; se executa intotdeauna la timpul 0 al simularii. In cazul in care sunt definite mai multe blocuri initial, acestea se vor executa in paralel.&lt;br /&gt;
* &amp;#039;&amp;#039; `timescale&amp;#039;&amp;#039; este o directiva de preprocesare care ii indica simulatorului unitatea default de masurarea a timpului si precizia pasului de simulare. In cazul de mai sus &amp;#039;&amp;#039;`timescale 1ns/1ps&amp;#039;&amp;#039; inseamna ca precizia de simulare este 1ps, iar unitate de masura a timpului este in ns.&lt;br /&gt;
* Pentru a astepta un anumit interval de tip se pot folosi instructiuni de intarziere:&lt;br /&gt;
** &amp;#039;&amp;#039;#1;&amp;#039;&amp;#039; - Asteapta o unitate de timp (conform celei specificate in directiva &amp;#039;&amp;#039;`timescale&amp;#039;&amp;#039;) Intarzierile cu &amp;quot;#&amp;quot; nu sunt recomandate in testarea circuitelor secventiale.  Exemple:&lt;br /&gt;
** &amp;#039;&amp;#039;#5ns;&amp;#039;&amp;#039; - Asteapta 5 nanosecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#12us;&amp;#039;&amp;#039; - Asteapta 12 microsecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#1s;&amp;#039;&amp;#039; - Asteapta o secunda&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
Descrieti functional circuitul anterior cu ajutorul operatorilor Verilog si realizati un modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1,&lt;br /&gt;
  input sel&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Functia de sistem &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; este folosita pentru a printa mesaje in consola. Aceasta are sintaxa similara cu function &amp;#039;&amp;#039;printf&amp;#039;&amp;#039; din C. Aceasta este nesintetizabila si nu ar trebui folosita in modulele proiectate decat pentru debug. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
Descrieti comportamental acelasi circuit, folosind blocurile assign conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;always&amp;#039;&amp;#039; descrie un comportament repetitiv. Acesta se executa atunci cand se schimba un element din lista de senzitivitate &amp;quot;@(...)&amp;quot;. In functie de semnalele definite in lista de senzitivitate, blocul always poate avea atat comportament combinational, cat si secvential (vezi [[Verilog]] pentru mai multe detalii).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti un modul de test pentru un sumator pe 4 biti, descris cu ajutorul Verilog astfel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti un modul de test pentru un comparator pe 8 biti, descris cu ajutorul Verilog astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module comp(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates2.png&amp;diff=6861</id>
		<title>Fișier:Gates2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates2.png&amp;diff=6861"/>
		<updated>2021-03-08T18:02:07Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6860</id>
		<title>Fișier:Gates.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6860"/>
		<updated>2021-03-08T17:52:36Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Sduda a încărcat o versiune nouă pentru Fișier:Gates.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Descriere fișier ==&lt;br /&gt;
Aplicatii CID 2&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6853</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6853"/>
		<updated>2021-03-07T10:57:44Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;wire&amp;#039;&amp;#039; sunt folosite pentru a conecta elemente dintr-un design. Acestea pot fi citite sau asignate, insa nu pot stoca valori&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; sunt folosite pentru a stoca date.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tipul de date &amp;#039;&amp;#039;integer&amp;#039;&amp;#039; este reprezinta o variabila de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; definit pe 32 de biti (&amp;#039;&amp;#039;reg[31:0]&amp;#039;&amp;#039; )&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;initial&amp;#039;&amp;#039; se executa intotdeauna la timpul 0 al simularii. In cazul in care sunt definite mai multe blocuri initial, acestea se vor executa in paralel.&lt;br /&gt;
* &amp;#039;&amp;#039; `timescale&amp;#039;&amp;#039; este o directiva de preprocesare care ii indica simulatorului unitatea default de masurarea a timpului si precizia pasului de simulare. In cazul de mai sus &amp;#039;&amp;#039;`timescale 1ns/1ps&amp;#039;&amp;#039; inseamna ca precizia de simulare este 1ps, iar unitate de masura a timpului este in ns.&lt;br /&gt;
* Pentru a astepta un anumit interval de tip se pot folosi instructiuni de intarziere:&lt;br /&gt;
** &amp;#039;&amp;#039;#1;&amp;#039;&amp;#039; - Asteapta o unitate de timp (conform celei specificate in directiva &amp;#039;&amp;#039;`timescale&amp;#039;&amp;#039;) Intarzierile cu &amp;quot;#&amp;quot; nu sunt recomandate in testarea circuitelor secventiale.  Exemple:&lt;br /&gt;
** &amp;#039;&amp;#039;#5ns;&amp;#039;&amp;#039; - Asteapta 5 nanosecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#12us;&amp;#039;&amp;#039; - Asteapta 12 microsecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#1s;&amp;#039;&amp;#039; - Asteapta o secunda&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Functia de sistem &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; este folosita pentru a printa mesaje in consola. Aceasta are sintaxa similara cu function &amp;#039;&amp;#039;printf&amp;#039;&amp;#039; din C. Aceasta este nesintetizabila si nu ar trebui folosita in modulele proiectate decat pentru debug. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;always&amp;#039;&amp;#039; descrie un comportament repetitiv. Acesta se executa atunci cand se schimba un element din lista de senzitivitate &amp;quot;@(...)&amp;quot;. In functie de semnalele definite in lista de senzitivitate, blocul always poate avea atat comportament combinational, cat si secvential (vezi [[Verilog]] pentru mai multe detalii).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti modulul de test pentru un sumator pe 4 biti care are urmatoarea definitie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti modulul de test pentru un comparator pe 8 biti;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6852</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6852"/>
		<updated>2021-03-07T10:34:54Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;wire&amp;#039;&amp;#039; sunt folosite pentru a conecta elemente dintr-un design. Acestea pot fi citite sau asignate, insa nu pot stoca valori&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; sunt folosite pentru a stoca date.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tipul de date &amp;#039;&amp;#039;integer&amp;#039;&amp;#039; este reprezinta o variabila de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; definit pe 32 de biti (&amp;#039;&amp;#039;reg[31:0]&amp;#039;&amp;#039; )&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;initial&amp;#039;&amp;#039; se executa intotdeauna la timpul 0 al simularii. In cazul in care sunt definite mai multe blocuri initial, acestea se vor executa in paralel.&lt;br /&gt;
* &amp;#039;&amp;#039; `timescale&amp;#039;&amp;#039; este o directiva de preprocesare care ii indica simulatorului unitatea default de masurarea a timpului si precizia pasului de simulare. In cazul de mai sus &amp;#039;&amp;#039;`timescale 1ns/1ps&amp;#039;&amp;#039; inseamna ca precizia de simulare este 1ps, iar unitate de masura a timpului este in ns.&lt;br /&gt;
* Pentru a astepta un anumit interval de tip se pot folosi instructiuni de intarziere:&lt;br /&gt;
** &amp;#039;&amp;#039;#1;&amp;#039;&amp;#039; - Asteapta o unitate de timp (conform celei specificate in directiva &amp;#039;&amp;#039;`timescale&amp;#039;&amp;#039;) Intarzierile cu &amp;quot;#&amp;quot; nu sunt recomandate in testarea circuitelor secventiale.  Exemple:&lt;br /&gt;
** &amp;#039;&amp;#039;#5ns;&amp;#039;&amp;#039; - Asteapta 5 nanosecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#12us;&amp;#039;&amp;#039; - Asteapta 12 microsecunde&lt;br /&gt;
** &amp;#039;&amp;#039;#1s;&amp;#039;&amp;#039; - Asteapta o secunda&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Functia de sistem &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; este folosita pentru a printa mesaje in consola. Aceasta are sintaxa similara cu function &amp;#039;&amp;#039;printf&amp;#039;&amp;#039; din C. Aceasta este nesintetizabila si nu ar trebui folosita in modulele proiectate decat pentru debug. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;always&amp;#039;&amp;#039; descrie un comportament repetitiv. Acesta se executa atunci cand se schimba un element din lista de senzitivitate &amp;quot;@(...)&amp;quot;. In functie de semnalele definite in lista de senzitivitate, blocul always poate avea atat comportament combinational, cat so secvential (vezi [[Verilog]] pentru mai multe detalii).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti modulul de test pentru un sumator pe 4 biti care are urmatoarea definitie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti modulul de test pentru un comparator pe 8 biti;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6851</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6851"/>
		<updated>2021-03-07T10:32:55Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;wire&amp;#039;&amp;#039; sunt folosite pentru a conecta elemente dintr-un design. Acestea pot fi citite sau asignate, insa nu pot stoca valori&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; sunt folosite pentru a stoca date.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tipul de date &amp;#039;&amp;#039;integer&amp;#039;&amp;#039; este reprezinta o variabila de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; definit pe 32 de biti (&amp;#039;&amp;#039;reg[31:0]&amp;#039;&amp;#039; )&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;initial&amp;#039;&amp;#039; se executa intotdeauna la timpul 0 al simularii. In cazul in care sunt definite mai multe blocuri initial, acestea se vor executa in paralel.&lt;br /&gt;
* &amp;#039;&amp;#039; `timescale&amp;#039;&amp;#039; este o directiva de preprocesare care ii indica simulatorului unitatea default de masurarea a timpului si precizia pasului de simulare. In cazul de mai sus &amp;#039;&amp;#039;`timescale 1ns/1ps&amp;#039;&amp;#039; inseamna ca precizia de simulare este 1ps, iar unitate de masura a timpului este in ns.&lt;br /&gt;
* Pentru a astepta un anumit interval de tip se pot folosi instructiuni de intarziere:&lt;br /&gt;
** &amp;#039;&amp;#039;#1;&amp;#039;&amp;#039; - Asteapta o unitate de timp (conform celei specificate in directiva &amp;#039;&amp;#039;`timescale&amp;#039;&amp;#039;) Intarzierile cu &amp;quot;#&amp;quot; nu sunt recomandate in testarea circuitelor secventiale.  Exemple:&lt;br /&gt;
** &amp;#039;&amp;#039;#5ns;&amp;#039;&amp;#039; - Asteapta 5 nanosecunda&lt;br /&gt;
** &amp;#039;&amp;#039;#12us;&amp;#039;&amp;#039; - Asteapta 12 microsecunda&lt;br /&gt;
** &amp;#039;&amp;#039;#1s;&amp;#039;&amp;#039; - Asteapta 1 secunda&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Functia de sistem &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; este folosita pentru a printa mesaje in consola. Aceasta are sintaxa similara cu function &amp;#039;&amp;#039;printf&amp;#039;&amp;#039; din C. Aceasta este nesintetizabila si nu ar trebui folosita in modulele proiectate decat pentru debug. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;always&amp;#039;&amp;#039; descrie un comportament repetitiv. Acesta se executa atunci cand se schimba un element din lista de senzitivitate &amp;quot;@(...)&amp;quot;. In functie de semnalele definite in lista de senzitivitate, blocul always poate avea atat comportament combinational, cat so secvential (vezi [[Verilog]] pentru mai multe detalii).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti modulul de test pentru un sumator pe 4 biti care are urmatoarea definitie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti modulul de test pentru un comparator pe 8 biti;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6850</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6850"/>
		<updated>2021-03-07T10:32:02Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;wire&amp;#039;&amp;#039; sunt folosite pentru a conecta elemente dintr-un design. Acestea pot fi citite sau asignate, insa nu pot stoca valori&lt;br /&gt;
* Variabilele de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; sunt folosite pentru a stoca date.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notiuni de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tipul de date &amp;#039;&amp;#039;integer&amp;#039;&amp;#039; este reprezinta o variabila de tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; definit pe 32 de biti (&amp;#039;&amp;#039;reg[31:0]&amp;#039;&amp;#039; )&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;initial&amp;#039;&amp;#039; se executa intotdeauna la timpul 0 al simularii. In cazul in care sunt definite mai multe blocuri initial, acestea se vor executa in paralel.&lt;br /&gt;
* &amp;#039;&amp;#039; `timescale&amp;#039;&amp;#039; este o directiva de preprocesare care ii indica simulatorului unitatea default de masurarea a timpului si precizia pasului de simulare. In cazul de mai sus &amp;#039;&amp;#039;`timescale 1ns/1ps&amp;#039;&amp;#039; inseamna ca precizia de simulare este 1ps, iar unitate de masura a timpului este in ns.&lt;br /&gt;
* Pentru a astepta un anumit interval de tip se pot folosi instructiuni de intarziere:&lt;br /&gt;
** &amp;#039;&amp;#039;#1;&amp;#039;&amp;#039; - Asteapta o unitate de timp (conform celei specificate in directiva &amp;#039;&amp;#039;`timescale&amp;#039;&amp;#039;) Intarzierile cu &amp;quot;#&amp;quot; nu sunt recomandate in testarea circuitelor secventiale.  Exemple:&lt;br /&gt;
** &amp;#039;&amp;#039;#5ns;&amp;#039;&amp;#039; - Asteapta 5 nanosecunda&lt;br /&gt;
** &amp;#039;&amp;#039;#12us;&amp;#039;&amp;#039; - Asteapta 12 microsecunda&lt;br /&gt;
** &amp;#039;&amp;#039;#1s;&amp;#039;&amp;#039; - Asteapta 1 secunda&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Functia de sistem &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; este folosita pentru a printa in consola mesaje. Aceasta are sintaxa similara cu function &amp;#039;&amp;#039;printf&amp;#039;&amp;#039; din C. Aceasta este nesintetizabila si nu ar trebui folosita in modulele proiectate decat pentru debug. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Elemente de sintaxa&amp;#039;&amp;#039;&lt;br /&gt;
* Blocul &amp;#039;&amp;#039;always&amp;#039;&amp;#039; descrie un comportament repetitiv. Acesta se executa atunci cand se schimba un element din lista de senzitivitate &amp;quot;@(...)&amp;quot;. In functie de semnalele definite in lista de senzitivitate, blocul always poate avea atat comportament combinational, cat so secvential (vezi [[Verilog]] pentru mai multe detalii).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti modulul de test pentru un sumator pe 4 biti care are urmatoarea definitie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti modulul de test pentru un comparator pe 8 biti;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6849</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6849"/>
		<updated>2021-03-07T09:51:40Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris, prin  simulare, si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora. Ideea generala a unui modul de  test este  descrisa in figura de  mai jos (consideram un circuit cu numele circuit si modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiri si nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si, optional,  un  bloc  de  evaluare automata  a  rezultatului. Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip reg pentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conecta automat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip for care variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului). In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie– consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0. Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumi exemplul3.&lt;br /&gt;
&lt;br /&gt;
== Exercitii suplimentare ==&lt;br /&gt;
1. Scrieti modulul de test pentru un sumator pe 4 biti care are urmatoarea definitie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output[4:0] sum,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign sum = a + b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Scrieti modulul de test pentru un comparator pe 8 biti;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sum(&lt;br /&gt;
  input[3:0] a,&lt;br /&gt;
  input[3:0] b,&lt;br /&gt;
  output lt,&lt;br /&gt;
  output gt,&lt;br /&gt;
  output eq,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  assign lt = a &amp;lt; b;&lt;br /&gt;
  assign gt = a &amp;gt; b;&lt;br /&gt;
  assign eq = a == b;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6848</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6848"/>
		<updated>2021-03-06T23:21:41Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris,prin  simulare,si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora.Ideea generala a unui modul de  test este  descrisa in figura de  mai jos(consideram un circuit cu numele circuitsi modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiresi nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si,optional,  un  bloc  de  evaluare automata  a  rezultatului.Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.o&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip regpentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Gates.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conectaautomat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip forcare variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului).In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie –consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0.Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumii exemplul3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6847</id>
		<title>Fișier:Gates.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6847"/>
		<updated>2021-03-06T23:21:23Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Sduda a încărcat o versiune nouă pentru Fișier:Gates.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Descriere fișier ==&lt;br /&gt;
Aplicatii CID 2&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6846</id>
		<title>Fișier:Gates.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Gates.png&amp;diff=6846"/>
		<updated>2021-03-06T23:17:53Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Aplicatii CID 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Descriere fișier ==&lt;br /&gt;
Aplicatii CID 2&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6845</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6845"/>
		<updated>2021-03-06T23:04:25Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris,prin  simulare,si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora.Ideea generala a unui modul de  test este  descrisa in figura de  mai jos(consideram un circuit cu numele circuitsi modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Circuit_TB.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiresi nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si,optional,  un  bloc  de  evaluare automata  a  rezultatului.Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.o&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip regpentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta&lt;br /&gt;
&lt;br /&gt;
TODO: Insert image &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conectaautomat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip forcare variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului).In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie –consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0.Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumii exemplul3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Circuit_TB.PNG&amp;diff=6844</id>
		<title>Fișier:Circuit TB.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Circuit_TB.PNG&amp;diff=6844"/>
		<updated>2021-03-06T23:01:17Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Folosit in CID Aplicatii 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Descriere fișier ==&lt;br /&gt;
Folosit in CID Aplicatii 2&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6843</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6843"/>
		<updated>2021-03-06T22:57:13Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris,prin  simulare,si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora.Ideea generala a unui modul de  test este  descrisa in figura de  mai jos(consideram un circuit cu numele circuitsi modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
TODO: Insert image &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiresi nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si,optional,  un  bloc  de  evaluare automata  a  rezultatului.Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.o&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuri initial,  trebuie  sa definim cate un semnal de test de tip regpentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluat mai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta&lt;br /&gt;
&lt;br /&gt;
TODO: Insert image &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conectaautomat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip forcare variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului).In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea functionala a aceluiasi circuit cu ajutorul operatorilor Verilog si realizarea unui modul de test cu evaluare automata.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul2(output out,input in0,input in1,input sel);&lt;br /&gt;
&lt;br /&gt;
  assign out = ((~sel) &amp;amp; in0) | (sel &amp;amp; in1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul2_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx; //index for loop&lt;br /&gt;
  reg flag; //test status flag&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    flag = 0;&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1)  begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
      if(((sel_t == 0) &amp;amp;&amp;amp; (out_t == in0_t)) || ((sel_t == 1) &amp;amp;&amp;amp; (out_t == in1_t))) begin &lt;br /&gt;
      end else begin&lt;br /&gt;
        flag = 1; &lt;br /&gt;
        $display(&amp;quot;TEST_FAIL at sel = %b, in0 = %b, in1 = %b, out = %b&amp;quot;, sel_t, in0_t, in1_t, out_t);&lt;br /&gt;
      end &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if(flag == 0)&lt;br /&gt;
      $display(&amp;quot;TEST_PASS&amp;quot;);&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul2 dut(&lt;br /&gt;
    .in0(in0_t),&lt;br /&gt;
    .in1(in1_t),&lt;br /&gt;
    .sel(sel_t),&lt;br /&gt;
    .out(out_t));&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru  modulul  de  test: Pe  langa  generarea  semnalelor  de  test,  observam  ca  la  fiecare  pas testam  corectitudinea  iesirii.  Asa  cum  am  observat,  circuitul  realizeaza  urmatoarea  functie: atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 0, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in0&amp;#039;&amp;#039;, iar atunci cand &amp;#039;&amp;#039;sel&amp;#039;&amp;#039; este 1, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; va fi egal cu &amp;#039;&amp;#039;in1&amp;#039;&amp;#039;. Ne vom folosi de acest lucru pentru evaluarea automata.&lt;br /&gt;
* Consideram  un  fanion &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;,  de  tip &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; deoarece  isi  va  modifica  valoarea  intr-un  bloc &amp;#039;&amp;#039;initial&amp;#039;&amp;#039;,  pe  care  il  vom  initializa  cu  0  (prezumtia  de  nevinovatie –consideram  initial circuitul corect). Testam conditia de corectitudine la fiecare pas de generare a semnalelor de test (la fiecare iteratie a buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) si daca ea este indeplinita, nimic nu se intampla cu &amp;#039;&amp;#039;flag&amp;#039;&amp;#039;, ramanand  0.Daca  acesta  conditie  nu  este  indeplinita  cel  putin  o  data, &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; se  va  face  1, semnalizand   ca   apare   cel   putin   un   caz   incorect, afisandu-se totodata in   consola   cu &amp;#039;&amp;#039;$display&amp;#039;&amp;#039; mesajul  TEST_FAIL  si  starea  semnalelor  in  momentul  acestuia.  La  iesirea  din bucla  testam  din  nou  fanionul  si  daca  acesta  este  0,  inseamna  ca  nu  a  aparut  nici  macar  un caz incorect, afisand in cazul acesta mesajul TEST_PASS.&lt;br /&gt;
* Instantierea modulului testat se face astfel: &lt;br /&gt;
               &amp;#039;&amp;#039;.semnal_interfata_modul_testat(semnalul_la care_va_fi_conectat)&amp;#039;&amp;#039;&lt;br /&gt;
Aceasta modalitate ne ofera controlul asupra conexiunilor, fara constrangeri de ordine.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 3==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop:&amp;#039;&amp;#039;&amp;#039; Descrierea  comportamentala  a  aceluiasi  circuit  cu  ajutorul  blocurilor  assign  conditionat, always + if si always + case.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  assign out = (sel == 0) ? in0 : in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;if&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(in0 or in1 or sel) begin&lt;br /&gt;
    if(sel == 0)&lt;br /&gt;
      out = in0;&lt;br /&gt;
    else&lt;br /&gt;
      out = in1;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039; Folosing &amp;#039;&amp;#039;always&amp;#039;&amp;#039; si &amp;#039;&amp;#039;case&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul3(&lt;br /&gt;
  output out,&lt;br /&gt;
  input in0,&lt;br /&gt;
  input in1, &lt;br /&gt;
  input sel&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  always@(*) begin&lt;br /&gt;
    case(sel)&lt;br /&gt;
      1&amp;#039;b0: out = in0;&lt;br /&gt;
      1&amp;#039;b1: out = in1;&lt;br /&gt;
      default: out = in0;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* In primul caz, &amp;#039;&amp;#039;assign&amp;#039;&amp;#039; conditionat are o sintaxa asemanatoare cu cea a limbajului C: &lt;br /&gt;
         &amp;#039;&amp;#039;(conditie) ? semnalul_cond_indeplinita : semnal_cond_neindeplinita; &amp;#039;&amp;#039; &lt;br /&gt;
* In  cazul  2,  folosind  un  bloc &amp;#039;&amp;#039;always&amp;#039;&amp;#039; pentru  actualizarea  semnalului &amp;#039;&amp;#039;out&amp;#039;&amp;#039;,  acesta  trebuie declarat  ca &amp;#039;&amp;#039;reg&amp;#039;&amp;#039; (&amp;#039;&amp;#039;output reg out&amp;#039;&amp;#039;). In  interiorul  parantezelor  blocului &amp;#039;&amp;#039;always&amp;#039;&amp;#039; punem lista  de  semnale la care  acesta va fi sensibil. Fiind un circuit combinational, &amp;#039;&amp;#039;out&amp;#039;&amp;#039; trebuie sa fie  sensibil imediat la  toate  semnalele  care  il  influenteaza. Putem  inlocui  toata  aceasta  lista cu *. Asta ne asigura ca nu am omis niciun semnal.&lt;br /&gt;
* In  cazul  3,  folosim  *  pentru  lista  de  senzitivitati  a  circuitului  si  un  bloc case.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039;  Desi aici este clar ca am acoperit toate combinatiile posibile ale lui sel(0 si 1), pentru combinatii complexe este posibil sa omitem cazuri si astfel circuitul nostru se va transforma intr-unul de memorare. Ca sa evitam acest lucru, definim si un caz default.&lt;br /&gt;
* Se  poate  folosi modulul  de  test  anterior  pentru  testare,  cu  observatia  ca modulul  instantiat se va denumii exemplul3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6842</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6842"/>
		<updated>2021-03-06T22:34:49Z</updated>

		<summary type="html">&lt;p&gt;Sduda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Module de test - Introducere==&lt;br /&gt;
Modulul  de   test  este  folosit  pentru  testarea   circuitului  descris,prin  simulare,si  nu  este sintetizabil. Simularea permite detectia rapida a erorilor de implementare si corectarea acestora.Ideea generala a unui modul de  test este  descrisa in figura de  mai jos(consideram un circuit cu numele circuitsi modulul sau de test circuit_TB):&lt;br /&gt;
&lt;br /&gt;
TODO: Insert image &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Modulul de test NU are intrari sau iesiresi nu este sintetizabil. Toate procesele au loc in interiorul acestuia.&lt;br /&gt;
* Modulul de test are in principal urmatoarele componente: o instantiere a modulului testat  (circuit),  un  generator  de  semnale  de  test  si,optional,  un  bloc  de  evaluare automata  a  rezultatului.Aceasta  evaluare  automata  devine  insa  obligatorie  pentru circuitele complexe.o&lt;br /&gt;
* Generatorul  de  semnale  de  test  va  genera  cate  un  semnal  pentru  fiecare  intrare  a circuitului.  Tinand  cont  ca  aceasta  generare  se  face in  blocuriinitial,  trebuie  sa definim cate un semnal de test de tip regpentru fiecare intrare a modulului testat.&lt;br /&gt;
* Pentru fiecare iesire a modulului testat, definim cate un semnal de tip wire. Acesta poate fi evaluatmai departe intr-un bloc de evaluare automata.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scop&amp;#039;&amp;#039;&amp;#039;: Descrierea structurala a unui circuit simplu si realizarea unui modul de test pentru acesta&lt;br /&gt;
&lt;br /&gt;
TODO: Insert image &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module exemplul1(out, in0, in1, sel);&lt;br /&gt;
&lt;br /&gt;
  output out;&lt;br /&gt;
  input in0;&lt;br /&gt;
  input in1;&lt;br /&gt;
  input sel;&lt;br /&gt;
  wire w1, w2, w3;&lt;br /&gt;
&lt;br /&gt;
  not inverter_gate(w1, sel);&lt;br /&gt;
  and and_gate1(w2, in0, w1);&lt;br /&gt;
  and and_gate2(w3, sel, in1);&lt;br /&gt;
  or or_gate(out, w2, w3);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module exemplul1_TB();&lt;br /&gt;
&lt;br /&gt;
  reg in0_t, in1_t, sel_t;&lt;br /&gt;
  wire out_t;&lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;8;idx=idx+1) begin&lt;br /&gt;
      in0_t = idx[0];&lt;br /&gt;
      in1_t = idx[1];&lt;br /&gt;
      sel_t = idx[2];&lt;br /&gt;
      #1;&lt;br /&gt;
    end  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  exemplul1DUT(out_t, in0_t, in1_t, sel_t);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Modulul  exemplul1  este  implementat  folosind  instantieri  ale  portilor  logice  predefinite  in Verilog. &lt;br /&gt;
* Instantierea, in general, se face astfel: tip_modul nume_modul (...intefata...). In cazul nostru, interfatarea  se  face  implicit  prin  ordine:  punem  semnalele  la  care  modulul  trebuie  sa  se conecteze in ordine si acestea se vor conectaautomat. Pentru portile logice, interfata este de tipul (out, in0, in1, ....).&lt;br /&gt;
* Acest   mod   de   interfatare   este  oarecum   acceptat   pentru  modulele   foarte   simple, dar nerecomandat  pentru  modulele  complexe,  unde  gresirea  ordinii  duce  la  implementarea gresita a circuitelor.&lt;br /&gt;
* Pentru modulul de test(exemplul1_TB), observam ca interfata acestuia este goala (nu exista intrari sau iesiri).&lt;br /&gt;
* De  asemenea,  pentru  fiecare  intrare  a  modulului  testat  se  defineste  un  semnal  de  tip reg, iar  pentru  fiecare  iesire  se  defineste  un  semnal  de  tip wire.  &amp;#039;&amp;#039;&amp;#039;Atentie!&amp;#039;&amp;#039;&amp;#039; Dimensiunea  acestor semnale trebuie sa corespunda cu dimensiunea semnalelor din interfata modului la care vor fi legate.&lt;br /&gt;
* Generarea semnalelor de test a fost facuta cu ajutorul unei bucle de tip forcare variaza un index  intre  0  si  7  (generam  astfel  toate  variantele  de  biti  pentru  cele  trei  semnale  de  1  bit: sel_t, in0_tsi in1_t, fiecare legandu-se la un bit al indexului).In  instantierea  modulului  exemplu1  observam  din  nou  interfatarea  implicita  prin  ordine. &lt;br /&gt;
* Analizand  ordinea  semnalelor  din  interfata  modulului  exemplul1  si  ordinea  legaturilor  din instantierea acestuia in exemplul1_TB, out_t se va lega la out, sel_tla sel, in0_tla in0 si in1_t la in1.&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6841</id>
		<title>CID Aplicatii 2</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_2&amp;diff=6841"/>
		<updated>2021-03-06T16:24:59Z</updated>

		<summary type="html">&lt;p&gt;Sduda: Pagină nouă: Work in progress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Work in progress&lt;/div&gt;</summary>
		<author><name>Sduda</name></author>
	</entry>
</feed>