реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> uart verilog
Джеймс
сообщение Nov 5 2013, 06:30
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 20-01-06
Пользователь №: 13 399



Код
always @(posedge clk, posedge rst) begin
    if(rst) begin
      lfsr_q <= {16{1'b1}};
    end
    else begin
      lfsr_q <= crc_en ? lfsr_c : lfsr_q;
    end
  end // always


А сброс (rst) подается?
И здесь вообще говоря должен быть не только сброс при включении питания, поскольку так модуль отработает только один раз.

always @(posedge clk or posedge rst)
begin
if(rst) // power-up reset
lfsr_q[15:0] <= 16'hFFFF;
else
if (NEW_CRC)
lfsr_q[15:0] <= 16'hFFFF; // start new crc calculation
else
if (crc_en)
lfsr_q[15:0] <= lfsr_c[15:0];
end

И старайтесь указывать везде разрядности. Полезная привычка..
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Nov 7 2013, 11:02
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Может я что то не правильно понимаю для подсчета crc для Modbus RTU используется полином 0xA001 ? Для генерации кода если использовать сервисе http://outputlogic.com/?page_id=321 нужно выбрать
Прикрепленное изображение

После его использовать по такому алгоритму: Модуль uart ждет получения байта и держит crc в сбросе, как байт получен он поступает на datain снимаеться сигнал reset и устанавливает сигнал crccloc.
Следующей такт снимает crcclok. как следующий байт поступает опять ставиться crcclok и так пока весь пакет не будет получен. когда количество полученных байт соответствует, результат crc готов.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Nov 7 2013, 15:54
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



...
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Nov 8 2013, 11:58
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Блин ничего не понимаю, в чем я ошибся, или что то совсем ничего не понимаю, вроде такая простая вещь а не работает как нужно (.
Весь подсчет разбил что бы было удобнее искать проблему, но ничего так и не нашел. Взял проверенный алгоритм на C#
Код
        {
            int crc = 0xFFFF;
            byte[] msg = new byte[6];
            msg[0] = 0x24;
            msg[1] = 0x08;
            msg[2] = 0x00;
            msg[3] = 0x00;
            msg[4] = 0x00;
            msg[5] = 0x00;

            for (int j = 0; j < 6; j++)
            {
              

                crc = crc ^ msg[j];

                for (int i = 0; i < 8; i++)
                {

                    bool ff =  (crc & 1)==1;
                    crc = crc >> 1;

                    if (ff)
                    {
                        crc = crc ^ 0xA001;
                    }                    

                }
              
            }
        }

Результат получается правильный 0X3EE7.
Переписал практически один в один под Verilog, обмен с модулем crc_mobus проверил 10 раз все работает.
Результат правильный но сдвинут 0X003E. Почему так получается куда смотреть уже мыслей нет.
Код
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
module crc_mobus(input clck, input datacrcini,input datacrcnew, input[7:0]datain, output[15:0] crcout, output crcrd);
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
reg[15:0] countcrc      = 0;
reg[3:0] counterbytes   = 0;
reg[3:0] statucountcrc  = 0;

reg crcrdy     = 0;
reg loaddata   = 0;
reg bitlsb     = 0;
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
always @(posedge clck)
begin
    if(datacrcini)
    begin
        
        crcrdy          = 0;
        loaddata        = 0;
        statucountcrc   = 0;
        counterbytes    = 0;    
        countcrc[15:0]  = 16'b1111111111111111;
    end
    else if(datacrcnew) begin    
        if(loaddata == 0)
        begin
            loaddata      = 1;    
            crcrdy        = 0;
            counterbytes  = 0;                        
            countcrc[15:0] = {8'b00000000,datain[7:0]} ^countcrc[15:0];
            statucountcrc = 0;
        end
    end
    else begin        
        
        if(counterbytes < 8)
        begin
        
            case(statucountcrc)
            0:
            begin
                bitlsb = countcrc[0];
                statucountcrc = 1;
            end
            
            1:
            begin    
                countcrc  = countcrc>>1;                
                statucountcrc = 2;
            end
            
            2:
            begin
                if(bitlsb)
                begin
                    countcrc = countcrc ^ 16'b 1010000000000001;
                end                
                counterbytes  = counterbytes +1;
                statucountcrc = 0;                
            end
            
            default:
            begin
                statucountcrc = 0;
            end
            endcase    
            
        end
        else begin                
            crcrdy = 1;
            loaddata = 0;
        end
        
    end
    
end
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//

assign crcout = countcrc;
assign crcrd  = crcrdy;
    
endmodule
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 07:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016