Module
module my_entity (
input wire i_in,
output wire o_out
);
// ports et logique interne ici
endmodule
Opérateurs binaires
- NOT
assign s = ~a;
- AND
assign s = a & b;
- OR
assign s = a | b;
- NAND
assign s = ~(a & b); // NAND
- NOR
assign s = ~(a | b); // NOR
- XOR
assign s = a ^ b;
Multiplexeur
- Avec l’opérateur ternaire (assign concurrent)
assign s = (sel == 2'b00) ? a1 :
(sel == 2'b01) ? a2 :
(sel == 2'b10) ? a3 : a4;
- En utilisant always / case
reg [WIDTH-1:0] s;
always @(*) begin
case (sel)
2'b00: s = a1;
2'b01: s = a2;
2'b10: s = a3;
default: s = a4;
endcase
end
Bascule (Flip-Flop)
// signal q : std_logic -> reg en Verilog
reg q;
- Reset asynchrone
always @(posedge clk or posedge rst) begin
if (rst)
q <= 1'b0;
else
q <= d;
end
- Reset synchrone
always @(posedge clk) begin
if (rst)
q <= 1'b0;
else
q <= d;
end
Registre
// signal q : std_logic_vector(n downto 0) -> reg [n:0] q;
reg [N:0] q;
- Reset asynchrone
always @(posedge clk or posedge rst) begin
if (rst)
q <= { (N+1){1'b0} };
else
q <= d;
end
- Reset synchrone
always @(posedge clk) begin
if (rst)
q <= { (N+1){1'b0} };
else
q <= d;
end
Additionneur
reg [3:0] s_value;
always @(posedge clk or posedge rst) begin
if (rst) begin
s_value <= 4'b0000;
end else begin
if (en) begin
if (init)
s_value <= init_value; // init_value doit avoir la même largeur
else
s_value <= s_value + 1;
end
// sinon on garde la valeur courante (pas d'affectation nécessaire)
end
end