3578|4

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Verilog跑马灯 [复制链接]

本帖最后由 1520415739 于 2016-11-6 23:31 编辑

这是跑马灯的Verilog,不知道是不是有问题,出不了结果,大家帮忙看看,如果没错麻烦帮忙写一下测试代码,谢谢了!
module ledrun(clk, q, rst);//模块名(端口1,端口2,端口3)
  input clk, rst;//clk脉冲信号,rst复位信号
        output[15:0] q;//输出16盏灯
        reg[15:0] q;
        reg[15:0] counter;
        reg[2:0] state, next_state;
        reg[3:0] count;
        parameter
    state0=3'b000,
                state1=3'b001,
                state2=3'b011,
                state3=3'b010,
                state4=3'b110,
                state5=3'b111,
                state6=3'b101,
                state7=3'b100;//状态常量

always@(posedge clk)//下降沿触发
   begin
     if(rst)
             begin
                    state=state0;
                          q=16'b0000000000000000;//把q全置零
                   end
                 
                 else
                   begin
                     state=next_state;
                   end

    case(state)
       state0://从左到右奇数顺序亮
       begin
         if(q==16'b0000000000000000)
         begin
         q='b1000000000000000;
         end
         else
          begin
           if(count=='b0111)
             begin
               count=0;
               q='b0000000000000010;
               next_state=state1;
             end
           
else
           
  begin
           
    q=q>>2;
           
    count=count+1;
           
    next_state=state0;
         
    end
      
    end
   
    end

       state1://从右到左奇数灯顺序亮
          begin
            if(count=='b0111)
              begin
                count=0;
                q='b1000000000000010;
                next_state=state2;
              end
            else
            
  begin
            
    q=q<<2;
            
    count=count+1;
            
    next_state=state1;
         
     end
      
     end
  
     state2://从两边到中间奇数灯顺序亮
  
       begin
  
         if(count=='b0011)
  
           begin
  
             count=0;
  
             q='b0000001010000000;
  
             next_state=state3;

             end

           else

             begin

                q[15:9]=q[15:9]>>2;

                q[7:1]=q[7:1]<<2;

                count=count+1;

                next_state=state2;

              end

             end

              


        state3://从中间到两边奇数灯顺序亮

          begin

            if(count=='b0011)

              
begin

              
  count=0;

              
  q='b0100000000000000;

              
  next_state=state4;

              
end

             else

              
begin

              
   q[15:9]=q[15:9]<<2;

              
   q[7:1]=q[7:1]>>2;

              
   count=count+1;

              
   next_state=state3;

              

end

             end

        state4://从左到右偶数顺序亮
          begin                           
            if(count=='b0111)
              begin
                count=0;
                q='b0000000000000001;
                next_state=state5;
              end
            else
              begin
                q=q>>2;
                count=count+1;
                 next_state=state4;
              end
          end

        state5://从右到左偶数顺序亮
          begin
            if(count=='b0111)
              begin
                count=0;
                q='b0000000101000000;
                next_state=state6;
              end
            else
              begin
                 q=q<<2;
                 count=count+1;
                 next_state=state5;
              end
          end

        state6://从两边往中间偶数顺序亮
          begin
            if(count=='b0011)
              begin
                 count=0;
                 q='b0100000000000001;
                 next_state=state7;
               end
            else
               begin
                 q[6:0]=q[6:0]>>2;
                 q[14:8]=q[14:8]<<2;
                 count=count+1;
                 next_state=state6;
               end
          end

        state7://从中间往两边偶数顺序亮
           begin
             if(count=='b0011)
                 begin
                   count=0;
                   q='b1000000000000000;
                   next_state=state0;
                 end
             else
               begin
                   q[6:0]=q[6:0]<<2;
                   q[14:7]=q[14:7]>>2;
                   count=count+1;
                   next_state=state7;
                end
            end
      endcase
    end
endmodule
此帖出自FPGA/CPLD论坛

最新回复

三段其实和两端差不多,就是把你写的case那一段拆开,第二段只用于状态转换,第三段是不同状态下的输出  详情 回复 发表于 2016-11-7 13:10
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
1.always@(posedge clk)//下降沿触发            其实这是个上升沿,另外带有rst信号的写法最好写成:always@(posedge clk or negedge rst)    里面的rst使用 if(!rst) 写法(低有效的情况下);
2.还是状态机的第一段,时序逻辑请使用 <= ;
3.推荐使用三段式状态机写法,便于维护;
4.状态机第二段,状态控制和输出控制在一起,太长看不完。。。排版也怪怪的,如果以上说的无效,可能是第二段的逻辑上有问题,粗看一遍就这些
此帖出自FPGA/CPLD论坛
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
改成三段式的话怎么改,你QQ号多少,我把代码发给你麻烦你帮忙看看
此帖出自FPGA/CPLD论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

4
 


改成三段式的话怎么改,你QQ号多少,我把代码发给你麻烦你帮忙看看
此帖出自FPGA/CPLD论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

5
 
三段其实和两端差不多,就是把你写的case那一段拆开,第二段只用于状态转换,第三段是不同状态下的输出
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表