VHDL——学习开篇1(入门体验与顺序执行)

0、背景

明明已经掌握了verilog HDL,为什么还要掌握VHDL呢。因为,你如果不掌握VHDL,意味着,你将要丢失很多资料,不少书籍,不少资料还是用VHDL实现的,包括国外的数字信号处理。在开启这个VHDL文档之前,我其实在YouTube上面已经大概感受过VHDL了,这样非常有助于按照书籍来学习,直接看语法书籍,可能效果甚微。下面,我们只需要使用语法书籍按班就部的地学习即可。

1、VHDL入门体验

1.1 2选1选择器

library ieee;
use ieee.std_logic_1164.all;   /*IEEE库使用说明*/

ENTITY mux21 IS				/*器件mux21的外部接口信号书名,port相当于器件的引脚*/
port (a,b: in std_logic;
		  s: in std_logic;
		  y: out std_logic);
end entity mux21;

architecture one of mux21 is	/*器件mux21的内部工作逻辑描述,即为实体描述的器件功能机构*/
begin
	y<=a when s='0' else
		b  when s='1';

end  architecture one;




解释:
实体ENTITY说明:实体的电路意义相当于器件,在电路原理图上相当于元件符号。实体是一个完整的、独立的语言模块,它描述了接口信息,port所描述的就相当于电路器件的外部引脚。同时指明了端口a\b\s和y信号的数据类型是符合IEEE库中std_logic_1164程序包中的标准数据位,std_logic中所定义的数据类型。

**结构体(architecture)**说明:描述mux21的内部逻辑功能,在电路上相当于器件的内部电路结构。符号“<=”是信号赋值符,是信号传递的意思,“y<=a”表示将a获得的信号赋给y输出端.

需要指出来的是,实体和结构体分别是以“END ENTITY MUX21”和“END ARCHITECTURE ONE”语句结尾的,这是符合VHDL新版本 IEEE TSD 1076_1993的语法要求的,若根据VHDL 87版本 这两条结尾语句只需要写成end mux21 和end one即可。
一个可综合的VHDL描述的最小和最基本的逻辑结构中,IEEE标准库说明、实体和结构体是最基本的和不可缺少的三个部分。

1.2 锁存器的设计

锁存器的引脚D是数据输入端口,ENA是数据锁存使能控制端口,当ENA为高电平时,允许数据锁入;低电平时进制数据锁入,Q为数据输出端口。

在这里插入图片描述
也就是说Q始终是随着D的,C是锁存器的控制信号。

library ieee;
use ieee.std_logic_1164.all;

entity Latch_p is
port(D:in std_logic;
	  ena:in std_logic;
	  Q:out std_logic
	  );
end entity ;

architecture one of Latch_p IS
signal sig_save:std_logic;
begin
	process (D,ena)
		begin
			if ena='1' then
				sig_save<=D;
			end if;
			   Q<=sig_save;
	end process;
end architecture one;

SIGNAL由信号赋值语句SIGNAL…定义了一个信号变量,它的功能是存储来自外部信号D的被锁存的数据位。
使用了一个进程语句结构PROCESS(D,ENA)–》END PROCESS

进程结构中的逻辑描述表明,如果使能控制信号ENA为高电平,则将数据输入端D的最新值传入信号变量sig_save,然后通过sig_save,将此值传给信号输出端Q;反之,若使能控制信号ENA为低电平,则将sig_save上的原值传给信号输出端Q,即保留原值不变。

程序中的IF—THEN语句结构所给出的描述方式,是令VHDL综合器引入时序元件的常用方法,其特点是当IF引导的逻辑表达式满足条件时,作数据传入操作:sig_save<=D,而当不满足条件时,不作任何描述就以END IF 结束IF–THEN语句

程序行“PROCESS(D,ENA)”中的(D,ENA)称为敏感信号表,这说明信号D和ENA中的任何信号发生变化时,都将引起本进程的执行

1.3 总结与注释

在这里插入图片描述
在VHDL中注释采用–

2、VHDL顺序执行

每一条顺序语句的执行(指的是仿真执行)顺序与他们的书写顺序基本是一致的,顺序语句只能出现在进程process和子程序中,子程序包括function和procedure(函数和过程)
但应该值得注意的是,这里的顺序是从仿真软件的运行或者顺应VHDL语法的编程逻辑思路而言的,其相应的硬件逻辑工作方式并未如此。关于这点,希望要注意区分VHDL语言的软件仿真行为及描述综合后的硬件行为间的差异。
在CHDL中,一个进程是由一系列顺序语句偶成的,而进程本身属于并行语句。
VHDL中有如下6类基本顺序语句:
赋值语句
流程控制语句
等待语句
子程序调用语句
返回语句
空操作语句

2.1 赋值语句

VHDL严格规定了,赋值目标与赋值源的数据类型必须严格一致。
变量赋值目标 := 赋值源;
信号赋值目标 < = 赋值源;

在信号赋值中,有2点需要注意,第一点是,当在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值,其前面相同的赋值目标不作任何变化。

variable a,b:std_logic;
signal c1:std_logic_vector(1 to 4);
a:='1';
b:='0';
c1:="1100";--其中a\b\c1都属于标识符赋值目标

signal a,b:std_logic_vector (0 to 3);
signal i:integer range 0 to 3;
signal y,z:std_logic;
a<="1010";
b<="1000";
a(3)<=z;

variable a,b:std_logic_vector(1 to 4);
a(1 to 2):="10";
a(1 to 4):="1011";--段下标元素赋值目标


signal a,b,c,d:std_logic;
signal s:std_logic_vector(1 to 4);
variable e,f:std_logic;
variable g:std_logic_vector(1 to 2);
variable h:std_logic_vector(1 to 4);
s<=('0','1','0','0');
(a,b,c,d)<=s;

2.2 流程控制语句

流程控制语句通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。
流程控制语句共有五种:
if
case
loop
next
exit

2.21 if语句

在这里插入图片描述
与第一种IF语句相比较,第二种IF语句差异仅仅在于当所测条件为false时候,并不直接跳到end if结束条件句的执行,而是转向else以下的另一段顺序语句进行执行。

library ieee;
use ieee.std_logic_1164.all;
entity mux2_2_1 is
port (din: in std_logic_vector(0 to 7);
		output:out std_logic_vector(0 to 2)   );
end mux2_2_1;

architecture behave of mux2_2_1 is
signal sint: std_logic_vector (4 to 0);
begin
process (din)
begin
if(din(7)='0')then
output<="000";--(din(7)='0')
elsif (din(6)='0') then
output <="100" ; --(din(7)='1') AND din(6)='0')
elsif  (din(5)='0') then
output<="010";--(din(7)='1'AND (din(6)='1')AND(din(5)='0')
elsif (din(4)='0') then
output<="110";
elsif (din(3)='0') then
output<="001";
elsif (din(2)='0') then
output<="101";
elsif (din(1)='0') then
output<="011";
else
output<="111";
end if;
end process;
end behave;


在这里插入图片描述

2.22 case语句

在这里插入图片描述
除非所有条件句中的选择值能完整覆盖case语句中表达式的取值,否则最末一个条件句中的选择必须用“others”表示,它表示已给的所有条件句中未能列出其它可能的取值。关键词others只能出现一次,且作为最后一种条件取值。使用others的目的是为了使条件句中的所有选择值能够涵盖表达式的所有取值,以免综合器会插入不必要的锁存器。这一点对于定义为std_logic和std_logic_vector数据类型的值尤其重要,因为这些数据对象的取值除了1和0以外,还可能有其他的取值,如高阻态z\不确定态x等

library ieee;
use ieee.std_logic_1164.all;

entity mux4_1 is--声明一个实体
port(s1,s2:in std_logic;
		a,b,c,d: in std_logic;
		z:out std_logic);
end entity;

architecture activ of mux4_1 is
signal s: std_logic_vector (1 downto 0);
begin
	s<=s1&s2;
process (s,a,b,c,d)--注意,这里必须要以s为敏感信号,而并非以s1和s2
begin
	case s IS
			when "00" => z<=a;
			when "01" => z<=b;
			when "10" => z<=c;
			when "11" => z<=d;
			when others => z<='X';   --注意,这里的X必须大写代表高阻态
	end case;
end process;
end activ;


与if语句相比较,case语句组的程序可读性比较好,这是因为它把条件中所有可能出现的情况全部例了出来,可执行条件一目了然。而且case语句的执行过程不像if语句那样有一个逐项条件顺序比较的过程。case语句中的条件句的次序是不重要的,它的执行过程更接近于并行方式。一般的,综合后,对相同的逻辑功能,case语句比if的描述好用更多的硬件资源,不但如此,对于有的逻辑,case无法描述,只能用if语句来描述。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mux4_1 is
port (a,b:in std_logic_vector(7 downto 0);
		opcode:in std_logic_vector(1 downto 0);
		result: out std_logic_vector(7 downto 0));
end entity mux4_1;

architecture behave of mux4_1 is
constant plus : std_logic_vector (1 downto 0):=b"00";
constant minus : std_logic_vector (1 downto 0):=b"01";
constant equal : std_logic_vector (1 downto 0):=b"10";
constant not_equal : std_logic_vector (1 downto 0):=b"11";
begin
process (opcode,a,b)
begin
	case opcode is
	 when plus => result <=a+b;  --a\b 相加
	 when minus => result<= a-b;    --a\b 相减
	 when equal =>                --a\b相等
if (a=b) then result <=x"01";
			else result <=x"00";
			end if;
			when not_equal=>    --a\b不相等时候
			if (a/=b)  then result<=x"01";
			else  result<= x"00";
			end if;
	end case;
end process;
end behave;

  • 40
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值