[FPGA开发] Modelsim-Altera 10.1d问题,求大神帮忙

火热的冰西瓜   2016-4-30 18:46 楼主
我不知道这代码错是什么问题
  • 新手不知道是什么问题

回复评论 (7)

2推荐 habc987 

4楼正解,重新定义d和pulse
点赞  2016-5-2 21:34

2推荐 chenzhufly 

需要把d,pulse定义成reg型才可以在左侧赋值,默认是wire型的
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2016-5-2 11:04

2推荐 suifeng_lll 

端口类型如果不定义的话,默认为wire类型
在alwys模块中赋值的变量一般要定义为reg类型
“d”和“pulse”你如果没有定义类型,又在always模块里赋值,就冲突了
改正1:把他们定义为reg类型
      2:用连续赋值语句assign给他们赋值,
以后这种报错的,最好把源程序贴出来,这样别人能更好的帮助你,像你这样,我们还得猜是哪种情况
点赞  2016-5-1 00:42
   
    input clk;
    input Dir;   //方向控制
    input StepEnable; //开始,停止
    input onestep;  //单步
         input  jiasu;   //加速
         input  jiansu;   //减速
         
    output pulse;
    output d;
    output en;         
         
    reg[9:0] i=10'b0000000000;  //转的步数
    reg   pul=1'b0;
         reg[31:0] StepCounter = 32'b0;
         reg[31:0] StepLockOut = 32'd3000;             //250HZ
    reg[31:0] j= 32'd0;   
  
  always @(posedge clk or Dir) //方向控制
  begin
  if(Dir==1'd0)  
  d<=1'd0;
  else  d<=1'd1;
  end
  
  always @(posedge jiasu)  //加速
  begin
  if((StepLockOut+j)==32'd500)   ;
  else  StepLockOut <= StepLockOut - 32'd500;
  end
  
   always @(posedge jiansu) //减速
  begin
  if((StepLockOut+j)==32'd10000)   ;
  else  j<= j + 32'd500;
  end
  
  always @(posedge clk  or negedge onestep)
  begin      
          if ( !onestep)   
            begin
            pul<=1'b0;
            StepCounter <= 32'b0;
                                i<=10'b0000000000;
            end
          else  if(StepEnable==1'b0)  //一直转
                 begin
             StepCounter <= StepCounter + 31'b1 ;
             if (StepCounter >= (StepLockOut+j))                       
             begin
                                 StepCounter <= 32'b0 ;
                                 pul<= ~pul;
                      pulse <= pul;
                                 end                         
                                end
      else begin
            if (StepEnable==1'b1  && i<10'b1111111100)  //单步转                                      
                                  
                                  StepCounter <= StepCounter + 31'b1 ;
                if (StepCounter >= (StepLockOut+j))                       
                begin
                                    StepCounter <= 32'b0 ;
                i<=i+10'b0000000001;
                                    pul<= ~pul;
                          pulse= pul;
                                    end
                             end
  end
  这是源程序,是学长给我的,他自己好像可以用,我在自己电脑上第一步仿真就不行了,还有怎么进行模块设置?
点赞  2016-5-1 19:59
引用: chenzhufly 发表于 2016-5-2 11:04
需要把d,pulse定义成reg型才可以在左侧赋值,默认是wire型的

能告诉我怎么定义吗?我不会啦
点赞  2016-5-2 23:50
引用: habc987 发表于 2016-5-2 21:34
4楼正解,重新定义d和pulse

能告诉我怎么定义吗,我都不知道怎么弄
点赞  2016-5-2 23:50
楼主,谢谢你的共享,几点小建议

1. 请把所有的alway语句全部统一成如下,
always @(posedge clk  or negedge rst_n)
时钟必须统一,异步复位的话,上位模块肯定有。

2. 把jiasu, jiansu, Dir等都看成信号,写到 “always @(posedge clk  or negedge rst_n)”语句里面

3.module 的输入输出端口,全大写,

4.内部信号全部小写



然后,你的问题,
就可以这样解决
module
  output D;

reg d;

always ..
   d <=

assign D = d;

endmodule
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-5-6 14:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复