RAMILE 发表于 2014-9-19 09:47:44

写了一个呼吸灯的电路

本帖最后由 RAMILE 于 2014-9-19 10:29 编辑

接口很简单,只有一个CLK和一个输出,接LED。时钟我用的是48MHz,可以通过设置DIV_MODE 的数值设置喘气的速度,设置SLOP_COUNT 的上下限可以设置LED的最亮和最暗的程度


///////////////////////////////////////////////////////////////////////////////////////////////////
// Company: <Name>
//
// File: TIMER.v
// File history:
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//
// Description:
//
// <Description here>
//
// Targeted device: <Family::ProASIC3> <Die::A3P060> <Package::100 VQFP>
// Author: <Name>
//
///////////////////////////////////////////////////////////////////////////////////////////////////
`timescale 1 ns / 100 ps


module TIMER( DAC, CLK );

input CLK;
output DAC;

reg DIV_COUNT;//分频计数器1,对亮度控制字累加时钟分频
reg DIV_COUNT2;//分频计数器2,用来驱动DAC
reg ACC;//sigma-delta DAC 的积分器
reg SLOP_COUNT;//亮度控制字

reg DIV_CARRY;
reg ACC_CARRY;
reg INCSTATE;

wire CLK_DIV19;
wire CLK_DIV5;

assign CLK_DIV19 = DIV_CARRY;


parameterDIV_MODE = 20'd48000000;//分频计数器的模

always@(posedge CLK)begin   //很大的分频比
      if(DIV_COUNT >= DIV_MODE)begin
                DIV_COUNT <= 20'd0;
                DIV_CARRY <= ~DIV_CARRY;
      end

      else DIV_COUNT <= DIV_COUNT + 1;
end

always@(posedge CLK)begin //较小的分频比

         DIV_COUNT2 <= DIV_COUNT2 + 1;
end

assign CLK_DIV5 = DIV_COUNT2;




always@(posedge CLK_DIV19)begin //亮度的升降累积,由CLK19触发,INCSTATE控制上升和下降

      if(INCSTATE == 1) SLOP_COUNT <= SLOP_COUNT + 1;
      else SLOP_COUNT <= SLOP_COUNT - 1;
end

always@(posedge CLK )begin//RS触发器,当亮度超过250时候,转为复位,当亮度小于10时候,转为置位

      if(SLOP_COUNT > 250) INCSTATE = 0;
      else if(SLOP_COUNT < 50)INCSTATE = 1;
      else INCSTATE = INCSTATE;
end

always@(posedge CLK_DIV5)begin// Σ-Δ DAC变换器,溢出率就是模拟量输出

    ACC <= {1'b0 ,ACC} + SLOP_COUNT;

end
assign DAC = ACC; //这个是拾取进位,输出


endmodule

qqkanshijie 发表于 2014-9-19 09:53:48

用不到   帮顶

tabc_123 发表于 2014-9-19 09:53:53

谢谢,分享..........

qtds67 发表于 2014-9-19 09:55:34

路过帮顶

步之道 发表于 2014-9-19 09:56:34

希望楼主能加上注释,一条一条的看太慢了。

vibrate 发表于 2014-9-19 09:58:14

顶下,谢谢分享

cpwander 发表于 2014-9-19 10:01:48

好久不用vhdl,复习一下

yangxx 发表于 2014-9-19 10:03:56

赞 谢分享

RAMILE 发表于 2014-9-19 10:30:50

步之道 发表于 2014-9-19 09:56
希望楼主能加上注释,一条一条的看太慢了。

已经加上      

野猪奔月 发表于 2014-9-19 10:43:56

哈哈,谢谢楼主分享{:lol:}

我命不由天 发表于 2014-9-19 13:37:32

{:victory:}{:victory:}{:victory:}MARK

llsenyue 发表于 2014-9-19 13:42:08

不用对数值表的呼吸灯,效果很差的。

tomy 发表于 2014-9-20 10:01:08

用上不帮顶……赞

lishunfu 发表于 2014-9-20 10:32:44

MARK {:lol:}

liuzhe910422 发表于 2014-9-20 12:56:29

看看,学习一下!!!

hankls0007 发表于 2014-9-21 17:23:42

本帖最后由 hankls0007 于 2014-9-21 17:25 编辑

module led_flash
(
    CLK, RSTn, LED_Out
);

    input CLK;
       input RSTn;
       output LED_Out;
        parameter t10ms=19'd499999;
        reg count,n;
        reg led0,flag;
initial        begin n=19'b0;flag=1'b0;end
               
always@(posedge CLK or negedge RSTn)
        begin
                if(!RSTn)
                        begin count<=19'd0;flag=1'b0;
                        end

                else if(count==t10ms)
                        begin
                                count<=19'd0;
                                if(n==t10ms+19'b1) flag=1;
                                else if(n==0) flag=0;
                                if(flag==1) n<=n-19'd1000;
                                else n<=n+19'd1000;
                        end
                else
                        count<=count+19'd1;
                if(!RSTn) led0<=1'b0;
                else if(count>t10ms+19'd10000-n) led0<=1'b0;
                else led0<=1'b1;
        end
       


assign LED_Out=led0;

endmodule

楼主我也写了一个呼吸灯的程序,verilog的。用的50Mhz的晶振。求指点啊

EMOSYN 发表于 2014-9-21 18:07:57

cpwander 发表于 2014-9-19 10:01
好久不用vhdl,复习一下

不是VHDL,是Verilog HDL。
页: [1]
查看完整版本: 写了一个呼吸灯的电路