完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2个回答
|
|
|
|
随着集成电路技术的发展,用传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率,因此能大大降低设计难度的VHDL设计方法被越来越广泛地采用。用VHDL语言设计系统的主要方法是:设计者根据VHDL的语法规则,对系统目标的逻辑行为进行描述,然后通过综合工具进行电路结构的综合、编译、优化,通过仿真工具进行逻辑功能仿真和系统时延的仿真,最后把设计的程序下载到芯片中,成功地实现系统功能。
在VHDL设计中,最常用的数据对象主要有三种:信号(signal)、变量(variable)和常数(constant)。信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外,其他性质几乎和“端口”一样;信号是一个全局量,它可以用来进行进程之间的通信。变量只能在进程语句、函数语句和过程语句结构中使用,是一个局部量。 在VHDL语言中,对信号赋值是按仿真时间进行的,到了规定的仿真时间才进行赋值,而变量的赋值是立即发生的。下面的例子是从赋初值的角度说明信号与变量的这种区别的。 例如用VHDL语言实现初值为A的十六进制的16个数的循环显示。 对于如此的设计要求,如果用变量实现,则VHDL程序如下。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sevenauto is port(clk:in std_logic; y:out std_logic_vector(6 downto 0)); end sevenauto; architecture behave of sevenauto is begin process(clk) variable count:std_logic_vector(3 downto 0); variable init:std_logic; begin if (clk‘’event) and (clk=‘’1‘’) then if (init = ‘’0‘’) then count:= “1001”; init:=‘’1‘ end if; count:=count+1; case count is when “0000”=>y; when “0001”=>y; when X“2”=>y; when X“3”=>y; when X“4”=>y; when X“5”=>y; when X“6”=>y; when X“7”=>y; when X“8”=>y; when X“9”=>y; when X“A”=>y; when X“B”=>y; when X“C”=>y; when “1101”=>y; when “1110”=>y; when “1111”=>y; when thers=>y; end case; end if; end process; end behave; 在程序中,定义了变量count,希望初始值为“1010”。通过实验发现,在定义变量或信号时直接赋予初始值不能生效(如variable count:std_logic_vector(3 downto 0) :=“1010”),它的初始值仍然是系统默认值(如count为“0000”)。正是利用这一点,通过init(初始值为’‘0’‘)来给count赋初值 A即“1010”,具体方法见程序中斜体部分。这样,在第一个脉冲来时执行斜体部分if语句,而第二个脉冲来时由于init不为’‘0’‘而是 ’‘1’‘,因此不执行该部分语句,从而实现为count赋初值的功能,这样程序从A开始进行数字的循环显示。 如果把count类型改为signal,则结果将大不一样。 signal cou nt: std_logic_vector(3 downto 0); process(clk) variable init :std_logic; begin if (clk’‘event) and (clk=’‘1’‘) then if (init = ’‘0’‘) then count<= “1001”; --(1) init := ’‘1’ end if; count<=count+1; --(2) 由于信号的赋值不是立即发生的,在语句(1)后面还存在对信号count的赋值操作(2),因此,语句(1)在此不起作用,count的最后值是语句 (2)的值。因此如果将count设为signal的话,程序实现的是从0开始的16个十六进制数的循环。在这里,对信号赋初值的语句是不可行的。 仿真结果 将设计好的VHDL程序在Altera公司提供的软件maxplusⅡ10.1环境下进行编译仿真,得到的仿真结果如图1、图2所示,其中图1是 count为变量的结果,图2是count为信号的结果,其中输出y[6.。.0]分别与七段数码管的abcdefg七段相连。 从图1可以看出,在第一个时钟脉冲上升沿,结果是“1110111”,数码管显示即为A,然后依次为b,C,d, E,F,0,1.。.9,A.。。循环下去,此处用小写的b和d,主要是与数字8进行区别。 从图中可以看出,在第一个时钟脉冲上升沿,结果是“1111110”,数码管显示即为0,然后依次示1.。.9,A, b,C,d,E,F,0,。。。循环下去。 |
|
|
|
只有小组成员才能发言,加入小组>>
772 浏览 0 评论
1148 浏览 1 评论
2527 浏览 5 评论
2858 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1063浏览 3评论
190浏览 2评论
453浏览 2评论
366浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 19:35 , Processed in 1.048042 second(s), Total 82, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号