写了一个呼吸灯的电路
本帖最后由 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 用不到 帮顶 谢谢,分享.......... 路过帮顶 希望楼主能加上注释,一条一条的看太慢了。 顶下,谢谢分享 好久不用vhdl,复习一下 赞 谢分享 步之道 发表于 2014-9-19 09:56
希望楼主能加上注释,一条一条的看太慢了。
已经加上
哈哈,谢谢楼主分享{:lol:} {:victory:}{:victory:}{:victory:}MARK 不用对数值表的呼吸灯,效果很差的。 用上不帮顶……赞 MARK {:lol:} 看看,学习一下!!! 本帖最后由 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的晶振。求指点啊 cpwander 发表于 2014-9-19 10:01
好久不用vhdl,复习一下
不是VHDL,是Verilog HDL。
页:
[1]