为什么在编写流光程序后 LED 仍然保持初始状态,而模拟没有出错?

why the LEDS remain the initial state after programming a flowing-light program while the simulation went no wrong?

我是FPGA初学者,最近尝试了一个非常简单的流光程序,在我的电脑上运行良好。然而,无论我等待多久,我的 Zybo 上的 LED 都保持初始状态(只有最左边的 LED 亮起)。我找了一个星期的解决方案,想了很多办法,甚至从朋友那里借了一块板,但问题还是存在。

这是我的verilog代码

top.v

module top(
input clk,

output [3:0] led
);
reg [23:0] cnt_reg;
reg [3:0] led_reg;

initial begin 
        cnt_reg <= 0;
        led_reg <= 4'b1000;
end

always @(posedge clk)begin
    if(cnt_reg == 24'h00000f)
    begin
        if(led_reg == 4'b0001)
            led_reg <= 4'b1000;
        else
            led_reg <= led_reg>>1;
     end
     else
     cnt_reg <= cnt_reg + 1;
end

分配 led = led_reg;

结束模块

这是我的约束条件

set_property -dict { PACKAGE_PIN M14   IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L23P_T3_35 Sch=LED0
set_property -dict { PACKAGE_PIN M15   IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L23N_T3_35 Sch=LED1
set_property -dict { PACKAGE_PIN G14   IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_0_35=Sch=LED2
set_property -dict { PACKAGE_PIN D18   IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L3N_T0_DQS_AD1N_35 Sch=LED3

set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L11P_T1_SRCC_35 Sch=sysclk

这是我的测试平台

`timescale 1ns/1ps
module tb();
reg clk;
wire [3:0] led;
top U0 (.clk(clk), .led(led));
parameter Period = 10;
always begin
    clk = 1'b0;
    #(Period/2) clk=1'b1;
    #(Period/2);
end
initial begin
    clk = 1'b0;
    #1000000;
end
endmodule

仿真结果如下: the simulation result

对我的设备进行编程后 LEDs just remain the initial state

After programming my device LEDs just remain the initial state

您的 LEDS 不会 保持初始状态,因为它们四个都亮了。在初始状态下,您有“1000”。这将是一开三关(反之亦然,具体取决于它们的连接方式)。

发生的事情是您的电路板行为就像您的模拟结果显示的那样:每个时钟周期下一个 LED 都会亮起。您的时钟可能在 10MHz 或 100MHz 左右,所以您看不到。

要解决此问题,您需要做两件事:

  1. 你需要多数数。有多大取决于你的时钟频率,所以找出它是什么。

  2. 修复您的计数器代码。一旦达到计数器值,它就不再计数。它停留在 24'h00000F。你的波形没有显示,但你的代码很明显。