• 设为首页
  • 收藏本站
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    查看: 2475|回复: 7

    [求助] 自己写的第一个Verilog HDL流水灯代码居然不能工作?(已经

    [复制链接]

    该用户从未签到

    12

    主题

    228

    回帖

    476

    积分

    二级逆天

    积分
    476

    终身成就奖社区居民

    QQ
    发表于 2014-6-15 17:11:53 | 显示全部楼层 |阅读模式
        本人硬件工程师职位,1年工作经验,由于工作上面需要,所以决定自学FPGA,以前对51单片机了解的比较多,现在写Verilog代码就会有C语言的风格,本人也是知道两者差别较大,但是目前作为新手不好找出出错的原因,翻阅资料也没弄明白昨天的代码出错在哪里了,也许有谁稍微指点一下我就突然明白了,先谢谢阅读此贴的顾客了。
        借来了一个黑金的开发板,在上面试着烧了一个例程的源码,简单测试之后认为开发板还能正常工作,如是就按照自己的理解,重新按照自己的想法写了一个功能相同的流水灯程序,经过反复修改编译,最后终于不报错了,但是有很多警告,先不管那么多了,烧进板子居然只亮了一个灯。经过反复调试修改代码,最后还是只亮一个灯。可是我觉得源代码没什么错啊,望各位指点。
        附上源码:
    1. //定义模块,模块名:led_water,3个端口类型:时钟,复位,输出口
    2. module led_water(CLK, RSTn, LED_Out);
    3.     input CLK;                                //输入端口,时钟
    4.     input RSTn;                            //输入端口,复位
    5.     output [3:0] LED_Out;                //输出端口,4个LED接口
    6.      
    7.     /*******************************/
    8.      
    9.     //wire LED0_Out;                        //LED0输出端口用导线连接到外部引脚
    10.    
    11.     parameter T4S = 32'd200_000_000;//延时4秒钟的值,这里相当于C语言的define
    12.     parameter T3S = 32'd150_000_000;//
    13.     parameter T2S = 32'd100_000_000;//
    14.     parameter T1S = 32'd50_000_000;//
    15.    
    16.     reg[31:0]Timer_Counter;//定义变量,类型为32位
    17.     reg[3:0] LED_Out_Temp;
    18.    
    19.     always @ ( posedge CLK or negedge RSTn )
    20.         if( !RSTn )
    21.             LED_Out_Temp<= 4'b0000;
    22.         else if( Timer_Counter < T1S )
    23.             LED_Out_Temp = 4'b1000;
    24.         else if( Timer_Counter >= T1S && Timer_Counter < T2S )
    25.             LED_Out_Temp = 4'b0100;
    26.         else if( Timer_Counter >= T2S && Timer_Counter < T3S )
    27.             LED_Out_Temp = 4'b0010;
    28.         else
    29.             LED_Out_Temp = 4'b0001;
    30.     always @ ( posedge CLK or negedge RSTn )
    31.         Timer_Counter = Timer_Counter + 1'b1;
    32.         assign LED_Out =LED_Out_Temp;
    33.    
    34. endmodule
    复制代码


    又经过一下午的时间摸索,终于搞定了,程序编译没有错误,但有4个警告,烧到板子里面现象正确。期间遇到了很多的问题,经过例程、参考教程、百度、尝试等手段将一个个的问题慢慢解决,终于把现象搞出来了,对于新手来说是莫大的安慰啊。

    源代码:
    1. //定义模块,模块名:led_water,3个端口类型:时钟,复位,输出口
    2. module led_water(CLK, RSTn, LED_Out);
    3.     input CLK;                            //输入端口,时钟
    4.     input RSTn;                            //输入端口,复位
    5.     output [3:0] LED_Out;                //输出端口,4个LED接口
    6. //在C语言里面#define作为替换使用,在Verilog里面parameter作为替换使用
    7.     parameter T4S = 32'd200_000_000;//
    8.     parameter T3S = 32'd150_000_000;//
    9.     parameter T2S = 32'd100_000_000;//
    10.     parameter T1S = 32'd50_000_000;//
    11. //LED端口作为硬件输出接口,不能设定为wire类型,而用reg类型,但是硬件输入接口需要用wire类型
    12.     reg [3:0]LED_Out;   
    13. //内部数据寄存器要用reg类型定义,即:register寄存器   
    14.     reg[31:0]Timer_Counter;
    15.     reg[3:0] LED_Out_Temp;
    16. //在C语言里面“{”作为函数内容开始“}”作为函数内容结束,但是Verilog里面以“begin”开始“end结束”
    17. //always相当于C语言里面的“while()”
    18.     always @ ( posedge CLK or negedge RSTn )            //在时钟的上升沿或者复位脚的下降沿触发
    19.         if( !RSTn )                 //如果复位按键按下就清零
    20.             begin                    
    21.             LED_Out_Temp = 4'b0000;
    22.             Timer_Counter = 1'b0;
    23.             end
    24.         else if( Timer_Counter < T1S )
    25.             begin
    26.             LED_Out_Temp = 4'b0001;
    27.             Timer_Counter = Timer_Counter + 1'b1;
    28.             end
    29.         else if( Timer_Counter >= T1S && Timer_Counter < T2S )
    30.             begin
    31.             LED_Out_Temp = 4'b0010;
    32.             Timer_Counter = Timer_Counter + 1'b1;
    33.             end
    34.         else if( Timer_Counter >= T2S && Timer_Counter < T3S )
    35.             begin
    36.             LED_Out_Temp = 4'b0100;
    37.             Timer_Counter = Timer_Counter + 1'b1;
    38.             end
    39.         else if( Timer_Counter >= T3S && Timer_Counter < T4S )
    40.             begin
    41.             LED_Out_Temp = 4'b1000;
    42.             Timer_Counter = Timer_Counter + 1'b1;
    43.             end
    44.         else if( Timer_Counter >= T4S)
    45.             begin
    46.             Timer_Counter = 1'b0;
    47.             end
    48.     always @ ( posedge CLK or negedge RSTn )
    49.         begin
    50.         LED_Out = LED_Out_Temp;                    //作为数据输出不能用assign赋值
    51.         end
    52. endmodule
    复制代码
    一开始发现之前发的代码数据没有清空,改了Bug之后报错;后来又发现并行操作不同于单片机的顺序操作,多个地方赋值就报错;还有外部数据输入用wire类型定义,输出则直接赋值。

    欢迎各位顾客吐槽
    回复

    使用道具 举报

    该用户从未签到

    12

    主题

    228

    回帖

    476

    积分

    二级逆天

    积分
    476

    终身成就奖社区居民

    QQ
     楼主| 发表于 2014-6-15 17:20:26 | 显示全部楼层
    对于这个程序我的理解是,每一次时钟到来都会使Time_Counter自加,加到4秒钟的值就会清零,而另一方面,每一时钟到来都会检测Time_Counter的值处在什么一个范围,然后不同的范围下LED点亮方式不一样,从而实现流水灯。望各位吐槽
    回复

    使用道具 举报

    该用户从未签到

    12

    主题

    228

    回帖

    476

    积分

    二级逆天

    积分
    476

    终身成就奖社区居民

    QQ
     楼主| 发表于 2014-6-15 17:23:20 | 显示全部楼层
    如果有人帮忙解决了这个问题,我就在论坛里奉献我珍藏的一些资料。搞定流水灯很重要,一定要搞定它!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-7 21:17
  • 签到天数: 103 天

    [LV.6]常住居民II

    49

    主题

    1万

    回帖

    7万

    积分

    三级逆天

    积分
    73180

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发社区明星原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2014-6-15 18:38:20 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:21
  • 签到天数: 151 天

    [LV.7]常住居民III

    44

    主题

    5194

    回帖

    4346

    积分

    二级逆天

    积分
    4346

    社区居民忠实会员社区劳模原创达人终身成就奖优秀斑竹奖特殊贡献奖原创先锋奖

    QQ
    发表于 2024-5-1 10:17:26 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:21
  • 签到天数: 151 天

    [LV.7]常住居民III

    44

    主题

    5194

    回帖

    4346

    积分

    二级逆天

    积分
    4346

    社区居民忠实会员社区劳模原创达人终身成就奖优秀斑竹奖特殊贡献奖原创先锋奖

    QQ
    发表于 2024-8-13 09:17:51 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    1 小时前
  • 签到天数: 94 天

    [LV.6]常住居民II

    12

    主题

    233

    回帖

    949

    积分

    二级逆天

    积分
    949

    终身成就奖

    发表于 2024-9-24 08:47:02 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    前天 09:11
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    1

    主题

    133

    回帖

    98

    积分

    一级逆天

    积分
    98
    发表于 2024-10-15 18:00:23 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    公告:服务器刚移机,
    大家请不要下载东西。
    会下载失败


    QQ 手机版 小黑屋 监管台 遇到问题请联系QQ1308068381 逆天PCB论坛

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表