16路流水灯及指示电路设计VHDL代码Quartus仿真
名称:16路流水灯及指示电路设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
1. 16路流水灯及指示电路设计
1) 基本要求:
每过1S,流水灯按照模式设定自左向右或自右向左依次点亮16路流水灯,同时用数码管显示被点亮的灯序号;按下复位,最低位亮灯。
2) 端口定义:
32KHz基准时钟输入端口clk,输入复位端R,流水灯模式输入端LR,16路灯控输出端口D(15 downto 0),序号显示数码管输出端口Num(7 DOWNTO 0)。
3) 实现思路:
通过移位寄存器实现流水灯的亮暗转换。
(1) 16位移位寄存器典型例程,定义信号ck1s: std_logic:=’0’;ck1s为1Hz秒时钟,定义信号index: std_logic_vector(3 DOWNTO 0) := ”0000”; index为亮灯序号:
Process(ck1s)
Variable tmp: std_logic;
Variable indx: std_logic_vector(3 DOWNTO 0) := ”0000”;
Begin
If R=’1’ then
D<=X”0001”; indx := ”0000”;
ElsIf ck1s’EVENT AND ck1s =’0’ then
If LR=’1’ then --shift left
Tmp:=D(15);
D(15 downto 1)<=D(14 downto 0);
D(0)<=tmp;
if indx := ”1111” then indx := ”0000”;
else indx := indx +1; end if;
Else --shift right
Tmp:=D(0);
D(14 downto 0) <=D(15 downto 1);
D(15)<=tmp;
if indx := ”0000” then indx := ”1111”;
else indx := indx - 1; end if;
END IF;
END IF;
Index := indx;
End Process;
(2) 跑马灯亮灭状态1S转换1次,秒脉冲ck1s通过对32KHz时钟分频获得,参照基础电路。
根据亮灯序号index输出显示数码管输出端口Num,参照基础电路。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
Quartus9.0版本

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图



部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --每过1S,流水灯按照模式设定自左向右或自右向左依次点亮16路流水灯, --同时用数码管显示被点亮的灯序号;按下复位,最低位亮灯。 ENTITY caideng IS PORT ( clk : IN STD_LOGIC;--32KHz基准时钟 R : IN STD_LOGIC;--输入复位端 LR : IN STD_LOGIC;--流水灯模式输入端 D : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--16路灯控输出端口 Num : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--序号显示数码管输出端口 ); END caideng; ARCHITECTURE RTL OF caideng IS --内部信号定义 signal index :std_logic_vector(3 DOWNTO 0) := "0000"; --index为亮灯序号: signal ck1s :std_logic :='0'; signal D_buf :STD_LOGIC_VECTOR(15 DOWNTO 0) ; BEGIN ck1sP:Process(clk) --Process to generate 1Hz clock Variable tmp: INTEGER RANGE 0 to 15999:=0; Begin If clk'EVENT AND clk='0' then If tmp=15 then --15999仿真改小为15 Tmp:=0; ck1s<=NOT(ck1s); Else Tmp:= Tmp+1; END IF; END IF; End Process ck1sP; Process(ck1s,R) Variable tmp: std_logic; Variable indx: std_logic_vector(3 DOWNTO 0) := "0000"; Begin If R='1' then D_buf<=X"0001"; indx := "0000"; ElsIf ck1s'EVENT AND ck1s ='0' then If LR='1' then --shift left Tmp:= D_buf(15); D_buf(15 downto 1)<= D_buf(14 downto 0); D_buf(0)<=tmp; if indx="1111" then indx:="0000"; else indx:=indx +1; end if; Else --shift right Tmp:= D_buf(0); D_buf(14 downto 0) <= D_buf(15 downto 1); D_buf(15)<=tmp; if indx="0000" then indx:="1111"; else indx:= indx - 1; end if; END IF; END IF; Index <= indx; End Process;
代码文件(付费下载):
![]()
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 16路流水灯及指示电路设计VHDL代码Quartus仿真