FPGA——Verilog HDL进行三角波三相方波的编写
三角波
元旦高速公路免费吗?module triangle(
    input sys_clk,
    output [2:0]sda
    );
    reg[3:0]a=0;
    reg ai=0;
  always@(posedge sys_clk)
飞度1.5        begin
            if(ai==0)
              begin北京汽车集团有限公司
              a=a+1;
              if(a==7)
              ai<=1;
              end
          else
            begin
            a=a-1;
            if(a==0)
            ai<=0;
            end
        end
    assign sda[0]=a[0];
    assign sda[1]=a[1];
    assign sda[2]=a[2];
endmodule
三相方波
第一种方法
module pwmabc(
    input sys_clk,
    output [2:0]abc
    );
reg triga=0;
reg trigb=1;
reg trigc=0;
reg[15:0] cnt1=0;
reg[15:0] cnt2=20;
reg[15:0] cnt3=40;
  always@(negedge sys_clk)
        begin
            if(cnt1>59)
              begin
              triga=~triga;
              cnt1<=1;
            end
          else
              cnt1<=cnt1+1;
          if(cnt2>59)
              begin
              trigb=~trigb;
              cnt2<=1;
            end
          else
              cnt2<=cnt2+1;
            if(cnt3>59)
              begin
              trigc=~trigc;
              cnt3<=1;
10万左右的家用车            end
          else
              cnt3<=cnt3+1;
      end
    assign abc[0]=triga;
    assign abc[1]= trigb;
    assign abc[2]= trigc;
endmodule
第二种方法
module fangbo0(
input sys_clk,
output [2:0]sda
    );
reg [31:0]halftemple_counter0=0;
reg [31:0]halftemple_counter1=0;
reg [31:0]halftemple_counter2=0;
reg [1:0]temple_clk0=1;//第一相的初始值是高电平(初始的高低电平是根据我给你看的相位图来的)
reg [1:0]temple_clk1=1;//第二相的初始值是高电平
reg [1:0]temple_clk2=0;//第三相的初始值是底电平
//我在设计三相方波的时候用的比较笨的方法,就是三相方波一项一项的来设置。第一相和后两项用的方法不太一样,但是原理相似。
always@(posedge sys_clk)//方波第一相
    begin
          if(halftemple_counter0==1500)//时钟频率为50Mhz,要输出周期为60us的方波,需要3000个时钟周期,所以每一相定义为每1500个时钟周期换一次0、1.
                begin
                  temple_clk0=~temple_clk0;
                  halftemple_counter0<=0; //0、1互换后,清空累加器
                  end
            else
            halftemple_counter0<=halftemple_counter0+1;//累加器
    end中高档车
    ds9
   
always@(posedge sys_clk)//第二相方波
    begin
        if(halftemple_counter1<3000)//第二相同理,仍然需要3000个时钟周期,满足时钟周期小于3000时才进行操作,大于等于3000时直接通过else给累加器置零
            begin
              halftemple_counter1<=halftemple_counter1+1;//累加器
              if(halftemple_counter1==500)//这里500个周期进行第一次0、1互换,第一相1500才互换。中间差1000,正好的3000个周期的1/3.
                temple_clk1=~temple_clk1;
              else if(halftemple_counter1==2000)//这里在2000时又开始0.1互换,因为500和2000之间隔着1500个时钟周期,即输出的半个周期
                    temple_clk1=~temple_clk1;
          end     
        else  halftemple_counter1<=0; //累加器一旦超过3000,这里进行置零。
    end
always@(posedge sys_clk)//第三相方波与第二相同理
    begin
        if(halftemple_counter1<3000)
            begin
              halftemple_counter2<=halftemple_counter2+1;
              if(halftemple_counter2==1000)
                temple_clk2=~temple_clk2;
              else if(halftemple_counter2==2500)
                    temple_clk2=~temple_clk2;
          end     
        else  halftemple_counter2<=0;
    end
   
assign sda[0]=temple_clk0;//对三相方波就行输出
assign sda[1]=temple_clk1;
assign sda[2]=temple_clk2;
endmodule