Université des Sciences et de la Technologie d’Oran « USTO » Année 2023-2024
AII /2ème Année Master FPGA et programmation VHDL
Chapitre III. Synthèse logique en Verilog
Structure d'un module dans Verilog
module demo(A, B, C, Y);
input A;
input B;
Le type de ports
input C;
output Y;
wire a_or_b; signaux internes
assign a_or_b = A | B;
assign Y = a_or_b & (~C);
endmodule;
Circuits combinatoires – assign
Utilisation d'affectations simultanées et d'opérations bit à bit simples :
~ not, & and, ^ xor, ~^ xnor , | or
Structures de contrôle
if (condition) instruction;
if (condition) instruction;
else if (condition) instruction;
else instruction;
case (expression)
constante : instruction;
constante, constante : instruction;
…
default : instruction;
endcase
for ( initialisation; condition; progression ) instruction;
while ( condition ) instruction;
1
repeat (nombre_de_repetitions) instruction;
forever instruction;
Opérateurs
Opérateurs entre mots binaires
~ ~m Inverser tous les bits de m
& m&n ET entre tous les bits de m et tous les bits de n
| m|n OU entre les bits de m et les bits de n
^ m^n OU-EXCLUSIF entre les bits de m et les bits de n
~^ m ~^ n NON-OU-EXCLUSIF entre les bits de m et les bits de n
<< m << n décalage de m, de n bits à gauche, complété par des zeros à droite
>> m >> n décalage de m, de n bits à droite, complété par des zeros à gauche
Opérateurs unaires de réduction
& &m ET de tous les bits de m ensemble (résultat sur un bit)
~& ~&m NAND de tous les bits de m ensemble (résultat sur un bit)
| |m OU de tous les bits de m ensemble (résultat sur un bit)
~| ~|m NOR de tous les bits de m ensemble (résultat sur un bit)
^ ^m OU-EXCLUSIF de tous les bits de m ensemble (résultat sur un bit)
~^ ~^m NON-OU-EXCLUSIF de tous les bits de m ensemble (résultat sur un bit)
Opérateurs logiques
! !m m est-il faux ? (Résultat sur un bit Vrai/Faux)
&& m && n m et n sont-ils tous les deux vrais ? (Résultat sur un bit Vrai/Faux)
|| m || n l’un au moins parmi m et n est-il vrai ? (Résultat sur un bit Vrai/Faux)
Opérateurs relationnels
== m== n m est-il égal à n ? (Résultat sur un bit Vrai/Faux)
!= m != n m est-il différent de n ? (Résultat sur un bit Vrai/Faux)
< m<n m est-il plus petit que n ? (Résultat sur un bit Vrai/Faux)
> m>n m est-il plus grand que n ? (Résultat sur un bit Vrai/Faux)
<= m <= n m est-il inférieur ou égal à n ? (Résultat sur un bit Vrai/Faux)
>= m >= n m est-il supérieur ou égal à n ? (Résultat sur un bit Vrai/Faux)
2
Opérateurs arithmétiques
+ m+n somme de m et n
- m-n soustraction de n à m
- -m opposé de n (en complément à 2)
* m*n produit de n et m
/ m/n quotient de la division entière de m par n
% m % n reste (modulo) de la division entière de m par n
** m**n élévation de m à la puissance n (Verilog-2001)
<<< m <<< n décalage de n bits à gauche de m, complété par des zéros à droite.(Verilog-2001)
>>> m >>> n décalage de n bits à droite de m, complété par des zéros à gauche si m est non signé, par le poids
fort (signe) si m est signé. (Verilog-2001)
Délais
# # n instruction ; instruction est exécutée après le délai n. Le delai est un entier ou un réel, il n’y a pas à
préciser d’unité. (L’unité est définie par la directive timescale. )
# #n; introduit un délais de n unités de temps dans un bloc procédural.
Circuits combinatoire quelconque :
Circuit 1 : Décodeurs : « Chapitre I-Doc1-Page1 »
Code Verilog HDL :
module decod_7Seg(a,b,c,d,e,f,g,E0,E1,E2,E3);
input E0,E1,E2,E3;
output a,b,c,d,e,f,g;
assign a =~E1 & (~E0 & E2 | E0 & ~E2 & ~E3);
assign b = E2 & (E0 ^ E1);
assign c =~E0 & E1 & ~E2;
assign d = (E2 & (E0 ~^ E1)) | (E0 & ~E1 & ~E2 & ~E3);
assign e = E0 | (~E1 & E2);
assign f = (E0 & E1) | (E1 & ~E2) | (E0 & ~E2 & ~E3);
assign g = (~E1 & ~E2 & ~E3) | (E0 & E1 & E2);
endmodule;
3
Circuit 2 : Additionneur binaire : « Chapitre I-Doc1-Page3 »
1) Demi-additionneur :
module Demi_Add(S,r,A,B);
input A,B;
output S,r;
assign S = A ^ B;
assign r = A & B;
endmodule;
2) Additionneur complet
module Add_Comp(S,r_out,A,B,r_in);
input A,B,r_in;
output S,r_in;
wire s_1,r_1,r_2;
Demi_Add1(s_1,r_1,A,B);
Demi_Add2(S,r_2,s_1,r_in);
assign r_out = r_1 | r_2;
endmodule;
La décomposition de l'addition de deux nombres binaires de quatre bits.
module Add_4bit(S0,S1,S2,S3,r3,a0,a1, a2,a3,b0,b1,b2,b3);
input a0,a1,a2,a3,b0,b1,b2,b3;
output S0,S1,S2,S3,r3;
wire r0,r1,r2;
Demi_Add0(S0,r0,a0,b0);
Add_Comp1(S1,r1,a1,b1,r0);
Add_Comp2(S2,r2,a2,b2,r1);
Add_Comp3(S3,r3,a3,b3,r2);
endmodule;
Circuits Séquentielle quelconque :
Bascule RS asynchrone:
module bascul_rs (Q,Q_b,r,s);
input r,s;
output reg Q,Q_b;
always @(r , s )
begin
Q=~s & Q_b;
Q_b=~r & Q;
end
endmodule
4
Application Grafcet :
Les équations d’activation :
Les équations inactivation :
Sys_Auto :
module Sys_Auto (Q0,Q1,Q2,Q3,a,b,Da,Db);
input a,b,Da,Db;
output Q0,Q1,Q2,Q3;
wire S0,S1,S2,S3,R0,R1,R2,R3,Q0_b,Q1_b,Q2_b,Q3_b;
bascul_rs0 (Q0,Q0_b,R0,S0);
bascul_rs1 (Q1,Q1_b,R1,S1);
bascul_rs2 (Q2,Q2_b,R2,S2);
bascul_rs3 (Q3,Q3_b,R3,S3);
assign S0=Q3 & a; assign S1=Q0 & Da & a;
assign S2=Q1 & b; assign S3=Q2 & Db & b;
assign R0=~Q1_b; assign R1=~Q2_b;
assign R2=~Q3_b; assign R3=~Q0_b;
endmodule
5
Bascule D synchrone:
module bascul_D (Q,D,clk,reset);
input D,clk,reset;
output reg Q;
always @(posedge clk or posedge reset )
begin
if (reset == 1) Q <= 0;
else Q <= D;
end
endmodule
Registre de mémorisation 4 bits :
module Registre_4bit (S,E,clk,reset);
input clk,reset;
input [3:0] E;
output reg [3:0] S;
always @(posedge clk or posedge reset )
begin
if (reset == 1) S <= 0;
else S <= E;
end
endmodule
Compteurs synchrone « Chapitre I-Doc3-Page4 »»
6
module compt_synch (Q,clk,reset);
input clk,reset;
output reg [3:0] Q;
wire [3:0] D;
always @(posedge clk , posedge reset )
begin
if (reset == 1) Q <= 0;
else Q <= D;
end
assign D[0]=~Q[0];
assign D[1]=Q[0]^Q[1];
assign D[2]=( Q[0] & Q[1] & ~Q[2] ) | ( Q[2] & ( Q[0]|~Q[1]) );
assign D[3]=( Q[0] & Q[1] & ~Q[2] ) | ( Q[3] & ( ~Q[0]|~Q[1]|~Q[2]) );
endmodule