微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 用Verilog点亮一个灯,为什么不能实现

用Verilog点亮一个灯,为什么不能实现

时间:10-02 整理:3721RD 点击:

程序如下
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再仿真就可以看到高低变化的电平了

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

网站地图

Top