搜索
bottom↓
回复: 11

关于FPGA延时问题,现在不知道怎么实现,我想要像C语言中的那一种效果。

[复制链接]

出0入0汤圆

发表于 2011-11-20 11:58:23 | 显示全部楼层 |阅读模式
我本来是想实现一个LED灯不停的闪,在C语言中实现方法是:
void main(void)
{
while(1)
{
LED=1;
delayms(10);
LED=0;
delayms(10);
}
}

void delayms(unsigned int c)
{
        while(c--)
        {
                unsigned int i;
                for(i=0;i<1700;i++)
                {
                    ;
                }
        }
       
}

我想在FPGA中实现和上面一样的功能要怎么做事;我现在的想法是:
always @ (posedge clk_50m)
begin
  LED=0;
  这里加延时程序...........
  LED=1;
  这里加延时程序...........
  其它程序............
end

其实把clk_50m分频成已可以实现闪的功能,可是我这个程序里面还有别的程序,所以不能改clk_50m。
在此谢谢各位了,想了很久都没有实现,我本来是用TASK任务来实现延时的,可是发现不行,他是同步的,起不到延时效果。
最好是能写一个代码出来。真的谢谢各位了。

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

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

出0入0汤圆

发表于 2011-11-20 12:00:42 | 显示全部楼层
纯C到硬件描述语言有个小沟,FPGA中你再用个计数器来计时控制

出0入0汤圆

 楼主| 发表于 2011-11-20 12:03:57 | 显示全部楼层
回复【1楼】NJ8888
-----------------------------------------------------------------------

要怎么写呢,我不知道怎么写,我才学习,能给一个代码不

出0入0汤圆

发表于 2011-11-20 12:08:25 | 显示全部楼层
回复【2楼】mcu_arm9  
回复【1楼】nj8888
-----------------------------------------------------------------------
要怎么写呢,我不知道怎么写,我才学习,能给一个代码不

-----------------------------------------------------------------------

我不会verilog,给你提示:FGPA有多个时钟,你可以用单独低频时钟进程驱动LED,也可用高频和计数器配合驱动

出0入0汤圆

发表于 2011-11-20 12:12:53 | 显示全部楼层
搜索一下状态机FSM
FPGA主要还是靠这个来实现顺序逻辑的

出0入0汤圆

发表于 2011-11-20 13:35:45 | 显示全部楼层
为何不用原理图编辑,一个74393搞定的东西

FPGA里面没有程序,VerilogHDL和程序这俩字没有关系

出0入0汤圆

 楼主| 发表于 2011-11-20 17:26:17 | 显示全部楼层
回复【5楼】1ongquan
-----------------------------------------------------------------------

现在不是LED灯闪不闪的问题,想他闪很简单的,问题是我现在下面还有程序。

出0入0汤圆

发表于 2011-11-20 17:47:06 | 显示全部楼层
回复【楼主位】mcu_arm9  
-----------------------------------------------------------------------

这么写会有问题由于延时远大于clk所以每当clk触发一次,always就重新开始,而延时还没有完成
大体应该是:
always@(posedge clk)
begin
if (counter==0)
begin
couter<=10'd1000;
led_sig<=!led_sig;
end
else
begin
counter<=counter-1'b1;
end
end
assign led=led_sig;

出0入0汤圆

发表于 2011-11-20 17:49:42 | 显示全部楼层
4楼说的不错。用状态机,就两个状态,亮和灭。每个状态判断下计数器的值,是否达到你要的延时,没到的话,就保持NEXTSTATE=CURRENTSTATE,到延时的话,切换为下个状态,NEXTSTATE=ST0或者是ST1.

出0入0汤圆

发表于 2011-11-20 18:29:55 | 显示全部楼层
回复【7楼】x86x86
用一句话描述fpga的开发:一切皆时钟。
-----------------------------------------------------------------------

真理,FPGA里面所有的程序执行都是依靠时钟来的。

但是高频可以分成低频,低频可以倍成高频,但是必须依靠时钟。



always @ (posedge clk_50m)  
  begin
    if(counter==50000000)
      LED=~LED;
      counter<=0;
    else
    counter<=counter+1'b1;
  end  



这样,就可以让你的LED 1秒关,一秒开了。


谢谢楼下指正,修改下,免得看的人弄错了。

出0入0汤圆

发表于 2011-11-20 19:24:25 | 显示全部楼层
回复【10楼】nietao  
-----------------------------------------------------------------------

LED=1好像不应该加吧,而且LED=~LED后应该加一句counter=0;

出0入0汤圆

发表于 2011-11-21 14:57:46 | 显示全部楼层
回复【11楼】korgo  
回复【10楼】nietao  
-----------------------------------------------------------------------
led=1好像不应该加吧,而且led=~led后应该加一句counter=0;
-----------------------------------------------------------------------

对对对,谢谢指正。昨天回帖那会小孩来闹,所以看了看就赶快回了,没有多想,没有多考虑。

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

本版积分规则

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

GMT+8, 2024-7-24 11:26

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

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