Привет, ребята, так что я очень новичок в Verilog и Fpga, так что извините, если я упустил что-то очень простое. Я пытаюсь подключить внешнюю SRAM, которую я хотел бы проверить на работоспособность. Я написал этот код вместе с тестовым стендом, чтобы проверить его. Я попытаюсь просто записать и прочитать некоторые данные, чтобы убедиться, что устройство работает правильно. Поскольку я буду пытаться протестировать это на макетной плате, я сначала попытаюсь снизить частоту clk, на которой моя программа будет работать, со 100 МГц до 12 МГц, используя IP-мастер синхронизации в Vivado. Проблема, похоже, в том, что мой вывод из мастера тактирования не работает должным образом и будет выводить только один импульс с неправильной частотой.
топ.v:
`timescale 1ns / 1ps
module TOP(
input clk,
input btn,
output reg[7:0] io,
output WE,
output OE,
output CE_0,
output CE_1
);
clk_wiz_0 clktwelve
(
// Clock out ports
.clk_out1(clk0), // output clk_out1
// Status and control signals
.clk_in1(clk) // input clk_in1
);
wire clk1 = clk0;
reg output_enable;
reg write_enable;
reg chip_enable_low;
reg chip_enable_high;
reg[7:0] cnt=8'd0;
always @ (posedge clk1 )
if (btn==1)
begin
output_enable = 1'b0;
write_enable = 1'b1;
chip_enable_low = 1'b1;
chip_enable_high = 1'b0;
io[0] = 1'bz;
io[1] = 1'bz;
io[2] = 1'bz;
io[3] = 1'bz;
io[4] = 1'bz;
io[5] = 1'bz;
io[6] = 1'bz;
io[7] = 1'bz;
end
else begin
output_enable =1'b0;
write_enable = 1'b0;
chip_enable_high = 1'b1;
chip_enable_low = 1'b0;
if (cnt<255) cnt=cnt+1'b1;
else cnt=8'd0;
io=cnt;
end
assign OE = output_enable ;
assign WE = write_enable ;
assign CE_0 = chip_enable_low;
assign CE_1 = chip_enable_high;
endmodule
ИСПЫТАТЕЛЬНЫЙ СТЕНД:
`timescale 1ns / 1ps
module TOP_TB();
reg clk;
reg btn;
wire [7:0] io;
wire WE;
wire OE;
wire CE_0;
wire CE_1;
TOP testbench1 (
.clk(clk),
.btn(btn),
.io(io),
.WE(WE),
.OE(OE),
.CE_0(CE_0),
.CE_1(CE_1)
);
initial begin
btn = 1;
clk = 0;
#200 btn = 0;
#500000 $finish;
end
always #10 clk = ~clk;
endmodule
Я планирую в конечном итоге спроектировать печатную плату и протестировать асинхронный sram на максимальной частоте 100 МГц, любой совет полезен!
Кстати, я использую ARTY A7 35T.
Я попробовал этот простой код, чтобы решить проблему, и до сих пор не могу получить чистый ответ.
`timescale 1ns / 1ps
module top(
input clk,
output clk0
);
clk_wiz_0 instance1
(
// Clock out ports
.clk_out1(clk0), // output clk_out1
// Clock in ports
.clk_in1(clk) // input clk_in1
);
endmodule
и тестовый стенд:
`timescale 1ns / 1ps
module TB(
);
reg clk;
wire clk0;
top instance1 (
.clk(clk),
.clk0(clk0)
);
initial begin
clk = 0;
end
always #10 clk = ~clk;
endmodule
результат:
Почему вы хотите перевести часы? Есть дополнительные осложнения; например часовой домен пересечения. Оперативная память на вашей плате не поддерживает 100 МГц?
@Mikef эта часть не интегрирована в мою плату, поэтому я подключаю ее к макетной плате с помощью соединительных кабелей. Я думаю, что мне придется еще больше замедлить часы примерно до 2 МГц. Однако ваш ответ решил мою проблему! после того, как я дождался заблокированного сигнала и увеличил время симуляции, все заработало отлично, большое спасибо!
Xilinx MMCM (многочасовой менеджер), сгенерированный Мастером синхронизации, имеет активный высокий сброс.
Сброс должен быть установлен в течение нескольких тактов, а затем отпущен, чтобы MMCM мог синхронизироваться.
После сброса MMCM может занять 1000 часов для синхронизации.
Ваша симуляция, возможно, просто должна работать дольше.
MMCM имеет заблокированный выход, который активируется при внутренней синхронизации.
Я рекомендую, чтобы этот сигнал был инструментирован в вашем испытательном стенде, чтобы вы могли видеть, когда он получил синхронизацию.
Имитационная модель MMCM, созданная Vivado, должна быть скомпилирована как часть моделирования.
Некоторые IP Xilinx должны иметь точную шкалу времени для моделирования. Попробуйте шкалу времени 1 пс / 1 пс.
Правильно ли вы настроили/подключили сигнал сброса FPGA PLL? Типичное приложение PLL требует сигналов сброса и блокировки, чтобы убедиться, что выход тактового сигнала PLL начинается с известного состояния.