XC6SLX16 + Verilog = странно работающий фильтр

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
sirrus
Родился
Сообщения: 2
Зарегистрирован: Сб ноя 13, 2010 02:14:24

XC6SLX16 + Verilog = странно работающий фильтр

Сообщение sirrus »

Я не нашел отдельного форума по ПЛИС(почему-то казалось, что он раньше был), так что решил написать сюда. Я написал на верилоге модуль, который ищет во входном потоке заданный набор байтов. Работает модуль как НКА и у него есть два входа - под тактовый сигнал и 8-битная шина, по которой на каждом такте подаются байты входного потока; основной выход - порт MATCH, на нем в течение 1 такта должна появляться 1, в случае, если заданная последовательность байтов(в этом случае это 0х23 0х32 0хВ7) была в нем найдена, остальные 3 выхода были добавлены исключительно в отладочных целях.
А теперь перейду к проблеме - вся эта красота замечательно работает в симуляторе, причем и с длинными последовательностями байтов; но на железе, то есть Xilinx'овской плате SP601 с фпгашечкой, указанной в названии темы, оно уже работает не так хорошо. При поиске одного байта или последовательно стоящих двух байтов все работает нормально. Стоит добавить третье состояние с новым байтом, как такая последовательсть уже не находится (хотя точно известно, что она встречается). На четырех, пяти и тд байтах все тем более не находится. Тут надо отметить, что поиск последовательности байт1-байт1-байт2 или (произвольное кол-во байт1)-байт2 и им подобных с только 2мя различными байтами работает. В железке тактовая частота равна 125 МГц, была мысль, что где-то возникают задержки или сдвиговые регистры не успевают считывать/двигать - но вроде бы успевают. Может у кого-то появятся мысли, что может вызвать такую проблему?

Если нужно, могу добавить схемы, синтезируемые для модулей(но так как спойлеров нету, они займут многовато места)
P.S. Ниже приведен код модулей
Модуль-фильтр RE_FILT_MAC

Код: Выделить всё

`timescale 1ns / 1ps
module RE_FILT_MAC(
    input [7:0] CHAR_IN,
    input CLK,
    output led_out,
    output led_out1,
    output led_out2,   
    output MATCH
    );
       
wire state1_out;
wire state2_out;
wire state3_out;
wire state4_out;
wire state5_out;
 
RE_STATE #(.WIDTH(1'b0), .PATTERN(8'h23)) state1 (.STATE_IN(1'b1),       .CHAR_IN(CHAR_IN), .CLK(CLK), .STATE_OUT(state1_out));
RE_STATE #(.WIDTH(1'b0), .PATTERN(8'h32)) state2 (.STATE_IN(state1_out), .CHAR_IN(CHAR_IN), .CLK(CLK), .STATE_OUT(state2_out));
RE_STATE #(.WIDTH(1'b0), .PATTERN(8'hB7)) state3 (.STATE_IN(state2_out), .CHAR_IN(CHAR_IN), .CLK(CLK), .STATE_OUT(MATCH));
assign led_out = state2_out;
assign led_out1= state1_out;
assign led_out2= state3_out;
endmodule

Модуль-состояние RE_STATE

Код: Выделить всё

`timescale 1ns / 1ps
module RE_STATE(
    input [WIDTH:0] STATE_IN,
    input [7:0]CHAR_IN,
    input CLK,
    output STATE_OUT
    );
   
parameter WIDTH = 1'b0;
parameter PATTERN = 8'hFF;

wire TO_SR;
assign TO_SR = ((|STATE_IN) && (CHAR_IN == PATTERN));
SR shift_reg (.DATA(TO_SR), .CLK(CLK), .Q(STATE_OUT));

endmodule


Модуль-сдвиговый регистр SR

Код: Выделить всё

`timescale 1ns / 1ps
module SR(
    input DATA,
    input CLK,
    output Q
    );

reg [0:1] store;

always @(CLK)
begin
   if(CLK)
      store[1] <= store[0];
   else
      store[0] <= DATA;
end;

assign Q = store[1];

endmodule

Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»