Задать вопрос
@DGash

Кто может объяснить код?

Здравствуйте! Мне нужно реализовать на Verilog алгоритм Шеннона-Фано. Я нашёл готовую программу, но мне нужно понять как она работает. Можете, пожалуйста, кратко объяснить как он работает. А то я никак не могу разобраться.
`define INIT 3'b111
`define GET_DATA 3'b000
`define BUILD_TREE 3'b001
`define DECODE_TREE 3'b010
`define SEND_SYMBOLS 3'b011
`define SEND_CODE 3'b100
`define SEND_LENGTH 3'b101

//Port declaration
module huff_encoder(
input clock,
input [bit_width:0]data_in,

input [1:0]data_enable,
output reg [2*bit_width+2:0]data_out,
output reg data_recv,
output reg code_map_recv
);


parameter bit_width = 7;
parameter col_length = 3;
parameter No_of_Data = 4;


reg [7:0]temp2;
reg [7:0]Prob_list[col_length:0];
reg [bit_width:0]Huff_list[col_length:0];
reg [bit_width:0]Sym_list[col_length:0];
reg [bit_width:0]Sym,temp1;

reg [0:2*bit_width+2]Code_list[col_length:0];
reg [bit_width:0]Code_length[col_length:0];


reg [bit_width:0]Pair_list[2*col_length+2:0];

reg [2:0]state = `INIT ;
integer step = 0;
reg [bit_width:0]pos,newpos = 0;

reg [bit_width:0]col = 'b00000011;
reg [bit_width:0]Data[No_of_Data:0];

integer i= 16'h0;
integer j= 16'h0;
integer k= 16'h0;
reg flag = 0;
integer pair_count= 0, sym_count = 0;

//body

always @(posedge clock) begin
case(state)

`INIT: begin
Sym_list[0] = 'b0;
Prob_list[0] = 'b0;

for(j=0;j<=col_length;j=j+1) begin
Code_list[j] = 'bz;
Prob_list[j] = 'b0;
Sym_list[j] = 'bz;
Code_length[j] = 'b0;

end


data_out = 'bz;
state = `GET_DATA;
end

`GET_DATA:begin
if(data_enable==2'b00)begin


case(data_in)

'b00000000:begin
Sym_list[0]=data_in;
Huff_list[0]=data_in;
Prob_list[0]=Prob_list[0]+1;
end
'b00000001:begin
Sym_list[1]=data_in;
Huff_list[1]=data_in;
Prob_list[1]=Prob_list[1]+1;
end
'b00000010:begin
Sym_list[2]=data_in;
Huff_list[2]=data_in;
Prob_list[2]=Prob_list[2]+1;
end
'b00000011:begin
Sym_list[3]=data_in;
Huff_list[3]=data_in;
Prob_list[3]=Prob_list[3]+1;
end
endcase


end
else if(data_enable==2'b01)begin

for(j=0;j<=3;j=j+1)begin
for(k=j-1;k>=0;k=k-1) begin
if(Prob_list[k] <= Prob_list[j]) begin
temp1 = Sym_list[j];
temp2 = Prob_list[j];
Sym_list[j] = Sym_list[k];
Prob_list[j] = Prob_list[k];
Sym_list[k] = temp1;
Prob_list[k] = temp2;

Huff_list[j] = Sym_list[j];
Huff_list[k] = Sym_list[k];

end

end
end
end


else if(data_enable==2'b10) begin
state=`BUILD_TREE;
sym_count=col;
//col=col-1;
end

end



//main algorithm
`BUILD_TREE: begin
code_map_recv = 0;
data_recv = 0;
if(col) begin //One step per cycle
Prob_list[col-1] = Prob_list[col] + Prob_list[col-1]; //Added probabilities

Pair_list[step] = Huff_list[col-1]; //Add in pair table
Pair_list[step+1] = Huff_list[col];

col = col - 1; //removing least symbol
pair_count = pair_count +2;

begin:SORT1
//for(j=0;j<=col;j=j+1)begin
for(k=col-1;k>=0;k=k-1) begin
if(Prob_list[k] < Prob_list[col]) begin
temp1 = Huff_list[col];
temp2 = Prob_list[col];
Huff_list[col] = Huff_list[k];
Prob_list[col] = Prob_list[k];
Huff_list[k] = temp1;
Prob_list[k] = temp2;
end
end
end

step = step + 2;
end

else
if(col == 0) begin
state = `DECODE_TREE;
i=0;
j=0;

Sym = Sym_list[0];
end
end

//Decoding

`DECODE_TREE: begin
code_map_recv = 1;
data_recv = 1;
//One symbol per cycle decoding
//i - symbol number, j - iteration for code

if(Sym == Pair_list[j]) begin

if(j%2 == 0) begin
Code_list[i]= Code_list[i]<<1 | 'b0;
j=j+2;
end

else begin
Code_list[i]= Code_list[i]<<1 | 'b1;
Sym = Pair_list[j-1];
j=j+1;
end

Code_length[i] = Code_length[i] + 1;
end

else
j=j+1;

if(j>pair_count-1) begin
i=i+1;
j=0;
Sym = Sym_list[i];
end

if(i==sym_count+1) begin
state = `SEND_LENGTH;
i=0;
end

end

//Outputting data

`SEND_LENGTH: begin
//send data in reverse order
data_out = Code_length[i];
i = i+1;

if(i == sym_count+1) begin
state = `SEND_CODE;
i = 0;
end

data_recv = 1;
code_map_recv = 0;
end

`SEND_CODE: begin
data_recv = 0;
code_map_recv = 1;
data_out = Code_list[i];
i = i+1;

if(i == sym_count+1) begin
state = `SEND_SYMBOLS;
i = 0;
end
end

`SEND_SYMBOLS: begin
data_recv = 1;
code_map_recv = 1;
data_out = Sym_list[i];
i = i+1;
if(i == sym_count+1)
state = `INIT;
end

endcase
end
endmodule
  • Вопрос задан
  • 233 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы