请教:多端口ROM的verilog设计问题
但是我的程序里面,一次需要用到ROM里面的四个数据,就是输入四个地址,得到四个输出数据。当然可以一次得到一个数据,用四个周期的时间。但是我希望最好能一个周期就得到四个数据。
请问高手有什么办法可以实现吗?先谢谢!
网上找到的ROM代码:
module v_rams_21a (clk, en, addr, data);
input clk;
input en;
input [4:0] addr;
output reg [3:0] data;
always @(posedge clk) begin
if (en)
case(addr)
5'b00000: data <= 4'b0010;
5'b00001: data <= 4'b0010;
5'b00010: data <= 4'b1110;
5'b00011: data <= 4'b0010;
5'b00100: data <= 4'b0100;
5'b00101: data <= 4'b1010;
5'b00110: data <= 4'b1100;
5'b00111: data <= 4'b0000;
5'b01000: data <= 4'b1010;
5'b01001: data <= 4'b0010;
5'b01010: data <= 4'b1110;
5'b01011: data <= 4'b0010;
5'b01100: data <= 4'b0100;
5'b01101: data <= 4'b1010;
5'b01110: data <= 4'b1100;
5'b01111: data <= 4'b0000;
5'b10000: data <= 4'b0010;
5'b10001: data <= 4'b0010;
5'b10010: data <= 4'b1110;
5'b10011: data <= 4'b0010;
5'b10100: data <= 4'b0100;
5'b10101: data <= 4'b1010;
5'b10110: data <= 4'b1100;
5'b10111: data <= 4'b0000;
5'b11000: data <= 4'b1010;
5'b11001: data <= 4'b0010;
5'b11010: data <= 4'b1110;
5'b11011: data <= 4'b0010;
5'b11100: data <= 4'b0100;
5'b11101: data <= 4'b1010;
5'b11110: data <= 4'b1100;
5'b11111: data <= 4'b0000;
endcase
end
endmodule
最简单的方法是:复制成为4个一模一样的ROM;
方法二:真正的MACRO中ROM一般是双口的,即2端口可读,也有三口或者四口的ROM;如果双口的ROM,则例化2个。
方法三:提升ROM的频率,ROM可以运行到你其他部分工作频率的2倍或者4倍,然后分4拍搞定低频中4个端口中的读请求,需要注意读的Lattency。
这个不难吧,反正这个写的东西综合后也是假的ROM, RIGESTER BANK
从仿真角度来说,或者verilog角度来说。可以任意多端口的读写。
但是,关键要从实现的角度,如果是ASIC,你需要看lib库里面有没有这种ROM,对于FPGA你要看你选择的FPGA器件内有无这种ROM。
如果你要自己利用单口ROM做成4口的话,那么需要pipeline。
我用的是ISE design suite, 关于具体选哪个没有规定。谢谢回复啊!
不知道还有没有别的方法啊?期待……
看来用4个并列的ROM比较适合LZ。
我的代码后面还会有一个周期需要ROM里面32个数据的情况,难道要调用ROM模块32次?
只能说你的设计有问题,一个周期要从ROM里面读取32个数据,难道需要32个端口的ROM不成?修改和优化你的设计吧。
设计应该没问题……因为我的代码涉及到一个周期并行处理4个或者32个数据,数据处理完后要存到RAM。存数据时相应的地址需要从ROM读出来,所以才会希望一个周期能从ROM读几个数
可能一个解决办法就是多次实例化ROM,用generate实现,这样不用重复写很多遍
没错,你要做资源的优化配置。
1. 如果FPGA资源不够,那么你需要优化算法,比如你现在一个周期读32个,跑到10M频率,那么你现在可以用20M频率,这样你只需要16个ROM就可以了。因为,从你的描述中来看,你每个ROM存的东西都一样。为什么要复制这么多次?非常浪费资源。
2. 如果FPGA资源足够,那就随意了。
所有的这些都需要设计人员来权衡以做决策。
学习学习
按照你的设计 实例化 没有提高时钟频率方便;前提是处理数据的时钟不高
