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

时间:2019-10-23 11:25:08

标签: verilog fpga vivado

我是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;

endmodule

这是我的约束

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

1 个答案:

答案 0 :(得分:0)

  

在对我的设备LED进行编程之后,只是保持初始状态

您的LED不会保持处于初始化状态,因为它们全部四个都点亮。在初始化状态下,您有“ 1000”。

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

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

  1. 您需要计算更长的时间。多少取决于您的时钟频率,所以找出它是多少。

  2. 修复您的计数器代码。一旦达到计数器值,它将不再计数。它保持在24'h00000F。波形没有显示出来,但是代码很明显。