FPGA設計之迴圈編解碼(行動通訊)
1,迴圈碼編碼部分
module cyc_code(rst,clk,data,code);
input rst,clk;
input [3:0]data;
output reg [7:0]code;
begin
code[7]=1'b0;
code[6]=data[2];
code[5]=data[1];
code[4]=data[0];
code[3]=data[2]^data[1];
code[2]=data[1]^data[0];
code[1]=data[2]^data[1]^data[0];
code[0]=data[2]^data[0];
end
endmodule
2,迴圈碼解碼部門
module cyc_decode(clk,code,code_out);
input clk;
input [6:0]code;
output reg [3:0]code_out;
7'b0010111:code_out=4'b0001;
7'b0101110:code_out=4'b0010;
7'b0111001:code_out=4'b0011;
7'b1001011:code_out=4'b0100;
7'b1011100:code_out=4'b0101;
7'b1100101:code_out=4'b0110;
7'b1110010:code_out=4'b0111;
7'b0000000:code_out=4'b0000;
default:
code_out=4'b0000;
endcase
endmodule
3,並行轉序列資料
module p16s(clk,data,cyc_out,fs);
input clk;
input [15:0] data;
output reg cyc_out,fs;
reg [4:0] m;
reg [15:0] yreg;
//=============================================
[email protected](posedge clk)
begin
if(m==4'd15)
m<=0;
else
m<=m+4'b1;
end
//===============================================
if(m==4'b0)
begin
yreg<=data;
cyc_out<=yreg[15];
end
else
begin
yreg[14:1]<=yreg[13:0];
cyc_out<=yreg[14];
end
//================================================
[email protected](posedge clk)//每40位作為一幀資料傳送一個高電平控制位
if(m==4'd0)
fs<=1'b1;
else
fs<=1'b0;
//======================================================
endmodule
4,序列轉並行資料
module s2p16(cyc_code_in,fs,bs,pcode);
input cyc_code_in,fs,bs;
output reg [15:0]pcode;
reg [15:0]temp;
if(fs)
pcode<=temp;
else
begin
temp[0]<=cyc_code_in;
temp[1]<=temp[0];
temp[2]<=temp[1];
temp[3]<=temp[2];
temp[4]<=temp[3];
temp[5]<=temp[4];
temp[6]<=temp[5];
temp[7]<=temp[6];
temp[8]<=temp[7];
temp[9]<=temp[8];
temp[10]<=temp[9];
temp[11]<=temp[10];
temp[12]<=temp[11];
temp[13]<=temp[12];
temp[14]<=temp[13];
temp[15]<=temp[14];
end
endmodule