📄 rb2_decoder.v
字号:
module RB2_decoder(rangeOut, offsetOut, bin_1, used_bins_num, modelValue_out, current_totalUsed_bins, samectxIdx_rLPS,
last_pStateIdx, modelValue_in, RB1_used_binNum, range_in, offset_in, readReg,
dec_mode, IsNotB0, bin_0);
output [8:0] rangeOut;
output [8:0] offsetOut;
output bin_1;
output [3:0] used_bins_num;
output [6:0] modelValue_out;
output [3:0] current_totalUsed_bins;
reg [8:0] rangeOut;
reg [8:0] offsetOut;
reg bin_1;
reg [3:0] used_bins_num;
reg [6:0] modelValue_out;
reg [3:0] current_totalUsed_bins;
input [31:0] samectxIdx_rLPS;
input [5:0] last_pStateIdx;
input [6:0] modelValue_in;
input [3:0] RB1_used_binNum;
input [8:0] range_in;
input [8:0] offset_in;
input [15:0] readReg;
input [2:0] dec_mode;
input IsNotB0;
input bin_0;
wire [2:0] qCodIRangeIdx;
reg [8:0] rangeNew;
reg [8:0] offsetNew;
reg [5:0] pStateIdx;
reg [7:0] FODValue; //FOD input value (8 bits);
reg [2:0] FODNum; //FOD output value (3 bits);
reg [7:0] codIRangeLPS;
assign qCodIRangeIdx = range_in[7:6];
//assign current_totalUsed_bins = (used_bins_num + RB1_used_binNum);
always @(range_in or offset_in or IsNotB0 or bin_0 or readReg or RB1_used_binNum
or samectxIdx_rLPS or last_pStateIdx or modelValue_in or dec_mode or qCodIRangeIdx)
begin
if((dec_mode == 3'b000) && IsNotB0 && bin_0)
begin
rangeNew = range_in;
offsetNew = offset_in;
case(qCodIRangeIdx)
0:
begin
codIRangeLPS = samectxIdx_rLPS[7:0];
end
1:
begin
codIRangeLPS = samectxIdx_rLPS[15:8];
end
2:
begin
codIRangeLPS = samectxIdx_rLPS[23:16];
end
3:
begin
codIRangeLPS = samectxIdx_rLPS[31:24];
end
endcase
mainOperation;
rangeOut = rangeNew;
offsetOut = offsetNew;
end
else
begin
// rangeOut = rangeOut;
// offsetOut = offsetOut;
// bin_1 = bin_1;
used_bins_num = 0;
current_totalUsed_bins = RB1_used_binNum;
end
end
task mainOperation;
begin
rangeNew = rangeNew - codIRangeLPS;
if(offsetNew < rangeNew) //valMPS
begin
// IsValMPS = 1;
pStateIdx = modelValue_in[5:0];
if(pStateIdx < 62)
begin
pStateIdx = pStateIdx + 1;
modelValue_out[5:0] = pStateIdx;
end
if(!rangeNew[8]) //codIRange < 0x100 need left shift one time
begin
rangeNew = rangeNew << 1;
offsetNew = offsetNew << 1;
offsetNew[0] = readReg[RB1_used_binNum];
used_bins_num = 1;
end
else
begin
used_bins_num = 0;
end
current_totalUsed_bins = used_bins_num + RB1_used_binNum;
bin_1 = modelValue_in[6];
end
else //valLPS
begin
// IsValMPS = 0;
offsetNew = offsetNew - rangeNew;
rangeNew = codIRangeLPS;
pStateIdx = modelValue_in[5:0];
if(pStateIdx == 0)
begin
modelValue_out[6] = !modelValue_in[6]; //valMPS = 1 - valMPS
end
pStateIdx = last_pStateIdx;
modelValue_out[5:0] = pStateIdx; //renew pStateIdx;
FODValue = rangeNew[7:0];
firstOneDetect;
case(FODNum) //FODNum = 1--7
1:
begin
rangeNew = rangeNew << 1;
offsetNew = offsetNew << 1;
offsetNew[0] = readReg[RB1_used_binNum];
end
2:
begin
rangeNew = rangeNew << 2;
offsetNew = offsetNew << 2;
//offsetNew[1:0] = readReg[1:0];
offsetNew[1:0] = {readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
3:
begin
rangeNew = rangeNew << 3;
offsetNew = offsetNew << 3;
//offsetNew[2:0] = readReg[2:0];
offsetNew[2:0] = {readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
4:
begin
rangeNew = rangeNew << 4;
offsetNew = offsetNew << 4;
//offsetNew[3:0] = readReg[3:0];
offsetNew[3:0] = {readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
5:
begin
rangeNew = rangeNew << 5;
offsetNew = offsetNew << 5;
//offsetNew[4:0] = readReg[4:0];
offsetNew[4:0] = {readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
6:
begin
rangeNew = rangeNew << 6;
offsetNew = offsetNew << 6;
//offsetNew = readReg[5:0];
offsetNew[5:0] = {readReg[RB1_used_binNum + 5], readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
7:
begin
rangeNew = rangeNew << 7;
offsetNew = offsetNew << 7;
//offsetNew = readReg[6:0];
offsetNew[5:0] = {readReg[RB1_used_binNum + 6], readReg[RB1_used_binNum + 5], readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
end
default:
begin
rangeNew = rangeNew << 1; //this should never be reached!
offsetNew = offsetNew << 1;
offsetNew = readReg[RB1_used_binNum];
end
endcase
bin_1 = !modelValue_in[6]; //valure of LPS
used_bins_num = FODNum;
current_totalUsed_bins = used_bins_num + RB1_used_binNum;
end
end
endtask
task firstOneDetect;
reg out1;
begin
out1 = |FODValue[7:4];
if(out1)
begin
if(FODValue[7])
FODNum = 0;
else if(FODValue[6])
FODNum = 1;
else if(FODValue[5])
FODNum = 2;
else
FODNum = 3;
end
else
begin
if(FODValue[3])
FODNum = 0;
else if(FODValue[2])
FODNum = 1;
else if(FODValue[1])
FODNum = 2;
else
FODNum = 3;
FODNum = FODNum + 4;
end
end
endtask
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -