Самый значимый битовый операнд в части выбора векторного провода недопустим - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу сделать параметризованный FIR-фильтр в verilog на xilinix.Это мой код:

module FIRFilter(xInput, clock, reset, filterCoeff, yOutput);
parameter inputBits = 8, lengthOfFilter = 4, coeffBitLength = 8, lengthOfCoeff = lengthOfFilter + 1, outputBitWdth = 2 * inputBits;
input [(coeffBitLength * lengthOfCoeff) - 1 : 0] filterCoeff;
input clock, reset;
input [inputBits - 1 : 0] xInput;
reg [outputBitWdth - 1 : 0] addWires [lengthOfFilter - 1 : 0];
output reg [outputBitWdth - 1 : 0] yOutput;
reg [inputBits - 1 : 0] registers [lengthOfFilter - 1 : 0];
integer i, j;
always @ (posedge clock, posedge reset)
begin
    if(reset)
    begin
        for(i = 0; i < lengthOfFilter; i = i + 1)
        begin
            registers[i] <= 0;
        end
    end
    else
    begin
        registers[0] <= xInput;
        for(i = 1; i < lengthOfFilter; i = i + 1)
        begin
            registers[i] <= registers[i - 1];
        end
    end
end
always @ (posedge clock)
begin
    addWires[0] = filterCoeff[(lengthOfFilter * coeffBitLength) - 1 : (lengthOfFilter - 1) * coeffBitLength] * xInput;
    for(j = 1; j < lengthOfFilter; j = j + 1)
    begin
        addWires[j] = (filterCoeff[((j + 1) * coeffBitLength) - 1 : j * coeffBitLength] * registers[j - 1]) + addWires[j - 1];
    end
    yOutput = (filterCoeff[coeffBitLength - 1 : 0] * registers[lengthOfFilter - 1]) + addWires[lengthOfFilter - 1];
end
endmodule

Но я продолжаю получать эту ошибку

ERROR:HDLCompilers:109 - "FIRFilter.v" line 33 Most significant bit operand in part-select of vector wire 'filterCoeff' is illegal
ERROR:HDLCompilers:110 - "FIRFilter.v" line 33 Least significant bit operand in part-select of vector wire 'filterCoeff' is illegal
ERROR:HDLCompilers:45 - "FIRFilter.v" line 33 Illegal right hand side of blocking assignment

Я искал решение в Интернете, но не получил удовлетворительного ответа.Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 24 ноября 2018

Verilog не разрешает выбор деталей signal[msb:lsb], где msb и lsb не являются константами.Вы можете использовать другую конструкцию, называемую индексированной выборкой, где вы указываете постоянную ширину, но смещение переменной signal[offset+:width]

addWires[0] = filterCoeff[(lengthOfFilter * coeffBitLength) +:coeffBitLength] * xInput;
...