130 likes | 273 Views
LIMBAJE DE DESCRIERE HARDWARE - L A B O R A T O R -. Dan NICULA Universitatea TRANSILVANIA din Bra ş ov Catedra de Electronic ă ş i Calculatoare E-mail dan.nicula@vega.unitbv.ro URL http://vega.unitbv.ro/~nicula. Probleme. Explicați comportamentul specificației:
E N D
LIMBAJE DE DESCRIERE HARDWARE- L A B O R A T O R - Dan NICULA Universitatea TRANSILVANIA din Braşov Catedra de Electronicăşi Calculatoare E-mail dan.nicula@vega.unitbv.ro URL http://vega.unitbv.ro/~nicula (C) 2010 Dan NICULA
Probleme • Explicați comportamentul specificației: always @(a or b or c) e = (a | b) & (c | d); • Scrieți un mediu de test, depistați și corectați eroarea din codul următor: if (i > 0) if (i < 2) $display (“i = 1”); else$display (“i < 0”); • Scrieți cod pentru test pentru cele 4 cazuri prezentate și afișați valoarea lui a la momentul de timp 0 și 1. Explicați diferențele prin simulare. reg a; reg a; reg a; reg a; initial initial initial initial begin begin begin begin a = 0; #0 a = 0; a <= 0; #1 a = 0; a = a + 1; #0 a = a + 1; a <= a + 1; #1 a = a + 1; end end end end
Probleme • Scrieți cod pentru test pentru cele 4 cazuri prezentate și afișați valoarea lui outpla momentul de timp 0 și 10. Explicați diferențele prin simulare. reg outp; reg outp; reg outp; reg outp; always always always always begin begin begin begin #10 outp = 0; outp = #10 0; #10 outp = 0; #10 outp <= 0; #10 outp = 1; outp = #10 1; #10 outp <= 1; #10 outp = 1; end end end end • Construiți modelul unui semisumator pe baza primitivei. Aplicați intrări necunoscute. Care este starea ieșirii? primtive adder (sum, inA, inB); output sum; input inA, inB; table 00 : 0; 01 : 1; 10 : 1; 11 : 0; endtable endprimitive
Probleme • Simulați și explicați comportamentul operatorilor unari. module unary; module unary; module unary; module unary; reg[4:0]u; wire u; wireu; wireu; initial u=!’b011z; assign u=!’b011z; assign u=!’b011z; assign u=&’b1 initial initial initial initial $display(“%b”, u); $display(“%b”, u); $display(“%b”, u); $display(“%b”, u); endmodule endmodule endmodule endmodule Răspuns așteptat: 000x z x 0 • Explicați de ce bistabilul nu funcționează: module Dff_Res_Bad(D,Q,Clock,Reset); output Q; input D,Clock,Reset; reg Q; wire D; always @(posedge Clock) if (Reset !== 1) Q = D; always if (Reset == 1) Q = 0; endmodule
Probleme • Explicați funcționarea bistabilul cu facilități de scanare (caracteristică utilizată pentru testatibilitate): module DFFSCAN (D, Q, Clk, Rst, ScEn, ScIn, ScOut); parameter width = 1, reset_value = 0; input [width-1:0] D; output [width-1:0] Q; reg [width-1:0] Q; inputClk,Rst,ScEn,ScIn; output ScOut; initial Q = {width{1'bx}}; always @(posedge Clk ornegedge Rst) begin if (~Rst) Q <= #1 reset_value; else if (ScEn) Q <= #1 {Q, ScIn}; else Q <= #1 D; end assign ScOut = Q[width-1]; endmodule
Probleme • Explicați funcționarea modelului de pad bidirecțional. module PadBidir (C, Pad, I, Oen); // active low enable parameter width=1; output [width-1:0] C; inout [width-1:0] Pad; input [width-1:0] I; input Oen; assign #1 Pad = Oen ? {width{1'bz}} : I; assign #1 C = Pad; endmodule
Probleme • Explicați și corectați eroarea prezentă în următoarea porțiune de cod. module Loop_Bad; reg [3:0] i; reg [31:0] DBus; initial DBus = 0; initialbegin #1; for (i=0; i<=15; i=i+1) DBus[i]=1; end initialbegin $display("DBus = %b",DBus); #2; $display("DBus = %b",DBus); $stop; end endmodule
Probleme • Explicați următoarele. integer IntA; IntA = -12 / 3; // rezultat -4 IntA = -'d 12 / 3; // rezultat 1431655761 • Determinați și explicați valorile pentru intAșiregAdupă fiecare atribuire din codul următor: integer intA; reg [15:0] regA; intA = -4'd12; regA = intA/3; regA = -4'd12; intA = regA/3; intA = -4'd12/3; regA = -12/3;
Probleme • Considerați următoarele specificații: reg [7:0] a, b, sum; sum = (a + b) >> 1; • Intenția este de a aduna a cu b. Acest lucru ar putea genera depășire, apoi să se facă o deplasare drepta cu intenția de a păstra bitul de transport.Însă, deoarece toți operanzii sunt reprezentanți pe 8 biți, expresia(a + b)va avea doar 8 biți, iar bitul de tranport va fi pierdut înainte de a face deplasarea la dreapta.O soluție este ca expresia (a + b)să fie reprezentată pe minim 9 biți. De exemplu, adunând o valoare întreagă 0, se va forța ca rezultatul să fie reprezentat ca întreg. Verificați dacă alternativele de mai jos produc efectul dorit. sum = (a + b + 0) >> 1; sum = {0,a} + {0,b} >> 1;
Probleme • Tabelul de mai jos prezintă diverse modalități de modelare a unui registru de deplasare de 2 biți. Verificați prin simulare corectitudinea acestor modele.
Probleme • Proiectați un model pentru un semafor. Frecvența ceasului de intrare este de 1MHz. Semaforul are următorul ciclu:verde (60 s), galben (1 s), roșu (60 s). • Modificați modelul pentru a avea următorul ciclu: roșu (60 s), roșu+galben (5 s), verde (60 s), galben(10 s). • Modificați modelul pentru a admite un ciclu programabil.
Probleme • Proiectați un numărător de 9 biți având următoarea interfață. Numărătorul trebuie să funcționeze la frecvență maximă într-o implementare pe FPGA Spartan3E. module counter (data_in, up, down, clock, count_out, carry_out, borrow_out, parity_out); output [8:0] count_out; outputcarry_out, borrow_out, parity_out; input [8:0] data_in; input clock, up, down; reg [8:0] count_out; reg carry_out, borrow_out, parity_out; // codul aici... endmodule