正如标题所示,ISE 无法从我的代码中推断块 RAM。
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
我推断问题的根源是我的 RAM 的写使能信号。如果我通过写入将其设置为 VCC
if(1'b1)
RAM[addr] <= rx_data;
ISE 毫无问题地推断出 RAM。但是,这不是我的预期行为。我希望写使能信号是
assign we = new_rx_data && !hold && start;
无论我为“我们”分配什么寄存器,ISE 都会告诉我它会推断分布式 RAM。以前有人处理过这个问题吗?