0

正如标题所示,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。以前有人处理过这个问题吗?

4

1 回答 1

0

你有几件事可能需要解决。我看到您正在使用 new_rx_data 来分配我们。我没有看到它在您的 RTL 中分配。是漂浮的吗?还是输入?

Addr 在 IF 和 ELSEIF 中分配。没有 ELSE,所以在我看来,这意味着它在某些情况下不会被分配。也许它只是保留价值,但我也不喜欢这样做。

另一个是您正在使用非阻塞分配进行分配,并且可能两次分配相同的变量(参见 new_tx_data),我无法确定这将如何合成。如果它是不可合成的,我希望构建会崩溃,但它确实构建了,你可能会得到意想不到的结果。

话虽如此,您需要修复这些问题以确保您的模拟结果与实际结果相匹配。您是一个说奇数球分配没问题的模拟器,而物理合成工具则以不同的方式解决了该问题,这两个结果可能会有所不同。

因此,您需要做的第二件事是检查您的警告。综合工具会抱怨一些事情,它可能包括关于您正在使用的某些信号的有害警告。如果您正在使用的信号之一(检查您的 assign we 语句中的这三个信号)据说总是卡在高位或总是卡在低位,那么您可能处于无法写入的状态,或者您可以' t 阅读,或两者兼而有之。这将导致无法推断 RAM。制作不可写的内存没有意义吗?你总是要读零,所以我会为你将数据总线硬连接到零并完成它。

于 2016-11-03T21:14:55.850 回答