23 iunie 2010

Problema de decodificare in Verilog

Sa se proiecteze un sistem care decodifica un sir de biti conform arborelui prezentat in
continuare (bazat pe probabilitatile de aparitie):
/* Din desen rezulta urmatoarele codificari:
A - 0, B - 100, C - 101, D - 110, E - 111
=> 5 simboluri + un eventual simbol invalid => iesirea va fi pe 3 biti
*/

Rezolvare (modulul verilog):

`timescale 1ns / 1ps

module rezolvare(
input clk,
input clr,
input din,
output reg valid,
output reg [2:0] dout
);

// li se ofera valori oarecare, nu conteaza
localparam A=3'd0;
localparam B=3'd1;
localparam C=3'd2;
localparam D=3'd3;
localparam E=3'd4;
localparam invalid=3'd7;

reg [1:0] state;

always@(posedge clk or negedge clr)
if (~clr) begin
state <= 0;
valid <= 0;
dout <= invalid;
end
else
case (state)
2'd0 : if (din) begin // starea 0 , cand primeste primul bit de la intrare
valid <= 0; // cand din == 1, nu exista un simbol valid S = 1
dout <= invalid;
state <= 1;
end
else begin // cand bitul primit din == 0, dout = A = 1
valid <= 1;
dout <= A;
state <= 0;
end
2'd1 : if (din) begin // 2'd1 corespunde starii din care se poate ajunge in 10 sau 11
valid <= 0;
dout <= invalid; // 11 nu este un simbol valid
state <= 3;
end
else begin
valid <= 0;
dout <= invalid; // nici 10
state <= 2;
end
2'd2 : if (din) begin // 2'd2 corespunde starii din care se poate ajunge in 100 sau 101
valid <= 1;
dout <= C; // 101 inseamna 'C'
state <= 0;
end
else begin
valid <= 1;
dout <= B; // 100 inseamna 'B'
state <= 0;
end
2'd3 : if (din) begin // 2'd3 corespunde starii din care se poate ajunge in 110 sau 111
valid <= 1;
dout <= E; // 111 inseamna 'E'
state <= 0;
end
else begin
valid <= 1;
dout <= D; // 110 inseamna 'D'
state <= 0;
end
endcase
endmodule

Niciun comentariu: