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

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

Сообщение 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

Реклама
Закрыто

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