《vhdl彩灯控制电路的设计与实现》由会员分享,可在线阅读,更多相关《vhdl彩灯控制电路的设计与实现(8页珍藏版)》请在金锄头文库上搜索。
1、VHDL 彩灯控制电路的设计与实现一、 实验目的 1进一步了解时序电路设计方法2熟悉状态机的设计方法二、 实验所用仪器及元器件1、 计算机2、 直流稳压电源3、 数字系统与逻辑设计实验开发板三、 实验内容用VHDL语言设计并实现一个彩灯控制(8个发光二极管)电路,仿真并下载验证其功能。彩灯有两种工作模式,可以通过拨码开关或者按键进行切换。(1) 单点移动模式:一个点在8个发光二极管上来回的亮(2) 幕布模式:从中间两个点,同时向两边一次点亮直至全亮,然后再向中间点灭,依次往复四、 设计思路与过程根据实验要求,需要实现在拨码开关或者按键的控制下实现两种状态机的转换。首先,确定输入输出变量:输入:
2、拨码开关a:实现两种模式的转换;时钟clk::提供有效时钟沿; 输出:8维向量b:连接8个发光二极管。其次,确定电路工作状态因为在单点移动模式和幕布模式都要满足灯来回亮,共计工作状态23种:a=0时,实现单点移动模式,工作状态有s0s13共14种状态;a=1时,实现幕布模式,工作状态有s14s22共9种状态。再次,大致确定VHDL编写思路确定好输入输出变量和电路状态后,考虑结构体中需要的进程需要完成以下两个功能分频和实现状态机,故我使用了4个进程。其功能分别如下:P0:分频,将实验板上提供的50MHz的时钟信号,即输入clk分为频率为1Hz的低频信号clk_out,以便观察现象;P1:为当前状
3、态储存的下一状态;P2:当时钟有效沿到来时,当前状态转入下一状态;(P1、P2共同实现状态机的转换)P3:控制LED灯的输出,达到实验要求效果具体程序如下。五、 VHDL程序library ieee;use ieee.std_logic_1164.all;entity light isport ( clk: in std_logic; a: in std_logic; b:out std_logic_vector(7 downto 0);end light;architecture light_1 of light is type state_type is(s0,s1,s2,s3,s4,s5
4、,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22); signal current_state,next_state: state_type; signal clk_out:std_logic; signal tmp: integer range 0 to ;begin p0:process(clk) -分频器,把50MHz的时钟clk分为1Hz的时钟clk_out begin if clkevent and clk=1 then if tmp= then tmp=0; else tmp=tmp+1; end if
5、; if tmp= then clk_out=1; else clk_out if(a=0) then next_state=s1; else next_state if(a=0) then next_state=s2; else next_state if(a=0) then next_state=s3; else next_state if(a=0) then next_state=s4; else next_state if(a=0) then next_state=s5; else next_state if(a=0) then next_state=s6; else next_sta
6、te if(a=0) then next_state=s7; else next_state if(a=0) then next_state=s8; else next_state if(a=0) then next_state=s9; else next_state if(a=0) then next_state=s10; else next_state if(a=0) then next_state=s11; else next_state if(a=0) then next_state=s12; else next_state if(a=0) then next_state=s13; e
7、lse next_state if(a=0) then next_state=s0; else next_state if(a=1) then next_state=s15; else next_state if(a=1) then next_state=s16; else next_state if(a=1) then next_state=s17; else next_state if(a=1) then next_state=s18; else next_state if(a=1) then next_state=s19; else next_state if(a=1) then nex
8、t_state=s20; else next_state if(a=1) then next_state=s21; else next_state if(a=1) then next_state=s22; else next_state if(a=1) then next_state=s14; else next_state=s0; end if; end case; end process; p2:process(clk_out) -时钟clk_out作用下的状态转换函数 begin if(clk_outevent and clk_out=1) then current_statebbbbb
9、bbbbbbbbbbbbbbbbbb=; end case; end process;end light_1;六、 仿真波形说明:为了仿真需要,在进行仿真事,将分频部分p0去掉,直接用clk作用进程p2其中:End time=2msa period time=60usclk period time=2us七、 故障及问题分析本次实验整体比较顺利,但仍旧出现了几个问题:开始并未设置分频器,clk的频率为50MHz,这个频率过高,若是直接用于提供时钟,不但不能看清现象,还会因为周期过短(可能会短于电路的延迟时间),导致输出错误。故加了一个50M的分频器,使作用的有效时钟信号为1Hz。其他未出现什么问题,顺利地完成了实验。八、 总结和结论本学期数电实验共完成了4次实验,