这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » QQ群关于led流水灯实现所遇到问题的总结

共4条 1/1 1 跳转至

QQ群关于led流水灯实现所遇到问题的总结

菜鸟
2012-10-07 20:41:47     打赏

感谢EEPW网友群里Q友们的帮助。
特别感谢EEPW-jlhgold,j03128,xieyuanfu,haitao2000s等朋友给我的帮助,还要感谢听说野鬼要给我加分,最后CCAV就不感谢了。

硬件平台:FPGA DIY—EEPW活动板
Quartus 9.0环境编译
实验目的:实现流水灯led0~led7

首先查看一下代码 

代码一 module led(clk,reset,led);                      input clk;          //50MHz     input reset;        //复位信号,低电平有效     output [7: 0] led;   //8个LED灯              reg[7:0] led;     reg[7: 0] led_r;     reg[25:0] counter;         initial       begin             counter= {26{1'b0}};             led_r = {8{1'b1}};       end        always @(posedge clk or negedge reset)          if(!reset)          led_r={8{1'b1}};   //初始化led_r为全1          else          begin          counter=counter+1;               if(counter==26'b10111110101111000010000000)    //50M               begin                                           led_r <= ((led_r<<1)+1);         //红色部分                                 counter=0;                    if(led_r=={8{1'b1}})                    begin                    led_r <= 8'b11111110;      //绿色部分                    end                 led <= led_r;               end          end                endmodule    以上代码一能正常实现流水灯功能。 当然在实验中有很多弯路 问题一: 将上述代码的红色部分改成成两条语句  led_r <=led_r<<1;  led_r<=led_r+1; 改写之后,编译烧写发现实现并不是想象中的流水灯。 问题所在:经过QQ群里好心人的解答,应该是<=这个非阻塞型语句的问题,在always里非阻塞性语句是并行执行的,所以所谓的流水灯逻辑就凌乱了。当然把两条语句的<=都改成=,然后将绿色的<=也改成=(问题二),编译后即可实现流水灯功能。   问题二:将上述的绿色的<=改成= 就会出现编译错误。 问题所在:在顺序块里只能对同一种变量只能使用一种赋值语句(要么全为阻塞,要么全为非阻塞)。即将上述代码中的红色与绿色的赋值符号相同即可。   OK 所有问题解决,总结一下:在顺序块赋值时,不能随便使用阻塞与非阻塞赋值。   代码二: 另一种方法实现流水灯功能 module led(clk,reset,led);                      input clk;          //50MHz     input reset;        //复位信号,低电平有效     output [7: 0] led;   //8个LED灯              reg[7:0] led;     reg[7: 0] led_r;     reg[25:0] counter;         initial       begin             counter= {26{1'b0}};             led_r = {8{1'b1}};       end        always @(posedge clk or negedge reset)          if(!reset)          led_r<={8{1'b1}};          else          begin          counter<=counter+1;               if(counter==26'b10111110101111000010000000) //50M               begin                                           led_r <= ~(~led_r <<1);                                               counter<=0;                    if(led_r=={8{1'b1}})                    begin                    led_r<=8'b11111110;                    end                 led <= led_r;               end          end               

endmodule 

提问者:E丶mpty (EEPW注册名eepwempty)   回答者:EEPW-jlhgold(EEPW注册名jlhgold),xieyuanfu,haitao2000s




关键词: 关于     流水     实现     遇到     题的     总结     counter    

菜鸟
2012-10-07 20:45:51     打赏
2楼
上述的第一段黑体加粗是红色,第二段黑体加粗是绿色。本来在word写好的,复制过来颜色没有了。麻雀虽小,五脏俱全啊!

专家
2012-10-08 11:50:16     打赏
3楼
入门的LEd流水灯!!

院士
2012-10-10 16:44:10     打赏
4楼
不错,加分

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]