正如标题所示,ISE无法从我的代码中推断出Block 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的写使能信号。如果我通过编写
将其设置为VCCif(1'b1)
RAM[addr] <= rx_data;
ISE推断RAM没有问题。但是,这不是我的预期行为。我希望写使能信号为
assign we = new_rx_data && !hold && start;
无论我分配给哪个寄存器&#34;我们&#34; ISE告诉我,它将推断分布式RAM。有没有人以前处理过这个问题?
答案 0 :(得分:0)
您可能需要解决一些问题。我看到你正在使用new_rx_data来分配我们。我没有在你的RTL中看到它被分配。它漂浮了吗?还是输入?
Addr在IF和ELSEIF中分配。没有ELSE,所以在我看来这意味着它在某些条件下不会被分配。也许它只是保留了价值,但同样不是我喜欢这样做。
另一个是您使用非阻塞分配进行分配,并且可能两次分配相同的变量(请参阅new_tx_data),但我无法确定它将如何合成。如果它是不可合成的,我希望构建会崩溃,但它确实会构建,你可能会得到意想不到的结果。
话虽如此,您需要修复这些内容以确保模拟结果与实际结果相符。你是一个模拟器,他说奇怪的球分配是可以的,物理综合工具可以用不同的方式解决问题,这两个结果可能会有所不同。
所以,你需要做的第二件事是检查你的警告。综合工具会抱怨事情,它可能包含对您正在使用的某些信号的有害警告。如果您正在使用的其中一个信号(在您的分配我们的声明中检查这三个信号)被认为总是卡在高位或总是卡在低位,您可能有一个意味着您无法写入的状态,或者您无法阅读,或两者兼而有之。这将导致无法推断RAM。制作不能写的记忆没有意义吗?你总是会读零,所以我只是硬连接数据总线为零并完成它。