Как следует из названия, у ISE возникают проблемы с выводом блочного ОЗУ из моего кода.
wire we;
reg hold = 0;
reg start = 0;
reg [12:0] addr = 0;
reg [23:0] command = 0;
reg [7:0] RAM [8191 : 0];
reg [7:0] rx_data_buffer = 0;
assign we = new_rx_data && !hold && start;
always@(posedge clk) begin
new_tx_data <= 1'b0;
if(!tx_busy && hold && !new_tx_data) begin
new_tx_data <= 1'b1;
addr <= addr + 1'b1;
tx_data_buffer <= RAM[addr];
if(addr == 13'd8191)
hold <= 0;
end
else if(new_rx_data && !hold) begin
addr <= addr + 1'b1;
command <= {command[15:0], rx_data};
if(addr == 13'd8191)
hold <= 1;
if(start)
led <= rx_data;
end
if(we)
RAM[addr] <= rx_data;
if(command == 24'h242424) //$$$ in ASCII
start <= 1;
end
Я пришел к выводу, что корень проблемы - это сигнал разрешения записи для моей оперативной памяти. Если я установлю VCC, написав
if(1'b1)
RAM[addr] <= rx_data;
ISE выводит RAM без проблем. Однако это не мое предполагаемое поведение. Я хочу, чтобы сигнал разрешения записи был
assign we = new_rx_data && !hold && start;
Независимо от того, какой регистр я назначаю «мы», ISE сообщает мне, что будет предполагать распределенную оперативную память. Кто-нибудь раньше занимался этим вопросом?