И для начала решил просто выдавать на шину данных последние 8 бит шины адреса. Планировалось получить что-то типа пилы.
Тактовая частота CLK_IN 100 МГц.
Набросал код:
Код
module sram_test(
input [12:0] ADDR,
output[7:0] DATA,
input wire OE,
input wire RESET,
input wire CLK_IN,
output TEST_1,
output TEST_2,
output TEST_3
);
reg[ 7 : 0 ] DATA_r;
reg[ 12: 0 ] ADDR_r;
reg[ 7 : 0 ] time_r;
reg[ 1 : 0 ] state_r;
reg rd_strobe;
always @( posedge CLK_IN ) begin
if( ~RESET ) begin
state_r = 0;
end else begin
case( state_r )
0:
if( ~OE ) begin
state_r = 1;
time_r = 2;
ADDR_r = ADDR;
end
1:
begin
time_r = time_r - 1'b1;
if( time_r == 0 ) begin
rd_strobe = 1;
time_r = 2;
state_r = 2;
end
end
2:
begin
time_r = time_r - 1'b1;
if( time_r == 0 ) begin
rd_strobe = 0;
state_r = 3;
end
end
3:
if( OE )
state_r = 0;
default: state_r = 0;
endcase
end
end
always @( posedge rd_strobe ) begin
DATA_r <= ADDR_r[ 7 : 0 ];
end
assign TEST_1 = OE;
assign TEST_2 = DATA_r[ 0 ];
assign TEST_3 = rd_strobe;
assign DATA = DATA_r;
endmodule
input [12:0] ADDR,
output[7:0] DATA,
input wire OE,
input wire RESET,
input wire CLK_IN,
output TEST_1,
output TEST_2,
output TEST_3
);
reg[ 7 : 0 ] DATA_r;
reg[ 12: 0 ] ADDR_r;
reg[ 7 : 0 ] time_r;
reg[ 1 : 0 ] state_r;
reg rd_strobe;
always @( posedge CLK_IN ) begin
if( ~RESET ) begin
state_r = 0;
end else begin
case( state_r )
0:
if( ~OE ) begin
state_r = 1;
time_r = 2;
ADDR_r = ADDR;
end
1:
begin
time_r = time_r - 1'b1;
if( time_r == 0 ) begin
rd_strobe = 1;
time_r = 2;
state_r = 2;
end
end
2:
begin
time_r = time_r - 1'b1;
if( time_r == 0 ) begin
rd_strobe = 0;
state_r = 3;
end
end
3:
if( OE )
state_r = 0;
default: state_r = 0;
endcase
end
end
always @( posedge rd_strobe ) begin
DATA_r <= ADDR_r[ 7 : 0 ];
end
assign TEST_1 = OE;
assign TEST_2 = DATA_r[ 0 ];
assign TEST_3 = rd_strobe;
assign DATA = DATA_r;
endmodule
Задумал такую логику:
1. Жду активности OE, и запоминаю состояние шины адреса в этот момент
2. Через 2 такта делаю активным сигнал строба длиной также два такта. По фронту строба выдаю на шину данных младшие 8 бит запомненого адреса.
3. Жду пока OE станет неактивным и обратно к п.1.
Для проверки, я контроллером читаю последовательно 1024 байт и смотрю на прочитанный массив.
В результате получается пила но на ней постоянно в разных местах есть какие-то помехи и имеют они разную форму( синий график на картинке ).
Если я в послднем Always блоке заменяю сохраненый регистр ADDR_r на прямое подключение к шине адреса ADDR то картинка становится идеальной( зеленый график ).
Нажмите для просмотра прикрепленного файла
Помогите понять, почему так происходит.