А теперь перейду к проблеме - вся эта красота замечательно работает в симуляторе, причем и с длинными последовательностями байтов; но на железе, то есть 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