打印
[verilog]

自定义ram问题

[复制链接]
3734|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sen19890606|  楼主 | 2013-10-4 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sen19890606 于 2013-10-4 17:05 编辑

新手写了一个FPGA接受ARM指令的程序,将三个20位的指令分为15个时钟依次写进FPGA(每次写4位),原理是先写入ram缓存,写完后再读进FPGA。
但是为什么寄存器组没有综合成ram呢,这样消耗好多寄存器资源。如果我把寄存器组定义为reg [3:0] wbuffer [0:31],即将寄存器组扩大后, 就可以综合为ram,但读写又会出现问题,出现如下警告
Warning: Inferred dual-clock RAM node "d2fpga:d2fpga|buffer_rtl_0" from synchronous design logic.  The read-during-write behavior of a dual-clock RAM is undefined and may not match the behavior of the original design.
请大神指点
module d2fpga(en,wclk,clk,data,control,over,ST,ED,FS);
//control高电平有效,写buffer使能,需一直保持高电平,否则wpt会被清零,影响之后的参数读取;
//over在参数存储完毕后,保持高电平直至en清零
//data由wclk控制写入,在control高电平期间每个上升沿写一组
input en,clk,wclk,control;
input [3:0] data;
output reg over;
output reg [19:0] ST,ED,FS;
reg [3:0] wbuffer [0:15];
///////////////////////////////////////////
reg [3:0] wpt;
always@(posedge wclk or negedge control)
begin
    if(!control)
    wpt<=4'd0;
         else
         begin
             wbuffer[wpt]<=data;
                  wpt<=wpt+4'd1;
         end
end
////////////////////////////////////////
reg ready1,ready;
wire ready2;
assign ready2=(wpt==4'd15)?1'b1:1'b0;
always@(posedge clk or negedge en)
begin
    if(!en)
         begin
             ready1<=1'b0;
                  ready<=1'b0;
         end
         else
         begin
             ready1<=ready2;
                  ready<=ready1;
         end
end
///////////////////////////////////////
reg [3:0] rpt;
always@(posedge clk or negedge en)
begin
    if(!en)
         begin
             rpt<=4'd0;
        ST<=20'd0;
                  ED<=20'd0;
                  FS<=20'd0;
                  over<=1'b0;
         end
         else
         begin
             if(ready)
                  begin
                      case(rpt)
                 0:   begin ST[3:0]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 1:   begin ST[7:4]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 2:   begin ST[11:8]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 3:   begin ST[15:12]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                                4:   begin ST[19:16]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 5:   begin ED[3:0]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 6:   begin ED[7:4]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 7:   begin ED[11:8]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 8:   begin ED[15:12]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                                9:   begin ED[19:16]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 10:   begin FS[3:0]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 11:   begin FS[7:4]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 12:   begin FS[11:8]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                 13:   begin FS[15:12]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                                14:   begin FS[19:16]<=wbuffer[rpt];rpt<=rpt+4'd1;over<=1'b0; end
                                default:   begin ST<=ST;ED<=ED;FS<=FS;rpt<=rpt;over<=1'b1; end
                                endcase
                  end
                  else
                  begin
                      ST<=ST;
                                ED<=ED;
                                FS<=FS;
                                over<=over;
                                rpt<=rpt;
                  end
         end
end
endmodule


相关帖子

沙发
haitaox| | 2013-10-10 14:31 | 只看该作者
我建议你用ip生成一个ram,然后例化到你的代码中

使用特权

评论回复
板凳
sen19890606|  楼主 | 2013-10-10 21:40 | 只看该作者
haitaox 发表于 2013-10-10 14:31
我建议你用ip生成一个ram,然后例化到你的代码中

ip貌似比较麻烦吧,这个直接定义如果搞好的话是不是比那个简单啊

使用特权

评论回复
地板
haitaox| | 2013-10-10 22:15 | 只看该作者
sen19890606 发表于 2013-10-10 21:40
ip貌似比较麻烦吧,这个直接定义如果搞好的话是不是比那个简单啊

习惯了也就不麻烦吧,我习惯xilinx的器件,用coregen生成一个ram核就好了。
而且ram是有很多种类的,不同类型的ram其接口时序也是不一样的。
你这样用代码写的memory,软件有可能不会综合成ram,而是直接用ff代替。

使用特权

评论回复
5
cuttler| | 2013-10-11 13:51 | 只看该作者
1.我记得xilinx的ram只能同步复位,你用异步的了,同warning;使用wbuffer的时候同步复位或者你直接不要复位
2.貌似还可以再加约束

使用特权

评论回复
6
bestray| | 2014-9-12 11:24 | 只看该作者
楼主自己搭,你确定比ipcore省资源高性能???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

21

帖子

0

粉丝