1、显示电路研发设计VHDL编程第9章显示电路设计本章重点讨论输出结果在数码管上的显示。 电子线路输出一般都是 用灯的亮与不亮来表示输出的高低电平,这种显示不直观。数码管显 示能够更加直观、形象的描述现象。9.1两输入或门输出显示两输入或门是数字逻辑电路中最基本的门电路,电路图如下:真值表:aby000011101111两输入或门的程序设计可以有多种方式设计。输出结果主要通过 38译码器译码转换为7段显示码的输入,其电路程序设计如下: 矚慫润 厲钐瘗睞枥庑赖。library ieee;use ieee.std _lo gic_1164.all;use ieee.std_logic_ un sig
2、ned.all;*ENTIT Y or1 ISPORT(a,b:IN STD_LOGIC;out_c: out stdo gic_vector(7 dow nto 0);out_38: out std_logic_vector(2 dow nto 0);END or1;*architecture rtl OF or1 ISsig nal y:std_logic;begi ny=a OR b;out_38 = 000;out_c = 00111111 whe n y=O else00000110;END rtl;波形图如下:9.23进制计数器上一章讲到过3进制计数器的设计原理,按照一般的显示需要
3、两个 灯显示结果,在这里我们用一个数码管显示。 让读者能够更加直观的 理解3进制计数器的记数过程。其程序设计如下: 聞創沟燴鐺險爱氇 谴净。顶层文件设计:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dsp3 ISPORT(enable:IN STD_LOGIC;clk:IN STD_LOGIC;out_38: out std_logic_vector(2 downto 0);segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );END dsp3;ARCHITECTURE rt1 OF dsp3 ISCOMPON
4、ENT count3PORT(enable:IN STD_LOGIC;clk:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);END COMPONENT;SIGNAL q:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINU0:count3 PORT MAP(enable,clk,q);out_38 = 000;segment 0);elseq_tmp=q_tmp+1;end if;end if;end if;q=q_tmp;end process;end rt1;波形图如下:100 .On? 200.0ns 300.0ns 0
5、0 .Uns GDO.Dns 600.0n5 7 CD. 0ns 800.0ns 900. Ddll I I h d Ienablef elk0 ou)302. .3601-tv segmantG segmenl5 segment-e segment segment segmenll ssgmenlO1 訂1aHOii19.324进制计数器24进制计数器显示和3进制计数器的显示思路一样。不同之处在 于前者需要两个数码管,在设计时必须考虑选择数码管。在任何自顶 向下的VHDL设计描述中,设计人员常常将整个设计的系统划分为 几个模块,然后采用结构描述方式对整个系统进行描述。 残骛楼諍锩瀨濟溆塹籟。
6、9.3.1顶层结构体的VHDL源代码24 进制计数器显示程序设计过程中就包含了记数部分、 显示部分。 另外为了使记数准确, 我们必须要获得稳定的频率, 即还包括稳定的 频率源部分。下面我们给出顶层结构体的 VHDL 源代码。其中 3 个 模块以元件的形式给出, 首先在结构体的说明部分进行元件说明, 然 后在结构体中进行例化调用。 同时在结构体的说明部分定义了中间信 号,主要用来在模块之间传递信息 。 酽锕极額閉镇桧猪訣锥。 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clock
7、ISPORT(clk:IN STD_LOGIC;enable:IN STD_LOGIC;sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END clock;ARCHITECTURE rt1 OF clock ISCOMPONENT clk_div1000 PORT(clk:IN STD_LOGIC;clk_div:out STD_LOGIC);end component;component count24PORT(enable:IN STD_LOGIC;clk0:IN STD_LOGIC
8、;qh:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ql:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;component displayPORT(clk:IN STD_LOGIC;qh:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ql:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel:out STD_LOGIC_VECTOR(2 DOWNTO 0);segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); end component;signal qh:
9、 STD_LOGIC_VECTOR(3 DOWNTO 0); signal ql: STD_LOGIC_VECTOR(3 DOWNTO 0);signal clk0:STD_LOGIC;beginu0:clk_div1000 PORT MAP(clk,clk0);u1:count24 PORT MAP(enable,clk0,qh,ql);u2:display PORT MAP(clk,qh,ql,sel,segment);end rt1;9.3.2 频率源 VHDL 源代码为了获得的稳定的频率源,我们才用 1000 赫兹频率作为输入,用 1000 进制 计数器分频得到 1 赫兹频率。其程序如
10、下: 彈贸摄尔霁毙攬砖卤 庑。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clk_div1000 ISPORT(clk:IN STD_LOGIC;clk_div:out STD_LOGIC);END clk_div1000;ARCHITECTURE rt1 OF clk_div1000 ISSIGNAL q_tmp:integer range 0 to 999;BEGINprocess(clk)beginIF(clkevent and clk=1)thenif(q_tmp=999
11、)thenq_tmp=0;elseq_tmp=q_tmp+1;end if;end process;process(clk)beginIF(clkevent and clk=1)thenif(q_tmp=999)thenclk_div=1;elseclk_div=0;end if;end if;end process;end rt1;9.3.3计数部分 VHDL 源代码24 进制计数器的计数主要是 24 进制,在这里我们把 24 分为个位 和十位设计。其 VHDL 源代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC
12、_UNSIGNED.ALL;ENTITY count24 ISPORT(enable:IN STD_LOGIC;clk0:IN STD_LOGIC;-cout:out STD_LOGIC;qh:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ql:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END count24;ARCHITECTURE rt1 OF count24 ISSIGNAL qh_temp,ql_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);謀荞 抟箧飆鐸怼类蒋薔。BEGINprocess(clk0)beginIF(cl
13、k0event and clk0=1)thenif (enable=1) thenif (qh_temp=0010 and ql_temp=0011) then qh_temp=0000;ql_temp=0000;elseif (ql_temp=1001) then ql_temp=0000;qh_temp=qh_temp+1;elseql_temp=ql_temp+1;end if;end if;qh二qh_temp;qlv二ql_temp;end process;end rt1;934显示模块VHDL源代码显示模块的输入信号主要来自于计数部分的输出信息。 在输出信号中,我们采用循环点亮两个
14、 LED七段显示数码管显示输出。我们通 过信号来进行2个LED七段显示数码的选择,从而将输出信号送到 相应的LED七段显示数码上完成24进制计数器的结果显示。模块框 图如下: 厦礴恳蹒骈時盡继價骚。qhql计时位选电路qOqlq3七段显示译码segment0 se呂ment1 segment 2 segmen13 segment4 segment5 segment 6enablecount8R Q 衣elCLK从图中可以看出,显示模块有四个部分构成:八进制计数器、计时位选择电路、七段显示译码电路。在外部时钟信号 clk 的作用下, 8 进制计数器的输出从 000 到 111 按顺序循环变化,输
15、出信号为se。信号seI作为计时位选择电路的选 择信号,用来选择对应位的数据并将其转换为四位位矢量。 最后将计 时位选择电路的输出信号 q 送到七段显示译码电路的输入端口, 将其 转换成用来点燃 LED 七段显示数码管的 segment 信号 。 茕桢广鳓鯡选块网羈 泪。下面描述显示模块中的四个子电路,然后描述其总体功能。 8 进 制计数器 VHDL 源代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count8 ISPORT(cIk:IN STD_LOGIC;seI:OUT
16、STD_LOGIC_VECTOR(2 DOWNTO 0);END count8;ARCHITECTURE rt1 OF count8 ISSIGNAL seI_tmp:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINprocess(cIk)beginIF(cIkevent and cIk=1)thenif(seI_tmp=111)thensel_tmp0);elsesel_tmp=sel_tmp+1;end if;end if;selqqqsegmentsegmentsegmentsegmentsegmentsegmentsegmentsegmentsegmentsegme
17、ntsegment=XXXXXXX;END CASE;END PROCESS;END rt1;下面对 24进制计数器显示模块总体功能描述。 在描述 24 进制计数 器显示模块时, 我们以引用元件的形式来调用以上描述的子电路。 其 VHDL 源代码如下: 籟丛妈羥为贍偾蛏练淨。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY display ISPORT(clk:IN STD_LOGIC;qh:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ql:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel:OUT ST
18、D_LOGIC_VECTOR(2 DOWNTO 0); segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END display;ARCHITECTURE rt1 OF display ISCOMPONENT count8PORT(clk:IN STD_LOGIC;sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END COMPONENT;COMPONENT time_choosePORT(sel:IN STD_LOGIC_VECTOR(2 DOWNTO 0);qh:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ql:
19、IN STD_LOGIC_VECTOR(3 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;COMPONENT seg7PORT(q:IN STD_LOGIC_VECTOR(3 DOWNTO 0); segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END COMPONENT;SIGNAL sel_tmp:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL segment_tmp:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINU0:count8 PORT MAP(clk,sel_tmp);sel=sel_tmp;U2:time_choose PORT MAP(sel_tmp,qh,ql,q);U3:seg7 PORT MAP(q,segment_tmp); segment=segment_tmp;END rt1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1