用Verilog编写8位的1024存储单元的双口ROM 出错

要使标号为1的控制线 cs1,wr1,rd1,数据线data1,地址线add1优先级高于标号为2的。

以下是我写的,我感觉不太对,就是读写的优先操作有些问题,不过没有语法错误
module ram_1024(cs1,cs2,wr1,rd1,wr2,rd2,data1,data2,add1,add2);

input cs1,cs2,wr1,rd1,wr2,rd2;
inout[7:0]data1,data2;
input[9:0]add2;
input[9:0]add1;
reg[7:0] ram[1023:0];

assign data1=((!cs1&&!rd1)&&(cs1||wr1)&&(cs2||wr2))?ram[add1]:8'bzz;
assign data2=((!cs2&&!rd2)&&(cs1||wr1)&&(cs2||wr2))?ram[add2]:8'bzz;

always@( cs1 or wr1 or wr2 or cs2 )
begin
if(add1==add2)
begin
if(!cs1&&!wr1) ram[add1]=data1;
else if(!cs2&&!wr2) ram[add2]=data2;
end
else if(!cs1&&!wr1) ram[add1]=data1;
else if(!cs2&&!wr2) ram[add2]=data2;
end
endmodule

还有我在quartusii中用的device是EPIC6Q240C8,当我在bdf文件中用我编的这个rom的时候会有错
Error: Design contains 14830 blocks of type logic cell. However, device contains only 5980.
以上个人理解为该器件的门少了,不能构成这么大存储空间的rom,不知对不对。
Error: Can't fit design in device

小弟我刚学,请高手指点一下
希望能给个双口rom的代码,我不胜感激。
以下的有clock,但依然通不过啊,

module RAM_TWO_IO
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=10)
(
input [(DATA_WIDTH-1):0] data_a, data_b,
input [(ADDR_WIDTH-1):0] addr_a, addr_b,
input rd_a, wr_a,rd_b,wr_b,clk_a,clk_b,
output reg [(DATA_WIDTH-1):0] q_a, q_b
);

// Declare the RAM variable
reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];

always @ (posedge clk_a)
begin
// Port A
if (!wr_a)
begin
ram[addr_a] <= data_a;
end
else if(!rd_a)
begin
q_a <= ram[addr_a];
end
end

always @ (posedge clk_b)
begin
// Port B

if (!wr_b)
begin
ram[addr_b] <= data_b;
end
else if(!rd_b)
begin
q_b <= ram[addr_b];
end

end
endmodule

第1个回答  2010-08-09
quartusii查下有没这样的RAM,如果有那就直接例化。
另外你的RAM没有时钟?所以你这样写压根也不是寄存器搭建的RAM

最后想说的是,从后端考虑,用寄存器搭建的RAM timing没有例化的好

针对你的问题:直接quartus有memory的选项的,选dual port
第2个回答  2010-08-06
双口RAM可以使用芯片内部RAM,使用寄存器阵列仅限于小容量和高速度才使用,你做的RAM已经大大的超出了EP1C6Q240的容量!!!
第3个回答  2010-08-15
用quartus一编译、综合就可以看出你的问题所在。
你第一个程序:一堆warning不知道你有没有注意
1.always里条件没写全;
2.你有if没else,这样会综合很多latch,导致你的存储单元不够用。
这样的程序实在太糟糕了。
第二个程序:哎~ 自己看,别觉得warning不重要!!!!! 给你个提示吧:你很喜欢有if没else 也不喜欢加个复位信号
第4个回答  2010-08-07
Cc three external network star - the latest available version of the Three Kingdoms cc cc plug network plug-star network star the three - the latest available version of the Three Kingdoms cc cc plug network plug-star network star the three - the latest available version of the Three Kingdoms cc cc plug network plug-star network star the three - the latest available version of cc cc plug network plug-star three star three networks - the latest available version of the Three Kingdoms 1 cc external network star. beta period, there were commemorative Magic 【】 loading debris. No shots, is the task, some tasks to do, and some did not get. 40 a hair,loco gold, a face 60, 100 piece of clothing (total 200,boi gold, permanent, you slowly brush) inside: brush chart, graph brush or brush map ... 2. And then loaded debris】 【magic. 15 a hair, a set of clothes 30. (Each is 30 days) drop: Speed, chest,wow power leveling, Dynasty Warriors chest, chest Wenquxing (answer) 3. Again is loaded coupon】 【magic. 3 a piece of clothing or hair, for 7 days. Fall: the same fragments】 【commemorative fashion, brush chart. 4. There is mounted coupon】 【special magic. Are three piece of clothing or hair, is 7 days. Fall: not encountered little brother, not sure of Kazakhstan, may open chest ... So where screenshot is intercepted NPC. Who much know where, please add. 5. The most exciting time to】 【achievement badges on the six drawings,Runes of Magic gold, no need to capture the bar. Is permanent,www.wowlv.com, only 50 badges, there are probably about 50 20J about it! Rejoice! Amount, however,4Story Gold, is the exchange of drawings, should make their own materials? As long as you have to pick something brush chart,Apb gold, there are many many. Family crests to do the task. However, it also is easy to take. Let every family received the task, must have a lot a lot a lot ... and very excited to do to come out to lottery,Aika gold, and I wish you shake a good-looking.
\
第5个回答  2010-08-15
所谓双口RAM,是在一个SRAM 存储器上具有两套完全独立的数据线、地址线和读写控制线,并允许两个独立的系统同时对该存储器进行随机性的访问。即共享式多端口存储器。
因为数据共享,就必须存在访问仲裁控制,对同一地址单元访问的时序进行控制,对存储单元数据块的访问进行权限分配等。
在你的第二个程序中,没有优先级控制,在两个always块中同时对ram变量进行赋值,这是典型的多重驱动问题。
因此,写操作必须在一个always中完成,读操作可在两个always中完成。如果不考虑先写后读,程序如下:
module ram_io2(data_a, data_b,addr_a, addr_b,rd_a, wr_a,rd_b,wr_b,clk_a,clk_b,q_a, q_b);
parameter DATA_WIDTH=8;
parameter ADDR_WIDTH=10;
input [(DATA_WIDTH-1):0] data_a, data_b;
input [(ADDR_WIDTH-1):0] addr_a, addr_b;
input rd_a, wr_a,rd_b,wr_b,clk_a,clk_b;
output [(DATA_WIDTH-1):0] q_a, q_b;
reg [(DATA_WIDTH-1):0] q_a, q_b;
// Declare the RAM variable
reg [DATA_WIDTH-1:0] mem1 [(2**ADDR_WIDTH)-1:0];
always @ (clk_a,clk_b)
begin
// WRITE
if (!wr_a)
mem1[addr_a]<=data_a;
else if(!wr_b)
mem1[addr_b]<=data_b;
end

always @ (posedge clk_a)
begin
// Port A READ
if (!rd_a)
q_a <= mem1[addr_a];
else
q_a <=8'bzz;
end

always @ (posedge clk_b)
begin
// Port B READ
if (!rd_b)
q_b <= mem1[addr_b];
else
q_b <= 8'bzz;
end
endmodule本回答被提问者采纳

用Verilog编写8位的1024存储单元的双口ROM 出错
最后想说的是,从后端考虑,用寄存器搭建的RAM timing没有例化的好 针对你的问题:直接quartus有memory的选项的,选dual port

FPGA\/Verilog中的Rom问题
在FPGA中ROM是一个地址对应一个数据,8bits×1024words的Rom就是指地址从0~1023,每个地址是一个8bits数据。12864液晶是128列×64行,那么这个液晶总共的数据量为128×64=8192。而ROM的数据存错量为1024×8bits = 8192 bits,也就是说ROM内1个地址的数据对应液晶上8的点。至于图片怎么存在ROM内的,...

verilog编程技巧
将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM)、 FIFO 等。在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ;在第 2 个缓冲周期,通过 “ 输入数据选择单元 ”的切换,将输入的数据流缓存到 “ 数据缓冲模块 2” ,...

verilog实现矩阵乘法,我是FPGA初学者, 现在要实现一个矩阵相乘,即输入...
1把两个矩阵存进存储单元(寄存器),是怎样的时钟去写入数据的 如果A B是变量,数据就需要写入存储器而不是初始化进去,写入遵循存储器写入时序。2 如何取出数据进行乘法运算并累加,看到常用的是脉动阵列,但是我不是很懂 提供矩阵元素的地址,从存储器中读出,脉动阵列就是流水线结构。3.在软件编程...

相似回答