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

Код Хэмминга [7, 4] на FPGA

Здравствуйте. Помогите, пожалуйста, написать код по линейной переключательной схеме на картинке. Я написал такой код, но он работает неправильно. Модуль:

 

module hamming_coder(
    input wire clk,
    input wire enable,
    input wire reset,
    input wire in,
    output wire out
);

reg [3:0] counter = 0;
reg [3:0] state;

wire feedback = state[0] ^ state[2] ^ state[3];
wire nextBit = counter < 5 ? in : feedback;

always @(posedge clk) begin
    if (reset) begin
        state <= 0;
        counter <= 0;
    end
    else
        if (enable) begin
            state <= { nextBit, state[3:1] };
            counter <= counter + 4'b0001;
        end
end

assign out = state[0];

endmodule

Тестбенч:

module hamming_coder_tb();

logic clk;
logic [3:0] data = 4'b0001;
logic reset;
logic enable;
logic in;
logic out;

assign in = data[0];

initial begin
    clk = 0;
    forever #5 clk = ~clk;
end

always @(posedge clk)
    if (!reset && enable)
        data <= data >> 1;
        
hamming_coder coder(
    .clk(clk),
    .enable(enable),
    .reset(reset),
    .in(in),
    .out(out)
);

always @(posedge clk)
    if (!reset && enable)
        $write(out);
        
initial begin
    reset <= 1'b1;
    enable <= 1'b0;
    @(posedge clk);
    
    reset <= 1'b0;
    enable <= 1'b1;
    repeat (11) @(posedge clk);
    
    $finish;
end

endmodule

Ориентиры для проверки корректности кодирования: примеры кодирования при помощи порождающей матрицы этого кода. Информационное слово (1010), код (1010001); слово (1100), код (1100101); слово (1000), код (1000110). Помогите, пожалуйста, разобраться, что-то запутанно как-то. Одна маленькая погрешность приводит к совершенно другому кодовому слову.

photo_2023-12-22_23-32-35.jpg

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


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

попробуйте так

module hamming_ecoder(
    input [3:0] data_in,
    output [6:0] ham_out
    );
        
    wire p0,p1,p2;
    
    assign p0 = data_in[0] ^ data_in[1] ^ data_in[3];
    assign p1 = data_in[0] ^ data_in[2] ^ data_in[3];
    assign p2 = data_in[1] ^ data_in[2] ^ data_in[3];
    
    assign ham_out = {data_in, p0, p1, p2};
endmodule
`timescale 1ns / 1ps
module hamming_encoder_tb();

reg [3:0] data_in;
wire [6:0] ham_out;
    
hamming_encoder DUT(data_in,ham_out);

initial
    begin
        data_in = 4'h4;
        #10;
        data_in = 4'h0;
        #10;
        data_in = 4'h8;
        #10;
        data_in = 4'hF;
        #10;
        data_in = 4'hA;
        #10;
        data_in = 4'h9;
        #10;
    end
endmodule

 

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


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

Ну да, можно сделать кодер и таким образом, умножив абстрактный вектор на матрицу и посчитав соотношения координат вектора, спасибо. А мой способ реализации вообще жизнеспособен?

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


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

Да просто надо понять, где ошибка и исправить)

PS Кто ищет тот вседа найдет)

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


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

А если написать вот так:

wire nextBit = counter < 4 ? in : feedback;

И заодно в тестбенче лучше генерить клок так:

initial begin
    clk <= 0;
    forever #5 clk <= ~clk;
end

 

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


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

Оффтоп: помнится в 89 году будущей жене написал курсовик по кодеру Хемминга на ПЗУ типа 556 что ли (а предполагалось, что задача будет решаться на простой логике). Препод тогда поставил ей 4 и передал, что мне поставил 5. Эх, молодость!😄

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

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


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


@AngelicQuasar

Если не секрет,  какая это книга?
Я сначала подумал, что это методичка ВУЗ-а, а потом увидел, что там страница 355

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


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

2 часа назад, Джеймс сказал:


@AngelicQuasar

Если не секрет,  какая это книга?
Я сначала подумал, что это методичка ВУЗ-а, а потом увидел, что там страница 355

Михайлов, Мазепа "Основы теории кодирования"
Но мне по кодам больше нравится Блейхут "Теория и практика кодов, контролирующих ошибки"

3 часа назад, OM-S сказал:

А если написать вот так:

wire nextBit = counter < 4 ? in : feedback;

И заодно в тестбенче лучше генерить клок так:

initial begin
    clk <= 0;
    forever #5 clk <= ~clk;
end

 

Офигеть, помогло
Спасибо

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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