微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 就用fpga做的流水灯控制,遇到的问题。求问下

就用fpga做的流水灯控制,遇到的问题。求问下

时间:10-02 整理:3721RD 点击:
谢谢了,新手,,,希望有人可以解答一下。可能没说太清楚,但希望请教下大家,而且源代码大家觉得哪里写的不好,希望大家指出
下面会给源代码的一些内容,才刚开始学FPGA以前写单片机的。
主要要实现的功能就是3个按键控制8个LED灯的复位,左移,右移。功能已经实现,但又遇到一点问题:
      (1)LED左右移动的时候,8个灯会很快的全部亮一遍,又熄灭,在移动。最后结果看起来LED是正常移动了,没想通为什么会有一个全部亮灭的过程,(用CLK控制流水灯的时候,LED移动也就永远只亮一个啊。不可能是硬件的问题吧)
      (2)源代码里面第一个always是为了让Led移动,按一次键只移动一次,因为按键消抖那里,我基本参考的特权同学的例子,(最后出来的按键值,key_value会持续40ms左右吧),所以我这里只在key_value变化时候保存一次CLK的周期。
         但问题是,最后把这个always删了,直接判定key_value,LED移动依然只是移动了一次。难道我的想法错了?加的这个锁存多余了?

(源代码中,按键消抖参考的特权同学的,前面的代码太多,就不贴上去了)
/*****************************按键消抖****************************/
assign key_value_temp = key_value_40ms[1] & (~key_value_40ms[0]);     //下降沿的话为1.
assign key_value = key_value_temp;
/***************************LED控制******************************/
reg[7:0] led_r;
always @(posedge clk_25M or negedge rst_n)                        //锁存key_value的值一个时钟周期
begin
        if(!rst_n) key_value_r <= 8'h00;
        else
                key_value_r = (key_value_r == key_value) ? 0 : key_value;
end
always @(posedge clk_25M or negedge rst_n)
begin
        if(!rst_n) led_r<= 8'h00;
        else
        case(key_value_r)
                3'b001: led_r <= 8'h01;                                        //LED复位
                3'b010: led_r<= {led_r[6:0],led_r[7]};                 //左移
                3'b100: led_r <= {led_r[0],led_r[7:1]};                //右移
                default: led_r<= led_r;
        endcase
end
assign led_pio = led_r;

是不是第二个always里面去掉rst看看什么效果

你好。去掉什么效果都没有。还有我第一个问题全部LED会亮一下。我怀疑是移位操作那里。他不只是移位了一次。所以会来个全亮。但特别恰好的是,最后停下来的结果是正确的。

能否把程序都贴上看看?

你好,你看有没有可能是组合逻辑导致的?/*****************************按键消抖****************************/
assign key_value_temp = key_value_40ms[1] & (~key_value_40ms[0]);     //下降沿的话为1.
assign key_value = key_value_temp;  把这两句话改成时序逻辑试试。

是的。是逻辑的问题。谢谢你了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top