led流水灯的问题

2019-07-15 23:33发布

本帖最后由 elecfans跑堂 于 2015-9-6 13:49 编辑


源代码:`timescale 1ns / 1psmodule led_key(clk,key1,key2,led,rst_n
    );
         input clk;
         input rst_n;
         input key1,key2;  //key1控制流水灯左移,key2--右移
         output [7:0]led;
         
         reg key1_r;
         reg key2_r;
         reg [1:0]led_dir;
         reg [7:0]led_r;
         
         //=======================
         always@(posedge clk or posedge rst_n)begin
                if(rst_n)begin
                        key1_r <= 1'b0;
                        key2_r <= 1'b0;
                end
               
                else begin
                        key1_r <= key1;
                        key2_r <= key2;
                end
         end
        
        //==计数器做延时        
         reg [15:0]cnt;
         always@(posedge clk or posedge rst_n)begin
                if(rst_n)        cnt <= 16'b0;
                else cnt <= cnt + 1'b1;
         end

               
         
         //== 读按键的状态
         always@(posedge clk )begin
                led_dir <= {key2_r,key1_r};
                case(led_dir)
                        2'b00:         led_r <= 8'b0000_0000;  //都不亮
                        2'b01:    begin
                                                        led_r <= 8'b0000_0001;  //led左移
                                                        if(cnt == 16'b1000_0000_0000_0000)  led_r <= {led_r[6:0],led_r[7]};
                                                 end
                                                
                        2'b10:    begin
                                                        led_r <= 8'b1000_0000;  //led右移
                                                        if(cnt == 16'b1000_0000_0000_0000)  led_r <= {led_r[0],led_r[7:1]};
                                                 end
                                                
                        2'b11:         led_r <= 8'b1111_1111;  //全亮
                        
                endcase
        

         end
         
         assign led = led_r;

endmodule

感觉每次都进不了if(cnt == 16'b1000_0000_0000_0000)语句,不知为什么?求大神解答?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
agdhun
1楼-- · 2019-07-16 01:23
rst_n对应的是按键还是播码开关?????如果是按键,就一直复位
yangzhiyuan0928
2楼-- · 2019-07-16 07:21
 精彩回答 2  元偷偷看……
yangzhiyuan0928
3楼-- · 2019-07-16 07:22
发现问题了。
      语句每个时钟点都对赋值 led_r <= 8'b0000_0001;  //led左移
     这条语句(if(cnt == 16'b1000_0000_0000_0000)  led_r <= {led_r[6:0],led_r[7]};)执行完后,LED数据改变,但下次再进入CASE语句时,语句:led_r <=       8'b0000_0001; 又将其改写为了8'b0000_0001,而if(cnt == 16'b1000_0000_0000_0000) 条件不再满足,后续语句不再更新LED,所以led_r只会出现8'b0000_0001,  和8'b0000_0010,且停留在8'b0000_0010时间非常短(一个时钟周期),当频率太快时,基本看不到现象。
agdhun
4楼-- · 2019-07-16 12:20
那你把==改成<=就行了
agdhun
5楼-- · 2019-07-16 17:41
那你把==改成<=就行了
agdhun
6楼-- · 2019-07-16 23:26
那你把==改成<=就行了

一周热门 更多>