VHDL快速入门(一)

VHDL 快速入门(一)

写在前面

本篇主旨,以实际案例解析 VHDL。

吐槽,代码块没有 VHDL 的格式,看起来不大舒服…
代码中的 --xxx 是注释


通用位移寄存器

VHDL代码示例

library ieee;  --声明库
use ieee.std_logic_1164.all; --调用库里面的std_logic_1164这个包
entity SHIFT is
port(
	CLK,C0 :in std_logic;
	MD     :in std_logic_vector(2 downto 0);
	D      :in std_logic_vector(7 downto 0);
	QB     :out std_logic_vector(7 downto 0);
	CN     :out std_logic);
end entity SHIFT;
architecture BHV of SHIFT is
	signal REG : std_logic_vector(7 downto 0);
	signal CY  : std_logic;
begin
	process(CLK,MD,C0)
	begin
		if CLK'EVENT AND CLK='1' then
			case MD is
				when "001" =>
					REG(0)<=C0;
					REG(7 downto 1)<=REG(6 downto 0);
					CY<=REG(7);
				when "010" =>
					REG(7)<=C0;
					REG(6 downto 0)<=REG(7 downto 1);
					CY<=REG(7);
				when "011" =>
					REG(0)<=REG(7);
					REG(7 downto 1)<=REG(6 downto 0);
					CY<=REG(7);
				when "100" =>
					REG(7)<=REG(0);
					REG(6 downto 0)<=REG(7 downto 1);
					CY<=REG(7);
				when "101" =>
					REG(7 downto 0)<= D(7 downto 0);
				when others =>
					REG<=REG; CY<=CY;
			end case;
		end if;
	end process;
	QB(7 downto 0)<=REG(7 downto 0);  CN<=CY;
end BHV;

分析
上述代码主要涉及到了 实体、结构体以及进程

实体

一般格式:
entity 实体名 is  
    generic(常数名:数据类型:初值)  
    port(端口信号名:数据类型)  
end 实体名  

示例格式:
entity SHIFT is
port(
	CLK,C0 :in std_logic;
	MD     :in std_logic_vector(2 downto 0);  --可定义字符长度
	D      :in std_logic_vector(7 downto 0);  --注意区别downto和to
	QB     :out std_logic_vector(7 downto 0);
	CN     :out std_logic);
end entity SHIFT;

结构体

一般格式:
architecture 结构体名 of 实体名 is  
    说明部分(可选,如数据类型type 常数constand 信号signal 元件component 过程pocedure 变量variable和进程process等)  
begin  
    功能描述部分  
end 结构体名 

示例格式:
architecture BHV of SHIFT is
	signal REG : std_logic_vector(7 downto 0);
	signal CY  : std_logic;
begin
	功能描述部分
end BHV;

进程

一般格式:
[ 进程标号 :] ] PROCESS ( 敏感信号参数表 )
[声明区 ] ;
BEGIN
	顺序语句
END PROCESS [进程标号] ;

示例格式:
process(CLK,MD,C0) --这边只有一个进程,因此不加进程标号也可以
begin
	--顺序语句,应当包括if、wait、case、loop
	if CLK'EVENT AND CLK='1' then --CLK'EVENT AND CLK='1'即为上升沿触发
		case MD is
			--选择判定
		end case;
	end if;
end process;

选择语句

一般格式:
CASE  表达式 IS
	WHEN   选择值 [ 选择值 ]=>
		顺序语句;
	WHEN   选择值 [ 选择值 ]=>
		顺序语句;
	WHEN OTHERS=>
		顺序语句;
END CASE;

示例格式:
case MD is
	when "001" =>
		REG(0)<=C0;
		REG(7 downto 1)<=REG(6 downto 0);
		CY<=REG(7);
	when "010" =>
		REG(7)<=C0;
		REG(6 downto 0)<=REG(7 downto 1);
		CY<=REG(7);
	when "011" =>
		REG(0)<=REG(7);
		REG(7 downto 1)<=REG(6 downto 0);
		CY<=REG(7);
	when "100" =>
		REG(7)<=REG(0);
		REG(6 downto 0)<=REG(7 downto 1);
		CY<=REG(7);
	when "101" =>
		REG(7 downto 0)<= D(7 downto 0);
	when others =>
		REG<=REG; CY<=CY;
end case;

注意:在选择语句中,需要把所有情况都列出来,不要有空闲状态,否则会引入锁存器。

总结

以实例进行相关内容的学习,应该还是有收获的…

需要注意的是,本篇还有未涉及到的 VHDL 知识,请读者自行拓展学习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值