由FPGA 做的电子钟,可是输出全为0(六位),希望大家帮忙看一下

advance1cpu 2007-11-28 07:57:55
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY clock IS
PORT(
CLK : IN STD_LOGIC;
REST: IN STD_LOGIC;//复位键
MIN : IN STD_LOGIC;//分位加一键
HOUR: IN STD_LOGIC;//时位加一键
SEGOUT: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);//输出
SELOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));//数码管位的选择
END ENTITY;
ARCHITECTURE STRUCT OF clock IS
SIGNAL NUM: INTEGER RANGE 0 TO 5;//定义变量,由NUM选择数字
SIGNAL SEG: STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL SEL: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL CLK1: STD_LOGIC;
SIGNAL S: INTEGER RANGE 0 TO 5;
SIGNAL FULL:STD_LOGIC;
SIGNAL MIN1:STD_LOGIC;
SIGNAL HOUR1:STD_LOGIC;
SIGNAL REST1:STD_LOGIC;
BEGIN
MIN1 <=MIN;//将MIN付给MIN;
HOUR1 <= HOUR;//将HOUR付给HOUR1;
REST1 <=REST;//将REST付给REST1;
P1:PROCESS(CLK)
VARIABLE Q: INTEGER RANGE 0 TO 60000;//12M分频;
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
Q := Q + 1;
IF Q <= 29999 THEN
clk1 <= '0';
ELSIF Q > 2999 AND Q <= 60000 THEN
clk1 <= '1';
ELSE
Q := 0;
END IF;
END IF;
END PROCESS;
P3:PROCESS(CLK1,S)//对数码管进行扫描
BEGIN
IF CLK1 'EVENT AND CLK1 = '1' THEN
IF S <= 7 THEN
S <= S + 1;
ELSE
S <= 0;
END IF;
END IF;
END PROCESS;
P4:PROCESS(CLK1,S,MIN,HOUR)
variable DBS0: INTEGER RANGE 0 TO 9;//控制秒个位
variable DBS1: INTEGER RANGE 0 TO 5;//控制秒十位
variable DBM0: INTEGER RANGE 0 TO 9;//控制分个位
VARIABLE DBM1: INTEGER RANGE 0 TO 5;//控制分十位
VARIABLE DBH0: INTEGER RANGE 0 TO 9;//控制时个位
VARIABLE DBH1: INTEGER RANGE 0 TO 2;//控制时十位
VARIABLE count1: INTEGER RANGE 0 TO 200;//将COUNT1付为200
BEGIN
IF CLK1 'EVENT AND CLK1= '1' THEN
count1 := count1 + 1;
IF COUNT1 = 200 THEN
COUNT1 := 0;//COUNT1满200后付值为0,将频率分为1HZ
IF DBS0 = 9 THEN
DBS0 := 0;
DBS0 := DBS0 + 1;

IF DBS1 = 5 THEN
DBS1 := 0;
DBS1 := DBS1 + 1;

IF DBM0 = 9 THEN
DBM0 := 0;
DBM0 := DBM0 + 1;

IF DBM1 = 5 THEN
DBM1 := 0;
DBM1 := DBM1 + 1;

IF DBH0 =4 AND DBH1=2 THEN
DBH0 := 0;
ELSIF DBH0 =9 THEN
DBH0 :=DBH0 + 1;

IF DBH1 = 2 THEN
DBH1 := 0;
DBH1 := DBH1+1;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
IF REST1 'EVENT AND REST1 ='1' THEN//当REST有上升延时,全部数码管全部未零;
DBS0 := 0;
DBS1 := 0;
DBM0 := 0;
DBM1 := 0;
DBH0 := 0;
DBH1 := 0;
END IF;
IF MIN1 'EVENT AND MIN1='1' THEN
DBS0:=DBS0+1;
END IF;
IF HOUR1 'EVENT AND HOUR1='1' THEN
DBH0:=DBH0+1;
END IF;
END IF;
CASE S IS //对 S进行判别
WHEN 0 => SEL <= "00000001";NUM <= DBS0;//秒个位的选通码
WHEN 1 => SEL <= "00000010";NUM <= DBS1;
WHEN 2 => SEL <= "00000100";NUM <= DBM0;
WHEN 3 => SEL <= "00001000";NUM <= DBM1;
WHEN 4 => SEL <= "00010000";NUM <= DBH0;
WHEN 5 => SEL <= "00100000";NUM <= DBH1;
END CASE;
END IF;
END PROCESS;
P5:PROCESS(CLK1,NUM)
BEGIN
IF CLK1 'EVENT AND CLK1= '1' THEN
CASE NUM IS
WHEN 0 => SEG <= "0000001";//0的编码
WHEN 1 => SEG <= "0000001";
WHEN 2 =>SEG <= "0010010" ;
WHEN 3 =>SEG <= "0000110";
WHEN 4 => SEG <= "1001100";
WHEN 5 =>SEG <= "0100100" ;
WHEN 6 =>SEG <= "0100000" ;
WHEN 7 =>SEG <= "0001111";
WHEN 8 => SEG <= "0000000";
WHEN 9 =>SEG <= "0000100" ;
WHEN OTHERS =>NULL;
END CASE;
END IF;
END PROCESS;
P6:PROCESS(SEG,SEL)BEGIN//将选通信号,数码馆的编码发出
SELOUT <= SEL;
SEGOUT(6 DOWNTO 0) <= SEG;
END PROCESS;
END ARCHITECTURE STRUCT;
...全文
141 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
xuanxing00 2007-12-02
  • 打赏
  • 举报
回复
你仔细看一下分频部分,计数应该用信号,而且要在声明部分进行定义。VHDL并和程序设计语言是不同
的,虽然叙述方式有点相,但它是描述数字电路逻辑结构的,不是描述其工作过程的。
色郎中 2007-11-29
  • 打赏
  • 举报
回复
太长了

advance1cpu 2007-11-29
  • 打赏
  • 举报
回复
大哥,这个还长啊,很普通阿,用的是单片机的思想阿,
1、设计要求基于小脚丫FPGA开发板和四位数码管实现数字时钟的设计,要求: 1)采用FPGA+按键+四位数码管实现数字时钟功能; 2)时间显示格式:XX:XX:XX (时:分:秒),采用24小时制; 3)四位数码管显示时分秒,可以通过按键控制选择显示时分界面还是分秒界面。 4)通过按键设定初始时间。 5)设置在整点12点时,通过蜂鸣器响示意整点报时。蜂鸣器响维持大概5S; 2、硬件连接FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。 本设计用到五个个按键K1~K5,硬件设计如图1所示,五个按键分别连接到FPGA的B8、C8、A10、A11和A12引脚。 图1. 按键硬件设计 本设计用到一个蜂鸣器来示意整点报时,硬件设计如图1所示,蜂鸣器连接到FPGA的B2引脚。 图2. 蜂鸣器硬件设计 本设计用到四位数码管来显示时间,四位数码管用两个74HC595驱动,硬件设计如图1所示,74HC595的串行时钟SCK、并行时钟RCK和串行数据DIN分别连接到FPGA的N2、M1和K1引脚上。 图3. 数码管驱动74HC595硬件设计 3、工作原理1)使用计数器分频处理,得到周期为1秒的脉冲信号; 2)使用三个8bit的BCD码表示时钟、分钟、秒钟的值,其中高4bit表示值的十位,低4bit表示值的个位; 3)正常运行时,每来一个1S脉冲信号个位加1,个位满10清零同时十位加1,当秒钟满60清零同时分钟个位加1,依次进行...直到23:59:59的下一刻全部清零; 4)按键K5,模式调节,设计共分4中模式(分秒显示、分秒调节、时分显示、时分调节),按动K5依次切换模式; 5)按键K2,时间调节,当数字时钟在时针调节、分针调节或秒针调节模式时,按动K2调节对应时间位; 6)在调时分和调分秒两个状态,可以通过K4和K2键分别左移右移要调整的位,要调整的位会通过对应位的闪烁来示意。通过K4和 K2左右移动选择好要调整的位以后,就可以通过K1和K3来增大或调小对应的位; 4、代码设计为了实现所需要的功能,我们将整个设计划分不同的模块,如图4所示。 图4. 数字时钟程序设计框架 4.1五位按键消抖模块 图5. 五位按键消抖模块 Ø输入:五位的按键电平信息输入 Ø输出:五位消抖后的脉冲输出 Ø功能:将按键按下一次的电平信号,经过消抖后变成一个维持一个时钟周期的脉冲信号; Ø原理: 图6. 按键抖动特性 FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。 图7. FPGA按键的理解示意图 4.2电子表显示控制模块。 图8. 电子表显示控制模块 Ø输入:五位的按键脉冲 Ø输出:十六位的BCD码输出,每四个代表一个十进制数; Ø原理:四位的位闪烁控制信号。某一位为一代表这位对应的数码管的一位进行闪烁显示。(在调整状态下,会让当前调整的哪一位进行闪烁。正常显示状态下seg_flash_data全为零); Ø功能:主要就是一个状态机,通过检查输入的按键信息,进行显示状态切换,时间调整。四个状态分别为:显示分秒,调分秒,时分显示,调时分;当K5按键按下(key_pulse[4])时依次跳转,如图9所示。 图 9. 数字时钟状态控制设计 4.3数码管译码模块 图10. 数码管译码模块 Ø输入:四位的BCD码数据 Ø输出:八位的七段数码数据 Ø功能:一个case语句,将输入的四位BCD码转化为七段数码数据; Ø原理:数码管分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳极(COM)需接+5V才能使其工作。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码,共阴极(COM)需接GND才能使其工作。小脚丫拓展板上的数码管如下图所示: 图11. 数码管内部电路 共阴极数码管: 位选为低电平(即0)选中数码管;各段选为高电平(即接+5V时)选中各数码段;由0到f的编码为: 4.4四位数码管显示控制模块。 图12. 数码管显示控制模块 Ø输入:四个八位的七段数码管数据和位闪烁控制信号seg_flash_data. Ø输出:需要串行输出给74HC595的十六位数据; Ø功能:模块就是循环的将四位七段数码数据,组合一个十六位输出数据; 4.5 74HC595驱动功能模块 图13. 74HC595驱动功能模块 Ø输入:十六位的位选段选数据。 1)duan_wei_data[13:0]分别对应: 2)[ X,X,H+,H-,DIG4,DIG3,DIG2,DIG1,DP,G,F,E,D,C,B,A] ; Ø输出:SPI接口输出,串行输出六位位选段选信号; Ø

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧