求助verilog 编译的一个状态机无法运行 求助

2019-03-25 09:11发布

module ff(rw,oer,ce,lclk,busyr,lint_r,led,lblast,lserr,lads,lholda,lhold,la,lreseto,lwait,lready,lwr,lint,cs);
  input lads;     //address strobe form 9054
  input lhold;    //bus hold request from 9054
  input lblast;   //burst last from 9054
  input lreseto;  
  input lwr;
  input lint;
  input [3:0]la;
  input busyr;
  input lserr;
  input lwait;
  input lclk;
  
  output cs;
  
  output lready;
  output rw;
  output oer;
  output ce;
  output [3:0]led;
  output lholda;
  output lint_r;
  
  reg lholda;
  reg [3:0]led;
  wire cs;
  reg ce;
  reg oer;
  reg lint_r;
  reg [3:0]state,next_state;
  reg counter_ena;
  wire counter_ovf;
  reg counter_clear;
  reg [3:0]counter;
// wire lholda;
  reg lready;
  reg rw;
  //parameter X       =4'b1010;
  parameter IDLE    =4'b0000,
   RD_WR   =4'b0001,
   READ1   =4'b0010,
   READ2   =4'b0011,
   READ3   =4'b0100,
   READ4   =4'b0101,
   WRITE1  =4'b0110,
   WRITE2  =4'b0111,
   WRITE3  =4'b1000,
   WRITE4  =4'b1001;

  assign cs=(la==4'b1010)?0:1;
// assign lholda=(lhold==1&&busyr==1&&cs==1)?1:0;   
/*always@(posedge lclk or negedge lreseto)
  if(!lreseto)
  state<=IDLE;
  else
  state<=next_state;
  always@(state)
  begin
    next_state=4'b0000;
    case(state)
      IDLE:if(lhold&&busyr)
      next_state=RD_WR;
    else
      next_state=IDLE;
      RD_WR:if(lwr==1)
      next_state=WRITE1;
    else
      next_state=READ1;
      WRITE1:if(!lads)
      next_state=WRITE2;
    else
      next_state=WRITE1;
      WRITE2:
      next_state=WRITE3;
      WRITE3:if(!lblast)
      next_state=WRITE4;
    else
      next_state=WRITE1;
      WRITE4:if(!lhold)
      next_state=IDLE;
    else
      next_state=WRITE4;
      READ1:if(!lads)
      next_state=READ2;
    else
      next_state=READ1;
      READ2:next_state=READ3;
      READ3:if(!lblast)
      next_state=READ4;
    else
      next_state=READ1;
      READ4:if(!lhold)
      next_state=IDLE;
    else
      next_state=READ4;
    endcase
  end
*/
  always @(posedge lclk or negedge lreseto)
  begin
    if(!lreseto)
      begin
        state <=IDLE;
        lholda<=0;
        ce<=1;
        led[3:0]<=4'b0000;
        
      end
   
    else

      begin
      case(state)
        
        IDLE: begin
          led[3:0]<=4'b0001;
          if(cs==0&&lhold==1&&busyr==1)
            state<=RD_WR;  
          else
            state<=IDLE;
            lint_r<=1;
          end
         
        RD_WR:begin
          led[3:0]<=4'b0010;
          lholda<=1;
          if(lwr==1)
            state<=WRITE1;
          else
            state<=READ1;
          end
        
        READ1:begin
          led[3:0]<=4'b0011;
            rw<=0;
            ce<=1;
          if(lads==0)
            state<=READ2;
          else
            state<=READ1;
          end
  
        READ2:begin
          led[3:0]=4'b0100;
            lready<=0;
            rw<=1;
            state<=READ3;
          end

        READ3:begin
          led[3:0]<=4'b0101;
            ce<=0;
            oer<=0;
          if(lblast==0)
            state<=READ3;
          else
            state<=READ1;
          end
  
        READ4:begin
          led[3:0]<=4'b0110;
            lready<=1;
            ce<=1;
          if(lhold==0)
            state<=IDLE;
          else
            state<=READ4;
          end            
        WRITE1:begin
          led[3:0]<=4'b1000;
            rw<=1;
            ce<=1;
          if(lads==0)
            state<=WRITE2;
          else
            state<=WRITE1;
          end

        WRITE2:begin
          led[3:0]<=4'b1001;
            lready<=0;
            rw<=0;
            state<=WRITE3;
          end

        WRITE3:begin
          led[3:0]<=4'b1010;
            ce<=0;
          if(lblast==0)
            state<=WRITE4;
          else
            state<=WRITE1;
          end
   
        WRITE4:begin
          led[3:0]<=4'b1011;
            lready<=1;
            ce<=1;
            rw<=1;
          if(lhold==0)
            state<=IDLE;
          else
            state<=WRITE4;
          end            
          default state<=IDLE;
          endcase
      
      end
        /*always @(posedge lclk or negedge lreseto)
        begin
          if(lreseto==0)
          counter[3:0]=4'b0000;
          else if(counter_ena==1)
          counter[3:0]=counter+1;
          else if(counter_clear==1)
          counter[3:0]=4'b0000;
        end
        
        
        assign counter_ovf=(counter[3:0]==4'b1000);*/
        end
      endmodule      
测试文件
`timescale 1ns/1ns;
module pci_cpld_top;
  reg lclk;
  reg lhold;
  reg lads;
  reg lblast;
  wire lready;
  wire lint_r;

  reg lwr;
  wire lholda;
  reg busyr;
  reg [3:0]la;
  reg lreseto;
  wire [3:0]led;


  initial
  begin
  lclk=0;
  lhold=0;
  lads=1;
  lblast=1;
  lwr=1;
  busyr=1;
  lreseto=1;
  #10 lreseto=0;
  #10 lreseto=1;
  la[3:0]=4'b1010;

end
  always
  begin
  #10 lhold=1;
  #20 lads=0;
  #21 lads=1;
  #40 lblast=0;
  #20 lblast=1;
  #20 lhold=0;
  #30 lhold=1;
      
  #20 lads=0;
  #20 lads=1;
  #40 lblast=0;
  #20 lblast=1;
  #20 lhold=0;
end
always
begin
  #10 lclk=~lclk;
end
initial
#10000 $finish;

ff m(.lreseto(lreseto),.led(led),.lint_r(lint_r),.cs(cs),.la(la),.oer(oer),.lholda(lholda),.rw(rw),.lhold(lhold),.lads(lads),.lblast(lblast),.lready(lready),.ce(ce),.lwr(lwr));

endmodule 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
eeleader
1楼-- · 2019-03-25 13:04
< /

是语法错误还是逻辑问题?

fengsining
2楼-- · 2019-03-25 18:59
开始读或者写的时候,lhold拉低后,一个节拍后lholda信号拉低,然后等待lholda信号拉高,然后lhold信号才拉高。
eeleader
3楼-- · 2019-03-25 21:43
建议大家提问题时,不要直接贴一堆程序。应该先进行背景说明,介绍问题的背景,比如程序作用,目前存在的问题,需要大家帮助解决啥问题?

一周热门 更多>