搜索
bottom↓
回复: 7

用FPGA 使用Verilog HDL描述的一个钟--初步完成~ 拿来晒一晒(补充效果图片~)

[复制链接]

出0入0汤圆

发表于 2011-1-25 17:00:16 | 显示全部楼层 |阅读模式
学FPGA的第一个作品~ 钟。。。 功能简单, 时分秒数码管动态显示, 两个按键修改时、分数值。
直接上代码~ 觉得好的可以拿去,觉得不好的,强烈欢迎批评~ 谢谢

补充图片


相机不是很好~ (原文件名:IMG_0127.JPG)


module lednum(clk,rst,key,secled,sledccom,sleddata);
input clk;
input rst;
input [1:0] key;

output secled;
output[7:0] sleddata;
output[7:0] sledccom;

//***********50MHZ->2HZ*********************       
reg[18:0] fcout;
reg[18:0] scout;
reg secled;

always@(posedge clk)
begin
        fcout<=fcout+19'd1;
end

always@(posedge fcout[5])
begin
        if(scout==19'd390624)     //50,000,000/2^(5+1)/(390624+1)=2
        begin
                scout=0;
                secled=~secled;
        end
        else
                scout=scout+19'd1;
end

//**********Read KEYs***********************
reg [2:0] kcout0,kcout1;
reg keyout0,keyout1;

always@(posedge fcout[17]) //KEY1
begin
        if(key[0])
        begin
                kcout0=0;
                keyout0=1;
        end
        else if(kcout0==3'd4)
                keyout0=0;
        else
                kcout0=kcout0+3'd1;
end

always@(posedge fcout[17]) //KEY2
begin
        if(key[1])
        begin
                kcout1=0;
                keyout1=1;
        end
        else if(kcout1==3'd4)
                keyout1=0;
        else
                kcout1=kcout1+3'd1;
end


//************SEC*********************       
reg[3:0]secg;
reg[3:0]secs;
reg sec_c;
wire min_plus;
       
always@(negedge secled or negedge rst)
begin
        if(!rst)
        begin
                secg=0;
                secs=0;
        end
        else
        begin
                if(secg==4'd9)
                begin
                        secg=0;
                        if(secs==4'd5)
                        begin
                                secs=0;
                                sec_c=0;
                        end
                        else
                        begin
                                secs=secs+4'd1;
                                sec_c=1;
                        end       
                end
                else
                begin
                        secg=secg+4'd1;
                    sec_c=1;
                end
        end
end

assign min_plus=sec_c&keyout0;

//************MIN********************
reg[3:0]ming;
reg[3:0]mins;
reg min_c;
wire hour_plus;

always@(negedge min_plus or negedge rst)
begin
        if(!rst)
        begin
                ming=0;
                mins=0;
        end
        else
        begin
                if(ming==4'd9)
                begin
                        ming=0;
                        if(mins==4'd5)
                        begin
                                mins=0;
                                min_c=0;
                        end
                        else
                        begin
                                mins=mins+4'd1;
                                min_c=1;
                        end       
                end
                else
                begin
                        ming=ming+4'd1;
                    min_c=1;
                end
        end
end

assign hour_plus=min_c&keyout1;       

//***************HOUR*****************
reg[3:0]hourg;
reg[3:0]hours;

always@(negedge hour_plus or negedge rst)
begin
        if(!rst)
        begin
                hourg=2;
                hours=1;
        end
        else
        begin
                if(hourg==4'd9)
                begin
                        hourg=0;
                        hours=hours+4'd1;
                end
                else if((hourg==4'd3)&(hours==4'd2))
                begin
                        hourg=0;
                        hours=0;
                end
                else
                        hourg=hourg+4'd1;
        end
end


//*************SHOW**************************
reg[7:0] sleddata;
reg[7:0] sledccom;
reg[3:0] showbuff;

always@(posedge fcout[16])
begin
case(sledccom)
        8'b11111011:begin
                                sledccom<=8'b01111111;
                                showbuff<=hours;   //hours
                        end       
        8'b01111111:begin
                                sledccom<=8'b10111111;
                                showbuff<=hourg;     //hourg
                        end
        8'b10111111:begin
                                sledccom<=8'b11011111;
                                showbuff<=mins;    //mins
                        end
        8'b11011111:begin
                                sledccom<=8'b11101111;
                                showbuff<=ming;    //ming
                        end
        8'b11101111:begin
                                sledccom<=8'b11110111;
                                showbuff<=secs;   //secs
                        end
        8'b11110111:begin
                                sledccom<=8'b11111011;
                                showbuff<=secg;   //secg
                        end
/*
        8'b11111011:begin
                                sledccom<=8'b11111101;
                                showbuff<=tbuff1;   //tbuff1
                        end
        8'b11111101:begin
                                sledccom<=8'b11111110;
                                showbuff<=tbuff1;   //tbuff2
                        end
*/                               
        default :sledccom<=8'b11111011;
endcase       
end

always@(sledccom or showbuff)   //num->7seg
begin
        case(showbuff)
                4'd0:sleddata=8'hc0;//0
                4'd1:sleddata=8'hf9;//1
                4'd2:sleddata=8'ha4;//2
                4'd3:sleddata=8'hb0;//3
                4'd4:sleddata=8'h99;//4
                4'd5:sleddata=8'h92;//5
                4'd6:sleddata=8'h82;//6
                4'd7:sleddata=8'hf8;//7
                4'd8:sleddata=8'h80;//8
                4'd9:sleddata=8'h90;//9
                default:sleddata=8'hff;
        endcase
end


endmodule
//***************************END**********************************

目前的BUG是当 秒或分为0时,无法修改 分和时的数值, 还在思考中,  弄完这个,下一个目标是做一个RS232串口,让单片机并行写入读出,FPGA处理协议。
看不惯论坛的也可以下源文件ourdev_613310QOJXK4.txt(文件大小:4K) (原文件名:代码.txt)

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

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

发表于 2011-1-26 11:26:19 | 显示全部楼层
楼主贴源码干嘛呢
要贴实验效果图

出0入0汤圆

发表于 2011-1-26 11:32:49 | 显示全部楼层
我先收下来一会看看

出0入0汤圆

发表于 2011-1-26 13:17:32 | 显示全部楼层

效果 (原文件名:图像0174.jpg)

我按楼主的代码实验了,替楼主贴个照片吧

出0入0汤圆

 楼主| 发表于 2011-1-26 13:48:28 | 显示全部楼层
回复【1楼】Jigsaw
楼主贴源码干嘛呢
要贴实验效果图
-----------------------------------------------------------------------

已经贴出来了,第一次晒没经验~

回复【4楼】2006lc
我按楼主的代码实验了,替楼主贴个照片吧
-----------------------------------------------------------------------

辛苦了~ 3Q

出0入4汤圆

发表于 2011-1-26 16:59:10 | 显示全部楼层
这个钟,嗯哼,有点贵哦,呵呵

出0入0汤圆

 楼主| 发表于 2011-1-27 00:04:23 | 显示全部楼层
回复【6楼】dogg
-----------------------------------------------------------------------

一开始我还不知道这个芯片的价值,只觉得它大,后来知道这个芯片可以跑NIOS II后余量LE还很多, 淘宝上这样的板子至少得500吧。    嘿嘿,板子不是我的,是学校的,放假了拿回家里来研究FPGA,要是我肯定舍不得买这么贵的东西~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-27 21:20

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

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