摘 要:介紹一種基于VHDL的可變速彩燈控制器的設計方案,該系統無需外加輸入信號,只需一個時鐘信號就能實現以4種不同速度循環演示8種花型。該系統較以前的傳統設計具有硬件電路簡單、體積小、功耗低、可靠性高等特點,特別是可以在不修改硬件電路的基礎上,僅通過更改軟件就能實現任意修改花型的編程控制方案,而且設計非常方便,設計的電路保密性強。
關鍵詞: VHDL; Max+PlusⅡ; 可變速彩燈控制器; 電路保密性
中圖分類號:TP312文獻標識碼:A
文章編號:1004-373X(2010)08-0019-04
Design of Variable Velocity Color lamp Controller Based on VHDL
LIU Jian-ke, DUAN Xin-wen
(Qinghai Normal University, Xi’ning 810008, China)
Abstract: A design of the variable velocity color lamp controller based on VHDL is introduced. The system can demonstrate eight kinds of flowers cyclically with four different speeds without extra input signal, but only a clock signal. Compared with traditional design, the system has some features such as simple hardware circuits, small bulk, low power consumption and high reliability. Especially, the system can realize the programmable scheme of modifying flowers randomly only by changing the software (not on the basis of modifying the hardware circuits), whose design is very convenient. The confidentiality of the designed circuit is strong.
Keywords:VHDL; Max+Plus Ⅱ; variable velocity color lamp controller; confidentiality of circuit
0 引 言
硬件描述語言(HDL)是相對于一般的計算機軟件語言如C,Pascal而言的。HDL是用于設計硬件電子系統的計算機語言,它描述電子系統的邏輯功能、電路結構和連接方式。設計者可以利用HDL程序來描述所希望的電路系統,規定其結構特征和電路的行為方式,然后利用綜合器和適配器將此程序變成能控制FPGA和CPLD內部結構,并實現相應邏輯功能的門級或更底層的結構網表文件和下載文件。VHDL(Very High Speed Integrated Circuit Hardware description Language)主要用于描述數字系統的結構、行為、功能和接口。與其他的HDL語言相比,VHDL具有更強的行為描述能力,從而決定了它成為系統設計領域最佳的硬件描述語言。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。在文獻[1-6]中作者從不同的角度闡述了EDA技術的應用,它具有功能強大、描述能力強、可移植性好、研制周期短、成本低等特點,即使設計者不懂硬件的結構,也能進行獨立的設計[7]。本文以Alter公司提供的Max+PlusⅡ為平臺,設計一個可變速的彩燈控制器,可以在不修改硬件電路的基礎上,僅通過更改軟件就能實現任意修改花型的編程控制方案,實現控制16只LED以8種花型和4種速度循環變化顯示,而且設計非常方便,設計的電路保密性強。
1 設計原理
用VHDL進行設計,首先應該理解,VHDL語言是一種全方位硬件描述語言,包括系統行為級,寄存器傳輸級和邏輯門級多個設計層次。應充分利用VHDL“自頂向下”的設計優點以及層次化的設計概念,層次概念對于設計復雜的數字系統是非常有用的,它使得我們可以從簡單的單元入手,逐漸構成龐大而復雜的系統[8]。
首先應進行系統模塊的劃分,規定每一個模塊的功能以及各模塊之間的接口,最終設計方案分為三大模塊:16路花樣彩燈控制器、四頻率輸出分頻器、四選一控制器。四選一控制器從分頻器中選擇不同頻率的時鐘信號輸送到彩燈花樣控制器,從而達到控制彩燈閃爍速度的快慢和花型的的變換。
下面是本次設計的頂層模塊原理圖如圖1所示。
圖1 頂層模塊原理圖
2 子模塊及其功能
(1) 四頻率輸出分頻器。根據要求有4種速度的變化,每種都要顯示8種花樣,就要用到三位計數器和16位數字譯碼器。其次,速度有4種變化,而只有一個輸入的時鐘信號,所以要對輸入的時鐘信號進行分頻,本次設計采用了二分頻、四分頻、八分頻和15分頻得到4種不同頻率的信號。
二分頻電路的程序代碼如下:
library ieee;//庫的使用
use ieee.stdlogic1164.all;
use ieee.stdlogicunsigned.all;
entity fp2 is;//實體說明
port(clk,rst:in stdlogic;
clk1:buffer stdlogic);
end fp2;
architecture behave of fp2 is;//結構體說明
begin
process(clk,rst)
variable q1:stdlogicvector(3 downto 0);
begin
if rst=′1′ then q1:=(others=>′0′);
elsif clk′event and clk=′1′then
if q1<\"0001\" then q1:=q1+1;
else q1:=(others=>′0′);
end if;
end if;
if q1=\"0001\" then clk1<=′1′;
else clk1<=′0′;
end if;
end process;
end behave;
四分頻電路的設計有兩種方案:一是把兩個二分頻電路串聯起來(見圖2,3),實現四分頻;二是修改二分頻電路的程序代碼來實現,做如下修改:
把“if q1<\"0001\" then q1:=q1+1;”中的q1<\"0001\"改為q1<\"0011\"
同理,八分頻電路的設計也有兩種方案:一種是把兩個四分頻電路串聯起來,實現八分頻;一種是修改二分頻電路的程序代碼,只需做如下修改即可:
把“if q1<\"0001\" then q1:=q1+1;”中的q1<\"0001\"改為q1<\"0111\"。
圖2 二分頻電路模塊符號
圖3 四分頻電路模塊符號
15分頻電路如圖4所示,仿真圖如圖5所示。代碼如下:
library ieee;
use ieee.stdlogic1164.all;
use ieee.stdlogicunsigned.all;
entity fp15 is
port(clk,rst:in stdlogic;
clk1:out stdlogic);
end fp15;
architecture behave of fp15 is
begin
process(clk,rst)
variable q1:stdlogicvector(3 downto 0);
begin
if rst=′1′ then q1:=(others=>′0′);
elsif clk′event and clk=′1′then
if q1<\"1110\" then q1:=q1+1;
else q1:=(others=>′0′);
end if;
end if;
if q1=\"1110\" then clk1<=′1′;
else clk1<=′0′;
end if;
end process;
end behave;
圖4 15分頻電路模塊符號
四頻率輸出分頻器的頂層模塊原理圖如圖6所示,仿真波形如圖7所示。
圖5 15分頻電路的仿真波形
圖6 分頻器的頂層模塊原理圖
圖7 分頻器仿真波形圖
(2) 四選一控制器。四選一控制器的功能是從分頻器中選擇不同的時鐘信號送給彩燈控制器,實現彩燈閃爍頻率的變化,如圖8,9所示。源代碼如下:
library ieee;
use ieee.stdlogic1164.all;
use ieee.stdlogicunsigned.all;
entity jsq is
port(clk,clk1,clk2,clk3,clk4:in stdlogic;
z:out stdlogic);
end jsq;
architecture behave of jsq is
signal s:stdlogicvector(1 downto 0);//s為兩位的標準邏輯位矢量
begin
jsq1:process(clk);//進程1,s用來計數
begin
if clk′event and clk=′1′then
s<=s+1;
end if;
end process jsq1;
jsq2:process(s,clk1,clk2,clk3,clk4);//進程2,根據s的值來選擇分頻后的時鐘信號
begin
case s is
when\"00\"=>z<=clk1;
when\"01\"=>z<=clk2;
when\"10\"=>z<=clk3;
when\"11\"=>z<=clk4;
when others=>z<=1;
end case;
end process jsq2;
end behave;
(3) 彩燈控制器。彩燈控制器電路是整個設計的核心,它控制整個設計的輸出效果也就是圖案的樣式變化。在電路中用1代表燈亮,用0代表燈滅,由0,1按不同的規律組合代表不同的燈光圖案,同時使其選擇不同的頻率,以實現多種圖案及多種頻率的花樣功能顯示[9-10]。該程序充分證明了用VHDL設計電路的靈活性,即可以通過改變程序中輸出變量的位數來改變彩燈的數目。如圖10,11所示。
圖8 四選一控制器的模塊符號
圖9 四選一控制器的輸出仿真波形
圖10 花樣控制模塊的符號
圖11 彩燈控制器的仿真波形
代碼如下:
library IEEE;
use ieee.stdlogic1164.all;
use ieee.stdlogicunsigned.all;//打開庫和標準程序包
entity huay is;//實體說明
port(clk:in stdlogic;
jw:buffer stdlogic;
light:OUT stdlogicvector(15 downto 0));
//定義16位輸出變量light,彩燈的數目可通過改變輸出變量light的位數來控制
end huay;
architecture behave of huay is;//結構體說明
signal q1:stdlogicvector(7 downto 0);//定義8位變量q1
begin
huaya:process(clk)
begin
if clk′event and clk=′1′then
if q1<\"00110000\" then q1<=q1+1;
else q1<=(others=>′0′);
end if;
end if;
if q1=\"00110000\" then jw<=′1′;
else jw<=′0′;
end if;
end process huaya;
huayb:process(q1)
begin
case q1 is;
//第一種花型,彩燈從右向左依次閃亮
when \"00000000\"=>light<=\"0000000000000001\";
when \"00000001\"=>light<=\"0000000000000010\";
when \"00000010\"=>light<=\"0000000000000100\";
when \"00000011\"=>light<=\"0000000000001000\";
when \"00000100\"=>light<=\"0000000000010000\";
when \"00000101\"=>light<=\"0000000000100000\";
when \"00000110\"=>light<=\"0000000001000000\";
when \"00000111\"=>light<=\"1000000000000000\";
//第二種花型,燈從左向右閃亮
when \"00001000\"=>light<=\"0100000000000000\";
when \"00001001\"=>light<=\"0010000000000000\";
when \"00001010\"=>light<=\"0001000000000000\";
when \"00001011\"=>light<=\"0000100000000000\";
when \"00001100\"=>light<=\"0000010000000000\";
when \"00001101\"=>light<=\"0000001000000000\";
when \"00001110\"=>light<=\"0000000100000000\";
when \"00001111\"=>light<=\"0000000010000000\";
when \"00010000\"=>light<=\"0000100000010000\";
//第三種花型
when \"00010001\"=>light<=\"0001110000011100\";
when \"00010010\"=>light<=\"0011111000111110\";
when \"00010011\"=>light<=\"0111111111011111\";
when \"00010101\"=>light<=\"1111111111111111\";
when \"00010110\"=>light<=\"0111111001111110\";
when \"00010111\"=>light<=\"0011110000111100\";
when \"00011000\"=>light<=\"0001100000011000\";
when \"00011001\"=>light<=\"0000100000001000\";
when \"00011010\"=>light<=\"0000000000000000\";
//第四種花型
when \"00011011\"=>light<=\"0101010101010101\";
when \"00011100\"=>light<=\"0100010001000100\";
when \"00011101\"=>light<=\"0001000100010001\";
when \"00011110\"=>light<=\"0101010101010101\";
//第五種花型
when \"00011111\"=>light<=\"1000100010001000\";
when \"00100000\"=>light<=\"0010001000100010\";
when \"00100001\"=>light<=\"1010101010101010\";
//第六種花型
when \"00100010\"=>light<=\"1000000110000001\";
when \"00100011\"=>light<=\"1100001111000011\";
when \"00100100\"=>light<=\"1110011111100111\";
when \"00100101\"=>light<=\"1111111111111111\";
when \"00100110\"=>light<=\"0000001100000011\";
//第七種花型
when \"00100111\"=>light<=\"0000110000001100\";
when \"00101000\"=>light<=\"0011000000110000\";
when \"00101001\"=>light<=\"1100000011000000\";
when \"00101010\"=>light<=\"1100001111000011\";
when \"00101011\"=>light<=\"0100000110000010\"
//第八種花型
when \"00101100\"=>light<=\"0001010000101000\";
when \"00101101\"=>light<=\"0101010110101010\";
when \"00101110\"=>light<=\"1000001001000001\";
when \"00101111\"=>light<=\"0010100000010100\";
when \"00110000\"=>light<=\"1010101001010100\";
when others=>light<=\"0000000000000000\";
end case;
end process huayb;
end behave;
3 結 語
使用VHDL語言設計電路,思路簡單,功能明了。使用Max+Plus Ⅱ設計電路不僅可以進行邏輯仿真,還可以進行時序仿真,使用PLD不僅省去了電路制作的麻煩,還可以反復進行硬件的實驗,非常方便地修改設計,且設計的電路的保密性強。總之,采用EDA技術使得復雜的電子系統的設計變的簡單易行,提高了設計的效率。
參考文獻
[1]朱正偉. EDA技術及應用[M]. 北京: 清華大學出版社, 2005.
[2]郭勇. EDA 技術基礎[M]. 2版. 北京: 機械工業出版社, 2005.
[3]潘松, 黃繼業. EDA 技術實用教程[M]. 北京: 科學出版社, 2002.
[4]李景華, 杜玉遠. 可編程邏輯器件與EDA 技術[M]. 長春:東北大學出版社, 2001.
[5]潘松. VHDL使用教程[M]. 西安: 西安電子科技大學出版社, 2000.
[6]譚會生, 張昌凡. EDA技術及應用[M]. 西安: 西安電子科技大學出版社, 2001.
[7]潘澤強. VHDL語言在數字電路教學中的應用[J]. 科技資訊, 2008(35): 15.
[8]呂曉蘭. 基于VHDL實現的16路彩燈控制系統[J]. 信息技術, 2007, 34(2): 48-51.
[9]范秋華, 趙艷秋, 何香玲. 基于VHDL的彩燈控制[J]. 現代電子技術, 2004, 27(2): 5-6,8.
[10]陳華容, 姚勝興. 基于CPLD的大型彩燈控制器的設計[J]. 微計算機信息, 2008,24(5): 181-182,312.