论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 2307阅读
  • 4回复

[求助]自己写的第一个Verilog HDL流水灯代码居然不能工作?(已经搞定了) [复制链接]

上一主题 下一主题
离线smartexp
 

性别:
帅哥
发帖
241
金币
132
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2014-06-15
    本人硬件工程师职位,1年工作经验,由于工作上面需要,所以决定自学FPGA,以前对51单片机了解的比较多,现在写Verilog代码就会有C语言的风格,本人也是知道两者差别较大,但是目前作为新手不好找出出错的原因,翻阅资料也没弄明白昨天的代码出错在哪里了,也许有谁稍微指点一下我就突然明白了,先谢谢阅读此贴的顾客了。 9b%|^ .B  
    借来了一个黑金的开发板,在上面试着烧了一个例程的源码,简单测试之后认为开发板还能正常工作,如是就按照自己的理解,重新按照自己的想法写了一个功能相同的流水灯程序,经过反复修改编译,最后终于不报错了,但是有很多警告,先不管那么多了,烧进板子居然只亮了一个灯。经过反复调试修改代码,最后还是只亮一个灯。可是我觉得源代码没什么错啊,望各位指点。 iP,v=pS6  
    附上源码: PS/W h  
&/DOO ^  
  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
T NIst  
w Oj88J)  

又经过一下午的时间摸索,终于搞定了,程序编译没有错误,但有4个警告,烧到板子里面现象正确。期间遇到了很多的问题,经过例程、参考教程、百度、尝试等手段将一个个的问题慢慢解决,终于把现象搞出来了,对于新手来说是莫大的安慰啊。 ;YM]K R;  
R9q0,yQW  
源代码:
  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类型定义,输出则直接赋值。 r hZQQOQ  
F'ENq6  
欢迎各位顾客吐槽


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线smartexp

性别:
帅哥
发帖
241
金币
132
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2014-06-15
对于这个程序我的理解是,每一次时钟到来都会使Time_Counter自加,加到4秒钟的值就会清零,而另一方面,每一时钟到来都会检测Time_Counter的值处在什么一个范围,然后不同的范围下LED点亮方式不一样,从而实现流水灯。望各位吐槽


离线smartexp

性别:
帅哥
发帖
241
金币
132
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2014-06-15
如果有人帮忙解决了这个问题,我就在论坛里奉献我珍藏的一些资料。搞定流水灯很重要,一定要搞定它!!


离线longxuekai

性别:
帅哥
发帖
18790
金币
29189
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2014-06-15
不错的,


离线kingweison

性别:
人妖
发帖
4575
金币
2691
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 05-01


快速回复
限150 字节
 
上一个 下一个