Перейти к содержанию
    

Декодирование кода Хэмминга [7,4] на ПЛИС

Хочу сделать кодирование Хэмминга на ПЛИС. Скажите, пожалуйста, есть ли у меня ошибки в коде? При отладке (моделировании) происходит что-то странное, где-то появляются иксы, после присваивания code <= codeword  слева становится 0x55, а справа 0x5C. Должно быть равенство. Вот мой код:

 

module hamming_decoder(
    input logic clk,
    input logic [6:0] codeword,
    output logic [2:0] syndrome,
    output reg [3:0] data
);

    logic [6:0] code;
    logic [6:0] err;
    
    always @(posedge clk)
    begin
        syndrome[2] <= codeword[2] ^ codeword[3] ^ codeword[4] ^ codeword[6];
        syndrome[1] <= codeword[1] ^ codeword[3] ^ codeword[4] ^ codeword[5];
        syndrome[0] <= codeword[6] ^ codeword[5] ^ codeword[3] ^ codeword[0];
        
        code <= codeword;
        
        if (syndrome != 0)
        begin
            case (syndrome)
                3'b001 : err <= 7'b0000001;
                3'b010 : err <= 7'b0000010;  
                3'b100 : err <= 7'b0000100;  
                3'b111 : err <= 7'b0001000;  
                3'b110 : err <= 7'b0010000;  
                3'b011 : err <= 7'b0100000;  
                3'b101 : err <= 7'b1000000;                  
            endcase
            
            code <= code ^ err;
        end
     end
     
     always @(code)
     begin
        data[3] = code[6];
        data[2] = code[5];
        data[1] = code[4];
        data[0] = code[3];
     end
endmodule

Тестбенч:

 

module hamming_decoder_tb();
    logic clk;
    logic [6:0] codeword;
    logic [2:0] syndrome;
    logic [3:0] data;
    
    hamming_decoder dut(clk, codeword, syndrome, data);
    
    initial begin
        clk <= '0;
        forever #10 clk <= ~clk;
    end
    
    initial
    begin
        $monitor("codeword = %b, syndrome = %b, data = %b", codeword, syndrome, data);
         
        codeword = 7'b0011001;
        #100
        codeword = 7'b0101100;
        #100
        codeword = 7'b1010011;
        #100
        codeword = 7'b1011001;
        #100
        codeword = 7'b0101000;
    end
endmodule

Может, я где-то напутал с = и <=?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AngelicQuasar said:

Может, я где-то напутал с = и <=?

Да. Синдром и дата. 

Если регистр - пихаем под клок (<=) и он присвоится на следующем такте. 

Если провод асигнуем моментально (=). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Должно быть 

syndrome[2] = codeword[2] ^ codeword[3] ^ codeword[4] ^ codeword[6];

и

 

data[3] <= code[6];

?

Изменено пользователем AngelicQuasar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, AngelicQuasar said:

после присваивания code <= codeword  слева становится 0x55, а справа 0x5C. Должно быть равенство.

не должно быть там равенство, вы же сами этот код написали. читайте внимательно ваш код, желательно с тетрадью, в которой нарисована функциональная схема вашего устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, AngelicQuasar said:

Должно быть 

syndrome[2] = codeword[2] ^ codeword[3] ^ codeword[4] ^ codeword[6];

и

data[3] <= code[6];

?

Переписать всё так, чтобы:

1. (<=) относилось к D-триггеру у которого Q=D только после "posedge CLK", т.е Q можно использовать на следующем такте;

2. (=) относилось к LUT логике значение которой вычисляется "мгновенно", т.е. не зависит от CLK.

 

А уж кто из них регистр - решать вам следуя придуманной вами реализации алгоритма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/27/2023 at 11:13 PM, AngelicQuasar said:

сделать кодирование Хэмминга на ПЛИС. Скажите, пожалуйста, есть ли у меня ошибки в коде?

попробуйте свериться с выходом вот этого онлайн-генератора: http://idoka.ru/verilog-ecc-generator/

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...