vhdl数字电路设计教程

时间:2024-07-04 02:24:00编辑:奇事君

VHDL 设计一个秒表

给你讲下思路吧,,对于数码管显示,用动态扫描法,对应的二极管亮法对应着一个数字,这个网上随便搜就有了!!在程序中你可以用CASE WHEN语句来实现,而对于外部输入的三个控制信号,也就相当于是一个计数器的控制信号,,你可以这样
entity shuma is
port(clk,reset:in std_logic;
start,cs:in std_logic;
disp1,disp2:out std_logic_vector(7 downto 0);
led:out std_logic);
end entity;
architecture art of shuma is
signal count1:integer range 0 to ......;自已算
signal count2,count3:integer range 0 to 99;
signal clk_div,led_flag:std_logic;
begin
process(clk,reset,count1)----首先进行时钟分频,分成1hz的;
begin
if reset='1' then
count1<=0;
elsif clk'event and clk='1' then
if count1=?? then ---这个倍数根据你的FPGA板的时钟频率和1hz进行计算
count1<=0;clk_div<=not clk_div;
else count<=count+1;
end if;
end if;
end process;
process(clk_div,reset,count2) ---数码管计数进程;
begin
if reset='1' then
count2<=0;
elsif clk_div'event and clk_div='1' then
if count2=99 then
led_flag<='1';--LED亮的标志;
count2<=0;
else count2<=count2+1;led_flag<='0';
end if;
end if;
end process;
process(count)--将计数的数值显示在数码管上,,用动态扫描法,对应关系
begin 自已查;
case count is
when 0=>disp1,disp2...
end case;
同样的LED和测试程序 就是一个计数器,和上面类似,,,我要去上课啦,,希望以上那些可以帮助你!!!求采纳为满意回答。


用VHDL语言设计一个4位二进制数据比较器,应该怎么设计?

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COMPARE4 IS ——四位比较器PORT(IA_MORE_THAN_B:IN STD_LOGIC; ——高位比较的标志位的输入IB_MORE_THAN_A:IN STD_LOGIC;IA_EQUAL_B:IN STD_LOGIC;A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);——两个输入B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);OA_MORE_THAN_B:OUT STD_LOGIC;OB_MORE_THAN_A:OUT STD_LOGIC;OA_EQUAL_B:OUT STD_LOGIC);END COMPARE4;ARCHITECTURE BEHAV OF COMPARE4 ISBEGINPROCESS(IB_MORE_THAN_A, IA_EQUAL_B,IA_EQUAL_B)BEGINIF(IA_EQUAL_B='1')THEN——从最高位比较,如果高位大则停止比较输出结果,否则进行下一位比较IF(A(3)>B(3))THEN OA_MORE_THAN_B<='1';OB_MORE_THAN_A<='0';OA_EQUAL_B<='0';ELSIF(A(3)B(2))THENOA_MORE_THAN_B<='1';OB_MORE_THAN_A<='0';OA_EQUAL_B<='0';ELSIF(A(2)B(1))THENOA_MORE_THAN_B<='1';OB_MORE_THAN_A<='0';OA_EQUAL_B<='0';ELSIF(A(1)B(0))THENOA_MORE_THAN_B<='1';OB_MORE_THAN_A<='0';OA_EQUAL_B<='0';ELSIF(A(0)

学习VHDL有哪些比较好的书籍?

1、VHDL硬件描述语言与数字逻辑电路设计(修订版), 西电出版社, 候伯亨。2、VHDL实用教程,电子科大出版社, 潘松。3、VHDL与数字电路设计, 科学出版社, 卢毅4、VHDL入门/解惑/经典实例/经验总结, 北航出版社, 黄任。书1、不敢妄评, 因为没看懂. 虽然这本书算是国内VHDL书中的"名牌", 但是似乎并不适合初学者. 我自认理解能力还行, 可是这本书却让我觉得一头雾水, 而且其语言和书的结构都有点死板, 让我没有想往下读的感觉. 因为不推荐给初学者。书2、好书. 适合作"第二本书"读. 用来入门的话, 门槛似乎过高. 但推荐各位初学者买一本备查。书3、适合入门. 但是有些问题没讲明白, 特别是"可综合"与"可仿真"语句的区别等等。书4、我觉得此书是四本书当中最好的入门书, 最适合初学者. 下面是我看这本书的一些体会:首先, 这本书继承了卢毅那本书的易读性和循序渐进的教学手法. 正如作者在前言里说的"虽然无法做到老妪能懂, 但对有一定数字设计基础的读者来说是浅显易懂的"。其次, 这本书所教授的, 全部是"可综合的"VHDL语句. 这对我这种主要用VHDL开发FPGA的读者来说, 真是最适合不过了. **但对那些想用VHDL进行高阶建模的人来说, 可能并不合适**. 而且它有整整一章(虽然不过10页)对VHDL的可综合性进行讨论, 这章是一个十分有有益的总结, 至少让我搞清楚了不少之前在FPGA开发中遇到的问题、第三, 这本书实例相当多, 而且都实际可综合! (我试着输入一个比较大的程序, 居然一次编译通过, 没有错误! 很多书上的程序都是不可直接运行的, 本书是个例外, 难能可贵)。

学习VHDL有哪些比较好的书籍?除了VHDL实用教程?潘松的

[转的]
我是FPGA方面的新手, 刚学了VHDL,看了几本书, 在看的时候比较了各书的优缺点, 现在将我的体会奉献给还没入门的朋友们, 希望大家在选书方面少走弯路 - 对初学者来说, 选一本好书可以事半功倍.

我总共买/借了以下几本书:
书1) VHDL硬件描述语言与数字逻辑电路设计(修订版), 西电出版社, 候伯亨
书2) VHDL实用教程,电子科大出版社, 潘松
书3) VHDL与数字电路设计, 科学出版社, 卢毅
书4) VHDL入门/解惑/经典实例/经验总结, 北航出版社, 黄任

书评如下(个人意见, 仅供参考) :
书1) 不敢妄评, 因为没看懂. 虽然这本书算是国内VHDL书中的"名牌", 但是似乎并不适合初学者. 我自认理解能力还行, 可是这本书却让我觉得一头雾水, 而且其语言和书的结构都有点死板, 让我没有想往下读的感觉. 因为不推荐给初学者.
书2) 好书. 适合作"第二本书"读. 用来入门的话, 门槛似乎过高. 但推荐各位初学者买一本备查.
书3) 适合入门. 但是有些问题没讲明白, 特别是"可综合"与"可仿真"语句的区别等等.
书4) 我觉得此书是四本书当中最好的入门书, 最适合初学者. 下面是我看这本书的一些体会:

首先, 这本书继承了卢毅那本书的易读性和循序渐进的教学手法. 正如作者在前言里说的"虽然无法做到老妪能懂, 但对有一定数字设计基础的读者来说是浅显易懂的".
其次, 这本书所教授的, 全部是"可综合的"VHDL语句. 这对我这种主要用VHDL开发FPGA的读者来说, 真是最适合不过了. **但对那些想用VHDL进行高阶建模的人来说, 可能并不合适**. 而且它有整整一章(虽然不过10页)对VHDL的可综合性进行讨论, 这章是一个十分有有益的总结, 至少让我搞清楚了不少之前在FPGA开发中遇到的问题.
第三, 这本书实例相当多, 而且都实际可综合! (我试着输入一个比较大的程序, 居然一次编译通过, 没有错误! 很多书上的程序都是不可直接运行的, 本书是个例外, 难能可贵)
最后, 这本书是这四本书里最便宜的.^_^ (俺是穷学生, 其它的书都是借的, 只买得起这本书).

综上所述, 我郑重向初学者推荐两本书:
第一本: VHDL入门/解惑/经典实例/经验总结(黄任)
第二本: VHDL 实用教程(潘松)

只此二书, 即可入门. 至于入门后, 想要提升到中级或是高级的水平, 我想恐怕只有多做实际的系统了. 因为我自认没到中级水平, 所以没资格向各位推荐书籍.


逻辑电路表达式化简Y=AB+BC+AC

这已经是最简表达式。逻辑电路表达式化简得方法有真值表和卡诺图。n个变量卡诺图中最小项的合并规律如下:1、卡诺圈中小方格的个数必须为2^m个,m为小于或等于n的整数。2、卡诺圈中的2^m个小方格有一定的排列规律,具体地说,它们含有m个不同变量,(n-m)个相同变量。3、卡诺圈中的2^m个小方格对应的最小项可用(n-m)个变量的“与”项表示,该“与”项由这些最小项中的相同变量构成。4、当m=n时,卡诺圈包围了整个卡诺图,可用1表示,即n个变量的全部最小项之和为1。扩展资料:1、非门:利用内部结构,使输入的电平变成相反的电平,高电平(1)变低电平(0),低电平(0)变高电平(1)。2、与门:利用内部结构,使输入两个高电平(1),输出高电平(1),不满足有两个高电平(1)则输出低电平(0)。3、或门:利用内部结构,使输入至少一个输入高电平(1),输出高电平(1),不满足有两个低电(0)输出高电平(1)。参考资料来源:百度百科-逻辑电路参考资料来源:百度百科-卡诺图


设计一个8位比较器,用VHDL语言编,求大神指教,急求!!

下面是CD4585的VHDL描述,CD4585是一个可以级联的4位数值比较器。你可以改一下描述就变成8位的了:
LIBRARY IEEE;
USE IEEE.Std_logic_1164.ALL;
ENTITY cd4585 IS
PORT (a_g_b,a_e_b,a_l_b:IN Std_logic;
a,b:IN Std_logic_vector (3 DOWNTO0);
a_greater_than_b:OUT Std_logic;
a_equal_to_b:OUT Std_logic;
a_less_than_b:OUT Std_logic) ;
END cd4585;
ARCHITECTURE arch_4585 OF cd4585 IS
SIGNAL y:Std_logic_vector (2 DOWNTO0);
BEGIN
y b OR (a = b AND a_g_b = ′1′)) ELSE
″010″ WHEN (a = b AND a_e_b = ′1′ ) ELSE
″001″ WHEN (a < b OR (a = b AND a_l_b = ′1′ )) ELSE
″000″;
a_greater_than_b <= y(2);
a_equal_to_b <= y(1);
a_less_than_b <= y(0);
END arch_4585;
上面的描述中,有很多符号是在全角状态下键入的,你需要将其改成半角字符才能通过编译。


怎样用数字电路设计一个数字时钟

数字钟电路是一个典型的数字电路系统,其由时,分,秒计数器以及校时和显示电路组成.下面介绍利用集成十进制递增计数器(74160)和带译码器的七段显示数码管组成的数字钟电路.计数器74160和七段显示数码管的功能及使用方法在8.4节已有叙述.

1. 利用两片74160组成60进制递增计数器

利用两片74160组成的同步60进制递增计数器如图9.4-1所示,其中个位计数器(C1)接成十进制形式。十位计数器(C2)选择QC与QB做反馈端,经与非门输出控制清零端(CLR’),接成六进制计数形式。个位与十位计数器之间采用同步级连方式,将个位计数器的进位输出控制端(RCO)接至十位计数器容许端(ENT),完成个位对十位计数器的进位控制。将个位计数器的RCO端和十位计数器的QC、QA端经与们由CO端输出,作进位输出控制信号。当计数器状态为59时,CO端输出高电平,在同步级联方式下,容许高位计数器计数。选择信号源库中的1HZ方波信号作为计数器的测试时钟源。

因为秒与分计数均由60进制递增计数器来完成,为在构成数字钟系统时使电路得到简化,我们将图9.4-1虚线框内建立部分用子电路表示。具体操作过程如下:

在EWB主界面内建立图9.4-1所示60进制计数器,闭合仿真电源,经过功能测试,确保计数器工作正常。选中虚线框内所示部分电路(Circuit)菜单中的创建子电路(Creat Subcircuit……)项,主界面内出现子电路设置对话框,在对话框内添入电路名称(60C)后,选择在电路中置换(Replace in Circuit)项,得用子电路表示的60进制递增计数器如图9.4-3所示。

2、用两片74160组成24/12进制递增计数器

图9.4-4所示电路是由两片74160组成的能实现12和24进制转换的同步递增计数器。图中个位与十位计数器均接成十进制计数形式,采用同步级连方式。选择十位计数器的输出端QB和个位计数器的输出端QC通过与非门NAND2控制两片计数器的清零端(CLR’),利用状态24反馈清零,可实现24进制递增计数。若选择十位计数器的输出端QA与个位计数器的输出端QB经过与非门NAND1输出,控制两片计数器的清零端(CLR’),利用状态12反馈清零,可实现12进制递增计数。敲击Q键,使开关K选择与非门NAND2输出或NAND1输出可实现24和12进制递增计数器的转换。该计数器可利用作数字钟的时计数器。

为简化数字钟电路,我们将图9.4-4所示的24/12进制计数器虚线框内电路转换为子电路,转换方法与上述60进制计数器相同。用子电路表的24/12进制同步计数器如图9.4-5所示。

3. 数字钟系统的组成

利用60进制和24/12进制递增计数器子电路构成的数字钟系统如图9.4-6所示。在数字钟电路中,由两个60进制同步递增计数器完成秒、分计数,由24/12进制同步递增计数器实现小时计数。

秒、分、时计数器之间采用同步级连方式。开关K控制小时的24进制和12进制计数方式选择。为简化电路,直接选用信号源库中的方波秒脉冲作数字钟的秒脉冲信号,读者可自行设计独立的秒脉冲源,例如;可利用555多谐振荡器产生的秒脉冲,或者采用石英晶体振荡器经分频器产生秒脉冲。还可以在小时显示的基础上,增加上、下午或日期显示以及整点报时等,这里不再赘述。

敲击S和F键,可控制开关S和F 将秒脉冲直接引入时、分计数器,实现校时。

对于图9.4-6所示数字钟电路,若要进一步 简化电路还可以利用子电路嵌套功能将虚线框内电路转换为更高一级的子电路,我们将子电路命名为CLOCK,用高一级子电路表示的数字钟电路如图9.4-7所示。

今后在设计用到数字钟作单元电路的系统时可直接引用该电路,使系统得到简化。



图1、数字电子钟结构图

2、秒钟、分钟计时电路的设计

利用集成十进制递增计数器(74160)和带主译码器的七段显示数码管组成的数字钟电路。计数器74160的功能真值表如图2所示。

根据计数器74160的功能表真值表,利用两片74160组成的同步六十进制递增计数器如图3示,其中个位计数器(CL)接成十进制形式。十位计数器(C2)选择QC与QB做反馈端,经与非门(NEND)输出控制清零端(CLR),接成六进制计数形式。个位与十位计数器之间采用同步级连复位方式,将个位计数器的进位输出控制端(RCO)接至十位计数器的计数计数器的计数容许端(ENT),完成个位对十位计数器的进位控制QC,QA端经过与门AND1和AND2由CO端输出,作为六十进制的进位输出脉冲信号,

图二、同步十进制计数器74160真值表

当计数器计数状态为59时,CO端输出高电平,在同步级联方式下,容许高位计数器计数。电路创建完成后,进行仿真实验时,利用信号源库中的1HZ方波信号作为计数器的时钟脉冲源。

图3、秒钟/分钟计时电路

因为秒钟与分钟技术均由六十进制递增计数器来完成,为在构成数字钟系统时使电路得到简化,图虚线框内的电路创建为子电路表示。具体操作过程如下:在EWB主界面内建立如示的六十进制计数器,闭合仿真电源开关,经过计数器功能测试,确定计数器工作正常,选中虚线框内所示部分电路后,再选择电路菜单中创建子电路框内添入子电路名称(分计时)后,选择在电路中置换选项,得到用子电路表示的六十进制递增计数器,即秒钟/分钟计时子电路,如图4

图4、分钟计时子电路对话框

图5、分钟计时电路

四、24/12进制的能实现递增计数器

24/12进制的能实现十二四进制的同步递增计数器。如图四。所示。图中个位与十位计数器均接成十进制计数形式,采用同步级联复位方试。 选择十位计数器的输出端Qb和个位计数器 输出端Qc通过与非门NAND2的控制两片计数器的清零端CLR,当计数器的输出状态为00100100时,立即译码清零,实现二进制纟递增计数器:若选择十位二进制的输出端Q a与个位计数器的输出端Qb经与非门NAD1控制两片计数器的清零端CLR,当计数器的输出状态为00100100时,立即译码反馈为零,实现二十进制递增计数器,若选择十位计数器的输出端Qb经与门NAND1控制两片计数器的清零端CLR。当计数器的输出端状态为00010010时,立即译码反馈为零,实现十二进制递增计数,敲Q,开关Q 选择与非门NAND2输出和NA民NAND1输出实现二十四进制递增计数器的转换。计数器用作数子钟的计数器。



图6、24/12二进制计时电路

为了简化数子电子钟的电路,需要将图765的24/12二进制计数器的线框内电路转换为子电路,方法与上面六二进制的分计数器一样,用子电路表示24/12进同步计数器如图7。



图7、24/12计时电路

五、数字电子钟系统的组成

利用六十进制和24/12进制递增计数器子电路构成的数字电子钟系统如图8所示,在数字电子钟电路中,由两个六十进制同步递增计数器分别构成秒钟计时器和分计时器,级连够完成秒 ,分计时、由24/12进制同步递增计实现小时计数。秒、分、时计数器之间采用同步级连方式,开关(Q)控制小时的二十四进制和十二进制计数方式选择,敲击S和F键,可控制开关S和F将秒脉冲直接引入时,分计数器,实现时计数器和分计数器的校时。

对于图所示数字电子钟电路,为了进一步简化电路,还可以利用子电路嵌套功能,将虚线框内电路转换为更高一级的子电路,成为子电路数字电子钟,用嵌套子电路表示的数字电子钟电路如图8所示

图8、24/12进制计数电路

以上创建的各种子电路都已经存入自定义元器件库中,在其他电子系统设计中需要时,可以直接调用这些子电路,使系统的设计更方便,更快捷。

访真实验时,可直接选用信号源库中的方波秒脉冲作数字钟的秒脉冲信号,作为一个设计内容,读者可自行设计独立的秒脉冲信号源,可利用555定时器组成多谐震荡器产生秒钟脉冲信号,或者采用石英晶体震荡器经分频器产生秒脉冲,脉冲频率更稳定,计时误差会更小,还可以在小时显示的基础上,增加上下午或日期显示,整点报时电路以及作息时间提示电路等。


时钟电路介绍

亲,您好,很高兴为您解答[鲜花][戳脸]时钟电路是一种基础的电路,可以产生一个恒定频率的脉冲信号。这种恒定的脉冲信号可以用于各种计时和控制应用,例如计数器、时序控制器、数字时钟、定时器和闹钟等。时钟电路通常使用晶体振荡器或RC振荡器作为其稳定振荡源,产生一个准确且可靠的时钟信号。【摘要】
时钟电路介绍【提问】
亲,您好,很高兴为您解答[鲜花][戳脸]时钟电路是一种基础的电路,可以产生一个恒定频率的脉冲信号。这种恒定的脉冲信号可以用于各种计时和控制应用,例如计数器、时序控制器、数字时钟、定时器和闹钟等。时钟电路通常使用晶体振荡器或RC振荡器作为其稳定振荡源,产生一个准确且可靠的时钟信号。【回答】
亲亲,以下内容补充;时钟电路的设计基于振荡器电路和分频器电路。其中,晶体振荡器可以产生一个高精度的频率,而分频器可以将该频率降低至所需的频率,例如1秒或1分钟。常用的时钟电路有以下几种:1. 二极管电容时钟电路:这种电路使用二极管和电容来产生基本脉冲,根据需要可以通过分频电路降低频率。2. CMOS时钟电路:这种电路使用CMOS逻辑门来产生基本脉冲,可实现较高的稳定度和精度。3. 晶体时钟电路:这种电路使用晶体振荡器提供精确的基准频率,经过分频电路处理后,可提供准确的时钟信号。时钟电路的稳定度、精度、抗干扰能力等关键参数对于电子设备的正常运行和性能稳定都非常重要。[开心]【回答】
电路分析及作用呢【提问】
麻烦详细一点【提问】
好的,亲亲【回答】
亲,您好,很高兴为您解答[鲜花][戳脸]亲,您好,很高兴为您解答[鲜花][戳脸]电路分析是指通过理论分析和计算的方法,分析电路中各元器件的电学特性和电压、电流等参数的变化情况,进而得出电路的工作状态、性能和特点。电路分析的主要作用在于:1. 理解电路的工作原理:通过对电路进行分析,可以深入理解电路中各元器件的功能和作用,从而更好地掌握电路的工作原理。2. 确定电路的工作状态和性能:通过分析电路的电学特性和电参数的变化情况,可以确定电路的工作状态,例如电压、电流、功率等,并进一步评估其性能和特点。3. 优化电路设计:通过电路分析,可以快速评估和比较不同电路方案的优劣,并进行必要的优化和改进,以满足特定的电路要求和应用场景。4. 故障检测和排除:通过对电路进行分析和比较,可以快速定位可能存在的故障点,并采取相应的措施进行排除和修复。【回答】
亲亲,总之,电路分析是电子工程中非常重要的一部分,对于电路设计、故障排除和性能优化都具有重要的帮助和指导作用。[开心]【回答】
不是,是对于时钟电路的分析及作用【提问】
亲,您好,很高兴为您解答[鲜花][戳脸]时钟电路是一种基础的电路,其分析及作用主要包括以下几个方面:1. 时钟频率和稳定度分析:时钟电路的关键参数是频率和稳定度,分析时钟振荡器的稳定性、分频器的分频比等因素,可以评估时钟电路输出信号的频率和稳定度。尤其对于高精度时钟电路,关注其稳定度的提升至关重要。2. 时钟延迟分析:时钟信号在电路中的传输需要一定的时间延迟,对于时序控制电路等需要精确控制时间的应用来说,时钟延迟会对电路的性能产生影响,因此需要进行分析和优化。3. 时钟电路的功耗分析:时钟电路通常需要长时间稳定运行,因此其功耗有时候是一个关键问题,需要进行综合分析和优化。【回答】
亲亲,以下内容补充;4. 时钟电路的应用:时钟电路是很多电子设备中的基础性组件,其应用情况广泛,需要进行相应的场景分析和优化。总之,对于时钟电路的分析可以帮助电子工程师更好地评估其性能和适用性,从而进行更加精确和有效的电路设计和应用。[开心]【回答】


EDA中的数字时钟用VHDL语言怎么做

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity dongtai is
port(clk,rest:in std_logic;
seg,led:out std_logic_vector(7 downto 0));
end dongtai;

architecture action of dongtai is
signal counter,counter2,counter3,counter4,counter5,counter7,counter8,counter9:integer:=0;
signal counter1:std_logic_vector(7 downto 0);
begin

clock:process
variable tmp,tmp1,count,count2,count3,count4,count5,count7,count8,count9:integer:=0;
begin
wait until clk='1';
tmp:=tmp+1;
tmp1:=tmp1+1;

if(tmp1=50000000)then
count2:=count2+1;
counter2<=count2;
tmp1:=0;------111
if(count2=10)then
count2:=0;
count3:=count3+1;
counter3<=count3;---222
if(count3=6)then
count3:=0;
count4:=count4+1;
counter4<=count4;---444
if(count4=10)then
count4:=0;
count5:=count5+1;
counter5<=count5;---555
if(count5=6)then
count5:=0;
count7:=count7+1;
counter7<=count7;----777
if(count7=10)then
count7:=0;
count8:=count8+1;
counter8<=count8;----8888
if(count8>3)then
count8:=0;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
if(count8=2 and count7=3 and count5=5 and count4=9 and count3=5 and count2=9 )then
tmp:=0;
tmp1:=0;
count:=0;
count2:=0;
count3:=0;
count4:=0;
count5:=0;
count7:=0;
count8:=0;
count9:=0;
counter<=0;
counter2<=0;
counter3<=0;
counter4<=0;
counter5<=0;
counter7<=0;
counter8<=0;
counter9<=0;
end if;
if(tmp=250)then
count:=count+1;
counter<=count;
tmp:=0;
if(count=8)then
count:=0;
end if;
end if;
end process clock;


scan:process(counter)
variable tmp:std_logic_vector(7 downto 0);
begin
case counter is
when 1=>tmp:="11111110";
when 2=>tmp:="11111101";
when 3=>tmp:="11111011";
when 4=>tmp:="11110111";
when 5=>tmp:="11101111";
when 6=>tmp:="11011111";
when 7=>tmp:="10111111";
when 8=>tmp:="01111111";
when others=>tmp:="11111111";
end case;
seg<=tmp;
counter1<=tmp;
end process scan;


yima:process(counter1,counter2,counter3,counter4,counter5,counter7,counter8)
variable tmp:std_logic_vector(7 downto 0);
begin
case counter1 is


when "11111110"=>
case counter2 is -------111
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when 4 =>tmp:="10011001";
when 5 =>tmp:="10010010";
when 6 =>tmp:="10000010";
when 7 =>tmp:="11111000";
when 8 =>tmp:="10000000";
when 9 =>tmp:="10010000";
when others=>tmp:="11000000";
end case;


when "11111101"=>
case counter3 is -----222
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when 4 =>tmp:="10011001";
when 5 =>tmp:="10010010";

when others=>tmp:="11000000";
end case;



when "11111011"=>
case counter2 is ----333
when 0 =>tmp:="11111111";
when 1 =>tmp:="10111111";
when 2 =>tmp:="11111111";
when 3 =>tmp:="10111111";
when 4 =>tmp:="11111111";
when 5 =>tmp:="10111111";
when 6 =>tmp:="11111111";
when 7 =>tmp:="10111111";
when 8 =>tmp:="11111111";
when 9 =>tmp:="10111111";
when others=>tmp:="11111111";
end case;


when "11110111"=>
case counter4 is ----444
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when 4 =>tmp:="10011001";
when 5 =>tmp:="10010010";
when 6 =>tmp:="10000010";
when 7 =>tmp:="11111000";
when 8 =>tmp:="10000000";
when 9 =>tmp:="10010000";
when others=>tmp:="11000000";
end case;



when "11101111"=>
case counter5 is ----555
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when 4 =>tmp:="10011001";
when 5 =>tmp:="10010010";

when others=>tmp:="11000000";
end case;

when "11011111"=>
case counter2 is ----666
when 0 =>tmp:="11111111";
when 1 =>tmp:="10111111";
when 2 =>tmp:="11111111";
when 3 =>tmp:="10111111";
when 4 =>tmp:="11111111";
when 5 =>tmp:="10111111";
when 6 =>tmp:="11111111";
when 7 =>tmp:="10111111";
when 8 =>tmp:="11111111";
when 9 =>tmp:="10111111";
when others=>tmp:="11111111";
end case;


when "10111111"=>
if(counter8<2)then
case counter7 is ----777
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when 4 =>tmp:="10011001";
when 5 =>tmp:="10010010";
when 6 =>tmp:="10000010";
when 7 =>tmp:="11111000";
when 8 =>tmp:="10000000";
when 9 =>tmp:="10010000";
when others=>tmp:="11000000";
end case;
end if;
if(counter8=2)then
case counter7 is ----777
when 0 =>tmp:="11000000";
when 1 =>tmp:="11111001";
when 2 =>tmp:="10100100";
when 3 =>tmp:="10110000";
when others=>tmp:="11000000";
end case;
end if;


when "01111111"=>
case counter8 is ----888
when 0 =>tmp:="11000000";--0
when 1 =>tmp:="11111001";--1
when 2 =>tmp:="10100100";--2
when others=>tmp:="11000000";
end case;

when others=>tmp:="11111111";
end case;
led<=tmp;
end process yima;


end action;
比较长!但比较好理解吧!


用VHDL语言编写一数字时钟

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entity digital is
port( Clk : in std_logic; --时钟输入
Rst : in std_logic; --复位输入
S1,S2 : in std_logic; --时间调节输入
led : out std_logic_vector(3 downto 0); --整点输报时输出
spk : out std_logic;
Display : out std_logic_vector(6 downto 0); --七段码管显示输出
SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动
);
end digital;
--------------------------------------------------------------------
architecture behave of digital is
signal Disp_Temp : integer range 0 to 15;
signal Disp_Decode : std_logic_vector(6 downto 0);
signal SEC1,SEC10 : integer range 0 to 9;
signal MIN1,MIN10 : integer range 0 to 9;
signal HOUR1,HOUR10 : integer range 0 to 9;

signal Clk1kHz : std_logic;--数码管扫描时钟
signal Clk1Hz : std_logic;--时钟计时时钟
signal led_count : std_logic_vector(2 downto 0);
signal led_display : std_logic_vector(3 downto 0);
signal spkcout : std_logic;
begin
PROCESS(clk) --产生1hz信号
variable cnt : INTEGER RANGE 0 TO 49999999; --产生1Hz时钟的分频计数器
BEGIN
IF clk='1' AND clk'event THEN
IF cnt=49999999 THEN cnt:=0;
ELSE
IF cnt<25000000 THEN clk1hz<='1';
ELSE clk1hz<='0';
END IF;
cnt:=cnt+1;
END IF;
END IF;
end process;

PROCESS(clk) --产生1hz信号
variable cnt1 : INTEGER RANGE 0 TO 49999; --产生1KHz时钟的分频计数器
BEGIN
IF clk='1' AND clk'event THEN
IF cnt1=49999 THEN cnt1:=0;
ELSE
IF cnt1<25000 THEN clk1khz<='1';
ELSE clk1khz<='0';
END IF;
cnt1:=cnt1+1;
END IF;
END IF;
end process;
process(Clk1Hz,Rst)
begin
if(Rst='0') then --系统复位
SEC1<=0;
SEC10<=0;
MIN1<=0;
MIN10<=0;
HOUR1<=0;
HOUR10<=0;
elsif(Clk1Hz'event and Clk1Hz='1') then --正常运行
if(S1='0') then --调节小时
if(HOUR1=9) then
HOUR1<=0;
HOUR10<=HOUR10+1;
elsif(HOUR10=2 and HOUR1=3) then
HOUR1<=0;
HOUR10<=0;
else
HOUR1<=HOUR1+1;
end if;
elsif(S2='0') then --调节分钟
if(MIN1=9) then
MIN1<=0;
if(MIN10=5) then
MIN10<=0;
else
MIN10<=MIN10+1;
end if;
else
MIN1<=MIN1+1;
end if;
elsif(SEC1=9) then
SEC1<=0;
if(SEC10=5) then
SEC10<=0;
if(MIN1=9) then
MIN1<=0;
if(MIN10=5) then
MIN10<=0;
if(HOUR1=9) then
HOUR1<=0;
HOUR10<=HOUR10+1;
elsif(HOUR10=2 and HOUR1=3) then
HOUR1<=0;
HOUR10<=0;
else
HOUR1<=HOUR1+1;
end if;
else
MIN10<=MIN10+1;
end if;
else
MIN1<=MIN1+1;
end if;
else
SEC10<=SEC10+1;
end if;
else
SEC1<=SEC1+1;
end if;
end if;
end process;

process(Clk)--整点报时
begin
if(Clk1hz'event and Clk1hz='1') then

if(MIN10=5 and MIN1=9 and SEC10=5 and sec1>3) then --在59分55秒开始提示
led_Count<=led_Count+1; spkcout<=not spkcout;
else
led_count<="000";
spkcout<='0';
end if;
spk<=spkcout;
end if;
end process;
process(led_count)--整点报时LED灯的闪烁
begin
case (led_count) is
when "000"=>led_display<="0000";
when "001"=>led_display<="1111";
when "010"=>led_display<="0111";
when "011"=>led_display<="0011";
when "100"=>led_display<="0001";
when "101"=>led_display<="1111";
when others=>led_display<="0000";
end case;
led<=led_display;
end process;
process(SEG_SEL)
begin
case (SEG_SEL+1) is
when "111"=>Disp_Temp<=HOUR10;
when "110"=>Disp_Temp<=HOUR1;
when "101"=>Disp_Temp<=10;
when "100"=>Disp_Temp<=MIN10;
when "011"=>Disp_Temp<=MIN1;
when "010"=>Disp_Temp<=10;
when "001"=>Disp_Temp<=SEC10;
when "000"=>Disp_Temp<=SEC1;
end case;
end process;

process(Clk1khz)
begin
if(Clk1khz'event and Clk1khz='1') then --扫描累加
SEG_SEL<=SEG_SEL+1;
Display<=Disp_Decode;
end if;
end process;
process(Disp_Temp) --显示转换
begin
case Disp_Temp is
when 0=>Disp_Decode<="0111111"; --0
when 1=>Disp_Decode<="0000110"; --1
when 2=>Disp_Decode<="1011011"; --2
when 3=>Disp_Decode<="1001111"; --3
when 4=>Disp_Decode<="1100110"; --4
when 5=>Disp_Decode<="1101101"; --5
when 6=>Disp_Decode<="1111101"; --6
when 7=>Disp_Decode<="0000111"; --7
when 8=>Disp_Decode<="1111111"; --8
when 9=>Disp_Decode<="1101111"; --9
when 10=>Disp_Decode<="1000000"; ---
when others=>Disp_Decode<="0000000"; --全灭
end case;
end process;

end behave;


用VHDL语言设计一个电子时钟

秒计时模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity second is
port (clk,reset,setmin:in std_logic;
enmin:out std_logic;
dh:buffer std_logic_vector (3 downto 0);
dl:buffer std_logic_vector (3 downto 0);
end;
architecture beha of second is
begin
process(clk,reset,setmin)
bigin
if setmin='0' then
enmin<=clk;
elsif dl="1001" and dh="0101" then
enmin<='0';
else
enmin<='1';
end if;
if reset='0' then
dh<="0000";
dl<="0000";
elsif (clk'event and clk='1') then
if dl=9 then
dl<="0000";
if dh=5 then
dh<="0000";
else
dh<=dh+1;
end if;
else
dl<=dl+1;
end if;
end if;
end process;
end;
分计时模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity minute is
port (clk,clk1,reset,sethour:in std_logic;
enhour:out std_logic;
dh:buffer std_logic_vector (3 downto 0);
dl:buffer std_logic_vector (3 downto 0);
end;
architecture beha of minute is
begin
process (clk,clk1,reset,sethour)
begin
if sethour='0' then
enhour<=clk1;
elsif dl="1001" and dh="0101" then
enhour<='0';
else
enhour<='1';
end if;
if reset='0' then
dh<="0000";
dl<="0000";
elsif (clk'event and clk='1') then
if dl=9 then
dl<="0000";
if dh=5 then
dh<="0000";
else
dh<=dh+1;
end if;
else
dl<=dl+1;
end if;
end if;
end process;
end;
时计时模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity hour is
port (clk,reset:in std_logic;
dh:buffer std_logic_vector (3 downto 0);
dl:buffer std_logic_vector (3 downto 0);
end;
architecture beha of hour is
begin
process (clk,reset)
begin
if reset='0' then
dh<="0000";
dl<="0000";
elsif (clk'event and clk='1') then
if dh="0010" and dl="0011" then
dl<="0000";
dh<="0000";
elsif dl=9 then
dl<="0000";
if dh=2 then
dh<="0000";
else
dh<=dh+1;
end if;
end if;
end process;
end;
轮流显示模块
library ieee;
use ieee.std_logic_1164.all;
entity lunliu1 is
port (sech,secl,minh,minl,hourh,hourl:in std_logic_vector (3 downto 0);
clk:in std_logic;
q:buffer std_logic_vector (5 downto 0);
dout:out std_logic_vector (3 downto 0));
end;
architecture beha of lunliu1 is
signal qin: integer range 5 downto 0;
begin
process (clk)
begin
if (clk'event and clk='1') then
if qin>=5 then
qin<=0;
else
qin<=qin+1;
end if;
end if;
if qin=0 then
dout<=secl (3 downto 0);
q<="111110";
elsif qin=1 then
dout<=sech (3 downto 0);
q<="111101";
elsif qin=2 then
dout<=minl (3 downto 0);
q<="111011";
elsif qin=3 then
dout<=minh (3 downto 0);
q<="110111";
elsif qin=4 then
dout<=hourl (3 downto 0);
q<="101111";
elsif qin=5 then
dout<=hourh (3 downto 0);
q<="011111";
end if;
end process;
end;
译码模块
library ieee;
use ieee.std_logic_1164.all;
entity xianshi is
port (num:in std_logic_vector (3 downto 0);
led8:out std_logic_vector (7 downto 0));
end;
architecture beha of xianshi is
begin
process (num)
begin
case num is
when "0000"=>led8<="11000000";
when "0001"=>led8<="11111001";
when "0010"=>led8<="10100100";
when "0011"=>led8<="10110000";
when "0100"=>led8<="10011001";
when "0101"=>led8<="10010010";
when "0110"=>led8<="10000010";
when "0111"=>led8<="11111000";
when "1000"=>led8<="10000000";
when "1001"=>led8<="10010000";
when others=>null;
end case;
end process;
end;
报时信号产生模块
library ieee;
use ieee.std_logic_1164.all;
entity speak is
port (clk,hour:in std_logic;
speak:out std_logic);
end;
architecture beha of speak is
begin
process (hour)
begin
if (hour'event and hour=1) then
speak<=clk;
end if;
end process;
end;


用VHDL设计电子时钟

***********百分秒*************************
entity count100 is
Port ( shift_temp,clk: in STD_LOGIC;
q:out std_logic_vector(7 downto 0);
co:out std_logic);
end count100;

architecture Behavioral of count100 is
signal temp:std_logic_vector(7 downto 0):=(others=>'0');
begin
process(clk)
begin
if clk'event and cl

上一篇:vf-0

下一篇:北美外教