搜索
bottom↓
回复: 16

写了一个呼吸灯的电路

[复制链接]

出0入0汤圆

发表于 2014-9-19 09:47:44 | 显示全部楼层 |阅读模式
本帖最后由 RAMILE 于 2014-9-19 10:29 编辑

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


  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Company: <Name>
  3. //
  4. // File: TIMER.v
  5. // File history:
  6. //      <Revision number>: <Date>: <Comments>
  7. //      <Revision number>: <Date>: <Comments>
  8. //      <Revision number>: <Date>: <Comments>
  9. //
  10. // Description:
  11. //
  12. // <Description here>
  13. //
  14. // Targeted device: <Family::ProASIC3> <Die::A3P060> <Package::100 VQFP>
  15. // Author: <Name>
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////////////////////////
  18. `timescale 1 ns / 100 ps


  19. module TIMER( DAC, CLK );

  20. input CLK;
  21. output DAC;

  22. reg [19:0] DIV_COUNT;//分频计数器1,对亮度控制字累加时钟分频
  23. reg [5:0] DIV_COUNT2;//分频计数器2,用来驱动DAC
  24. reg [8:0] ACC;//sigma-delta DAC 的积分器
  25. reg [7:0] SLOP_COUNT;//亮度控制字

  26. reg DIV_CARRY;
  27. reg ACC_CARRY;
  28. reg INCSTATE;

  29. wire CLK_DIV19;
  30. wire CLK_DIV5;

  31. assign CLK_DIV19 = DIV_CARRY;


  32. parameter  DIV_MODE = 20'd48000000;//分频计数器的模

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

  38.         else DIV_COUNT <= DIV_COUNT + 1;
  39. end

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

  41.          DIV_COUNT2 <= DIV_COUNT2 + 1;
  42. end

  43. assign CLK_DIV5 = DIV_COUNT2[5];




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

  45.         if(INCSTATE == 1) SLOP_COUNT <= SLOP_COUNT + 1;
  46.         else SLOP_COUNT <= SLOP_COUNT - 1;
  47. end

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

  49.         if(SLOP_COUNT > 250) INCSTATE = 0;
  50.         else if(SLOP_COUNT < 50)INCSTATE = 1;
  51.         else INCSTATE = INCSTATE;
  52. end

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

  54.     ACC <= {1'b0 ,ACC[7:0]} + SLOP_COUNT;  

  55. end
  56. assign DAC = ACC[8]; //这个是拾取进位,输出


  57. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-9-19 09:53:48 | 显示全部楼层
用不到   帮顶

出0入0汤圆

发表于 2014-9-19 09:53:53 | 显示全部楼层
谢谢,分享..........

出0入0汤圆

发表于 2014-9-19 09:55:34 | 显示全部楼层
路过帮顶

出0入0汤圆

发表于 2014-9-19 09:56:34 | 显示全部楼层
希望楼主能加上注释,一条一条的看太慢了。

出0入0汤圆

发表于 2014-9-19 09:58:14 | 显示全部楼层
顶下,谢谢分享

出0入0汤圆

发表于 2014-9-19 10:01:48 | 显示全部楼层
好久不用vhdl,复习一下

出0入0汤圆

发表于 2014-9-19 10:03:56 | 显示全部楼层
赞 谢分享

出0入0汤圆

 楼主| 发表于 2014-9-19 10:30:50 | 显示全部楼层
步之道 发表于 2014-9-19 09:56
希望楼主能加上注释,一条一条的看太慢了。

已经加上        

出0入0汤圆

发表于 2014-9-19 10:43:56 | 显示全部楼层
哈哈,谢谢楼主分享

出0入0汤圆

发表于 2014-9-19 13:37:32 | 显示全部楼层
MARK

出0入0汤圆

发表于 2014-9-19 13:42:08 | 显示全部楼层
不用对数值表的呼吸灯,效果很差的。

出0入0汤圆

发表于 2014-9-20 10:01:08 | 显示全部楼层
用上不帮顶……赞

出0入0汤圆

发表于 2014-9-20 10:32:44 | 显示全部楼层
MARK

出0入0汤圆

发表于 2014-9-20 12:56:29 | 显示全部楼层
看看,学习一下!!!

出0入0汤圆

发表于 2014-9-21 17:23:42 | 显示全部楼层
本帖最后由 hankls0007 于 2014-9-21 17:25 编辑
  1. module led_flash
  2. (
  3.     CLK, RSTn, LED_Out
  4. );

  5.     input CLK;
  6.          input RSTn;
  7.          output LED_Out;
  8.         parameter t10ms=19'd499999;
  9.         reg [18:0]count,n;
  10.         reg led0,flag;
  11. initial        begin n=19'b0;flag=1'b0;end
  12.                
  13. always@(posedge CLK or negedge RSTn)
  14.         begin
  15.                 if(!RSTn)
  16.                         begin count<=19'd0;flag=1'b0;
  17.                         end

  18.                 else if(count==t10ms)
  19.                         begin
  20.                                 count<=19'd0;
  21.                                 if(n==t10ms+19'b1) flag=1;
  22.                                 else if(n==0) flag=0;
  23.                                 if(flag==1) n<=n-19'd1000;
  24.                                 else n<=n+19'd1000;
  25.                         end
  26.                 else
  27.                         count<=count+19'd1;
  28.                 if(!RSTn) led0<=1'b0;
  29.                 else if(count>t10ms+19'd10000-n) led0<=1'b0;
  30.                 else led0<=1'b1;
  31.         end
  32.        


  33. assign LED_Out=led0;

  34. endmodule
复制代码

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

出0入0汤圆

发表于 2014-9-21 18:07:57 | 显示全部楼层
cpwander 发表于 2014-9-19 10:01
好久不用vhdl,复习一下

不是VHDL,是Verilog HDL。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表