verilog状态机控制led闪烁

一、功能

用三段式状态机控制LED,按键,按下是0.5s闪烁一次,再次按按键A是1s闪烁。

二、状态机转移图

 

三、连线

 

 led_state描述状态机,key_test检测按键信号,前者作为顶层调用后者。

 四、描述状态机要注意的问题

此处利用三段式描述。参考如下:

https://blog.csdn.net/scottly1/article/details/48802921

https://www.cnblogs.com/flyuea/p/8421939.html

 

 

 1、要注意第二段组合逻辑,要用阻塞赋值。描述状态转移时的if一定要写完全。不然就会出错。WARNING什么产生了latch。一定要避免。

 2、第三段时序逻辑没有加那个if里面的rst_n复位,在modelsim里面看不出问题,但是烧到板子上就不对了。要注意不能掉了。

计数:

 

3、模块实例化的端口问题

要注意,调用子模块时,输出端口只能用wire类型的变量进行映射,用reg型就会报错。参考如下:

https://wenku.baidu.com/view/5fb13873ba1aa8114431d9e6.html

https://zhidao.baidu.com/question/1447007111844219620.html

比如我这个例子中,led_state里面接受key_tes输出端口flag_key的变量key_flag就只能是wire型,就不能对其直接赋值,这个矛盾也弄了好久。

 

五、弄了两整天终于调成功了,,,

 

 

 

 

转载于:https://www.cnblogs.com/zlll/p/9610827.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Verilog语言来控制FPGA上的按钮和LED闪烁三次的示例代码: ``` module LED_Blink( input clk, input btn, output reg [3:0] seg, output reg led ); reg [31:0] counter = 0; reg [2:0] blink_count = 0; reg [1:0] btn_state = 2'b11; always @(posedge clk) begin counter <= counter + 1; if (counter >= 25000000) begin // 1 second counter <= 0; if (blink_count < 2) begin blink_count <= blink_count + 1; end end end always @(posedge clk) begin if (btn_state == 2'b01) begin // button is pressed blink_count <= 0; end if (btn_state == 2'b11 && btn == 1) begin btn_state <= 2'b10; end else if (btn_state == 2'b10 && btn == 0) begin btn_state <= 2'b01; end end always @(posedge clk) begin case (blink_count) 0, 2, 4: led <= 1; default: led <= 0; endcase end always @(posedge clk) begin case (blink_count) 0, 1, 2: seg <= 4'b0011; // 3 3, 4, 5: seg <= 4'b0010; // 2 default: seg <= 4'b0000; endcase end endmodule ``` 在这个示例中,我们使用Verilog语言编写了一个模块,它使用时钟信号和按钮信号来控制LED闪烁和数码管的显示。我们使用三个always块,一个用于控制LED闪烁,另一个用于控制数码管的显示,第三个用于检测按钮状态并控制闪烁计数器(blink_count)。 在第一个always块中,我们使用一个计数器来计算时间,并在每秒钟将闪烁计数器(blink_count)递增1,但仅在闪烁计数器小于2时递增。这是为了确保LED闪烁三次。 在第二个always块中,我们使用一个case语句来根据闪烁计数器的值来控制LED闪烁。在第三个always块中,我们使用另一个case语句来控制数码管的显示,以显示数字3和2。 在第四个always块中,我们检测按钮状态,并根据需要重置闪烁计数器。我们使用一个简单的状态机(btn_state)来跟踪按钮的状态。如果按钮被按下,我们将闪烁计数器重置为0。如果按钮已被按下,并且已被释放,则将状态机返回到初始状态。 请注意,具体的FPGA和开发板可能需要不同的引脚和时钟设置。您可以根据自己的需要进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值