用Verilog点亮一个灯,为什么不能实现
程序如下
module fsm2(clk,led);
input clk;//,rst;
output led;
reg led;
reg[19:0]i;
initial
begin
led<=1;
i<=0;
end
always@(posedge clk )//or negedge rst)
//if(0==rst)
//begin
// end
//else
begin
i<=i+1;
if(i==1000000)
begin
i<=0;
led<=~led;
end
end
endmodule
而我的仿真程序如下
module tt;
// Inputs
reg clk;
// Outputs
wire led;
// Instantiate the Unit Under Test (UUT)
fsm2 uut (
.clk(clk),
.led(led)
);
initial begin
// Initialize Inputs
clk = 0;
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
forever
begin
#10;
clk<=!clk;
end
end
endmodule
问题出现在你给 i 赋值那了,FPGA是并行运算,在IF后加个ELSE,把i<=i+1,放到ELSE里
你加个复位信号试试
module fs(clk,led
);
output led;
input clk;
reg led;
reg [25:0] count=26'd0;
always@(posedge clk)
begin
count<=count+1'b1;
if(count==26'd25_000_000)
begin
led<=!led;
count<=26'd0;
end
end
endmodule
可是我这样编写仿真时也不对,不知为什么
module fsm2(clk,led);
input clk;
output led;
reg led;
reg[19:0] i;
initial
begin
led<=1;
i<=0;
end
always@(posedge clk )
begin
if(i==1000000)
begin
i<=0;
led<=~led;
end
else
i<=i+1;
end
endmodule
我把它改为这个以后,还是一样,仿真的时候led一直保持高电平
module fsm2(clk,led);
input clk;
output led;
reg led;
reg[19:0] i;
initial
begin
led<=1;
i<=0;
end
always@(posedge clk )
begin
if(i==1000000)
begin
i<=0;
led<=~led;
end
else
i<=i+1;
end
endmodule
我改为这个以后,仿真时led一直保持高电平,不知道是为什么
自己好好看看,你那程序咋做的,并行同时赋值会出问题的,好好看看VERILOG的书
module fsm2(clk,led);
input clk;
output led;
reg led;
reg[19:0] i;
initial
begin
led<=1;
i<=0;
end
always@(posedge clk )
begin
if(i==1000000)
begin
i<=0;
led<=~led;
end
else
i<=i+1;
end
endmodule这个程序并不是一直高电平只是你仿真的时间设置的太短了,你可以把1000000改成1再仿真就可以看到高低变化的电平了