打印

自己写的johnson计数器出问题了

[复制链接]
1080|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robbins37|  楼主 | 2012-12-30 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:

module johnson (clk,rst_n,sw1,sw2,sw3,led);
input clk,rst_n;
input sw1,sw2,sw3;
output [3:0] led;
reg [3:0] led;
//-----------------------------------------
reg[23:0] cnt1;
always @(posedge clk or negedge rst_n)
  begin
   if (!rst_n) cnt1<=20'b0;
   else cnt1 <= cnt1+1'b1;
  end
//-----------------------------------------
always @(posedge clk or negedge rst_n)
  begin
   if    (!rst_n) led <= 3'b001;
   else  if (cnt1==24'hffffff && d1)
     begin
     if(d2)
        led<={led[0],led[3:1]};
              else if (d3)
     led<={led[2:0],led[3]};
     end
  end
//-----------------------------------------
reg [2:0] sw_rst;
always @(posedge clk or negedge rst_n)
  begin
   if (!rst_n) sw_rst<=3'b111;
   else sw_rst<={sw3,sw2,sw1};
  end
//-----------------------------------------
reg[2:0] sw_rst_r;
always @(posedge clk or negedge rst_n)
  begin
   if (!rst_n) sw_rst_r <= 3'b111;
   else sw_rst_r <= sw_rst;
  end
//-----------------------------------------
wire [2:0]sw_an =sw_rst_r & (~sw_rst);
//-----------------------------------------
reg[19:0] cnt;
always @(posedge clk or negedge rst_n)
  begin
   if (!rst_n) cnt<=20'b0;
   else if   (sw_an) cnt<=20'b0;
     else cnt <= cnt+1'b1;
  end
//-----------------------------------------
reg[2:0] low_sw;
always @(posedge clk or negedge rst_n)
  begin
   if   (!rst_n) low_sw<=3'b111;
   else if(cnt==20'hfffff)
     low_sw <={sw3,sw2,sw1};
     else
     low_sw<=low_sw;
  end
//-----------------------------------------
reg[2:0] low_sw_r;
always @(posedge clk or negedge rst_n)
  begin
   if   (!rst_n) low_sw_r<=3'b111;
   else low_sw_r<=low_sw;
  end
//-----------------------------------------
wire [2:0] led_ctrl =low_sw_r & (~low_sw);
//-----------------------------------------
reg d1;
reg d2;
reg d3;
always @(posedge clk or negedge rst_n)
   if   (!rst_n) begin
       d1<=1'b0;
       d2<=1'b0;
       d3<=1'b0;
        end
      else  begin
    if (led_ctrl[0])  d1<=~d1;
    if (led_ctrl[1])  d2<=~d2;
    if (led_ctrl[2])  d3<=~d3;
     end
endmodule

相关帖子

沙发
robbins37|  楼主 | 2012-12-30 17:23 | 只看该作者
关键是如果我将:
always @(posedge clk or negedge rst_n)
  begin
   if    (!rst_n) led <= 3'b001;
   else  if (cnt1==24'hffffff && d1)
     begin
     if(d2)
        led<={led[0],led[3:1]};
              else if (d3)
     led<={led[2:0],led[3]};
     end
  end
写成:
always @(posedge clk or negedge rst_n)
  begin
   if    (!rst_n) led <= 3'b001;
   else  if (cnt1==24'hffffff && led_ctrl【0】)
     begin
     if(led_ctrl【1】)
        led<={led[0],led[3:1]};
              else if led_(ctrl【2】)
     led<={led[2:0],led[3]};
     end
  end
程序就有问题

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-12-30 22:31 | 只看该作者
第二个语法都有问题

使用特权

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

本版积分规则

10

主题

160

帖子

2

粉丝