16路流水灯及指示电路设计VHDL代码Quartus仿真

名称:16路流水灯及指示电路设计VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

1. 16路流水灯及指示电路设计

1) 基本要求:

每过1S,流水灯按照模式设定自左向右或自右向左依次点亮16路流水灯,同时用数码管显示被点亮的灯序号;按下复位,最低位亮灯。

2) 端口定义:

32KHz基准时钟输入端口clk,输入复位端R,流水灯模式输入端LR16路灯控输出端口D15 downto 0),序号显示数码管输出端口Num(7 DOWNTO 0)

3) 实现思路:

通过移位寄存器实现流水灯的亮暗转换。

(1) 16位移位寄存器典型例程,定义信号ck1s: std_logic:=’0’;ck1s1Hz秒时钟,定义信号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


演示视频:

设计文档:

设计文档.doc

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;

代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 16路流水灯及指示电路设计VHDL代码Quartus仿真

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员