打印
[Actel FPGA]

请熟悉verilog的高手们帮忙分析一下我的代码

[复制链接]
1960|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无语凝咽|  楼主 | 2010-1-4 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用actel的030芯片实现显卡功能,fpga外扩一片ram作为显存,首先我需要实现CPU读写显存,我的代码如下:

module cpuRamPort( clk,rst,pRs,pRd,pWr,pCs,pBus,rAddr,rBus,rCs,rRd,rWr,rgbAddr,rgb );
    input clk;
    input rst;
    input pRs,pRd,pWr,pCs; //pRs为指令、数据选择,其他为CPU的读写fpga的控制信号
    inout [7:0] pBus;  //CPU与FPGA之间的总线
    output [16:0] rAddr; //外扩RAM的地址总线
    inout [7:0] rBus;  //外扩RAM的数据总线
    output reg rCs,rRd,rWr; //外扩RAM的片选、读、写控制
    input [16:0] rgbAddr; //液晶显示地址
    output reg [7:0] rgb; //从ram中读取提供给液晶的RGB信号
    reg [3:0] insReg;  //fpga内的指令寄存器
    reg [1:0] stat;  //RAM接口状态机
    reg [7:0] ramData;          //从RAM的portAddr单元读取的数据
    reg [7:0] portData;  //CPU待写入ram的数据
    reg portNew;  //CPU写数据标志
    reg ramAck;   //ram保存CPU数据应答
    reg [16:0] portAddr; //CPU读写ram的地址
   
    //cpu与fpga的接口,实现cpu把数据写入portData,并指定ram地址portAddr
    assign pBus = ( pRs==1 && pCs==0 && pRd==0 )? ramData:'8'hzz; //当cpu读取显存时,输出ramData
    always @ ( posedge pWr or posedge ramAck )    //当pWr或ramAck时触发
    begin
if( pWr )
begin
     if( pCs==0 )
     begin
  if( pRs==0 )   
      insReg = pBus[3:0];   //当pRs为0时CPU把数据写入insReg寄存器
  else
  begin
      case(insReg)
   4'h0:portAddr[7:0] = pBus; //如果insReg==0则写入portAddr的低8位
   4'h1:portAddr[15:8] = pBus; //如果insReg==1则写入portAddr的高8位
   4'h2:begin
    portData = pBus; //如果insReg==2则写入portData,并且置portNew标志
    portNew = 1;     
        end
   4'h5:portAddr[16] = pBus[0]; //如果insReg==5则写入portAddr的最高位
      endcase  
  end
     end
end
else
begin
     portNew = 0;    //如果ramAck有效则清除portNew标志
     portAddr = portAddr+1;   //并且portAddr加1
end
    end

    //把CPU写入的数据写入ram,或把ram中的数据读出到ramData或rgb
    assign rAddr = (stat<2)? rgbAddr:portAddr;  //分时地址切换前2个节拍为rgbAddr
    assign rBus = (rCs==0 && rWr==0)? portData:8'hzz; //在写时序把来自cpu的数据portData输出到rBus总线
    always @ ( negedge rst or posedge clk )
    begin
if( !rst )
begin
     stat = 0;
     rCs = 1;
     rRc = 1;
     rWr = 1;
     ramAck = 0;
end
else
begin
     case(stat)
     2'b00:
                begin
                    rgb = rBus;    //在接拍0把rgbAddr地址中的数据读出到rgb寄存器
      rRd = 1;   
                    rCs = 1;
      rWr = 1;
      stat = stat+1;
  end
     2'b01:
  begin
      rCs = 0;
      if( portNew )
      begin
   rWr = 0;   //如果有来自CPU的数据则写RAM
    ramAck = 1;   //并且置ramAck
      end
      else
      begin
   rRd = 0;   //如果没有cpu写数据则把portAddr单元的内容读出到ramData
   ramAck = 0;
      end
      stat = stat+1;   
  end
     2'b10:
  begin
      if( !ramAck )ramData = rBus; //如果没有cpu写数据则把portAddr单元的内容读出到ramData
      portAck = 0;
      rCs = 1;
      rWr = 1;
      rRd = 1;  
      stat = stat+1;
  end
            2'b11:
  begin
      rRd = 0;    //开始RGB读取时序   
      rCs = 0;
      rWr = 1;
      stat = 0;
  end  
     endcase
end        
    end
endmodule

以上代码,我可以通过语法检查,也能通过综合,但是综合后的时序不正确,写入fpga后执行也不正确
我实在检查不出代码的错误在什么地方,请各位帮我分析分析


相关帖子

沙发
无语凝咽|  楼主 | 2010-1-4 16:24 | 只看该作者
是我的代码有问题还是libero有问题啊?实在没法子了,求各位高手们指点一下,我刚学fpga对verilog也不熟悉,因此一些问题不得其解,存在问题也分析不出原因

求各位不吝赐教,跪求

使用特权

评论回复
板凳
swolf| | 2010-1-5 19:45 | 只看该作者
阻塞赋值对时序影响很不好

使用特权

评论回复
地板
20801233| | 2010-1-5 20:28 | 只看该作者
阻塞赋值对时序影响很不好
swolf 发表于 2010-1-5 19:45

if else 以及case里多用非阻塞赋值

使用特权

评论回复
5
xiaoxin1986| | 2010-1-6 00:00 | 只看该作者
看别人的程序就是容易犯晕

使用特权

评论回复
6
beny5566| | 2010-1-6 18:47 | 只看该作者
综合后的时序不正确有可能是你的代码输入有歧义,
在综合的时候出错了吧。

使用特权

评论回复
7
liliang9554| | 2010-1-6 19:17 | 只看该作者
看别人的程序就是容易犯晕
xiaoxin1986 发表于 2010-1-6 00:00

高手一扫而过就知道哪有问题

使用特权

评论回复
8
lobby| | 2010-1-6 19:24 | 只看该作者
楼主你给加点注释,
要不大家没法帮你看啊。

使用特权

评论回复
9
3B1105| | 2010-1-6 22:34 | 只看该作者
什么是阻塞赋值呀?

使用特权

评论回复
10
bit6019| | 2010-1-6 23:38 | 只看该作者
晕,看不明白

使用特权

评论回复
11
swolf| | 2010-1-7 19:27 | 只看该作者
什么是阻塞赋值呀?
3B1105 发表于 2010-1-6 22:34

阻塞赋值和非阻塞赋值区别很大,
一般的Verilog语法规则里都会说的很仔细,
自己去看看吧。

使用特权

评论回复
12
20801233| | 2010-1-7 19:41 | 只看该作者
什么是阻塞赋值呀?
3B1105 发表于 2010-1-6 22:34

http://blog.**/lily1986/42199/post.aspx
你可以去这看看,
里边有详细的解释。

使用特权

评论回复
13
linux1| | 2010-1-7 21:53 | 只看该作者
楼上真是热心呀,学习了

使用特权

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

本版积分规则

88

主题

399

帖子

1

粉丝