
顶层文件 就是将所有的模块都连接起来的一个主程序,就类似于C语言中的main函数,所有的输入输出端口都是在顶层程序中,
你说的PORT MAP是一个例化过程,举个例子给你看吧!
比如说要例化一个程序,它的实体是这样
entity exp is
port(a,b:in std_logic;
c:out std_logic_vector(1 downto 0));
end entity;
然后在主程序中例化它是
architecture art of zhu is
component exp is
port(a,b:in std_logic;
c:out std_logic_vector(1 downto 0));
end component;
begin
u:exp port map(a1=>a,b1=>b,c1=>c);其中a1,b1,c1,是你主程序和exp相连设置的信号
具体过程你随便找一本书看就有了,关于例化的!其实应用到电路就是管脚相连而已
LIBRARY IEEE;
USE IEEESTD_LOGIC_1164ALL;
USE IEEEstd_logic_arithall;
USE IEEEstd_logic_unsignedall; ---调用常用的库
ENTITY add8b IS
PORT(
clk:IN STD_LOGIC; ---时钟信号
cin: IN STD_LOGIC; ---相加进位信号
a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-----两个8位的二进制数
s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ----输出
cout:OUT STD_LOGIC);
END;
ARCHITECTURE cheng OF add8b IS
SIGNAL adda1,adda2,addb1,addb2,reg1a,reg1b,add1,add2:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL reg2:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL cin1:STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF clk'EVENT AND clk='1' THEN
adda1<='0'&a(3 DOWNTO 0); ----adda1是a的低4位
addb1<='0'&b(3 DOWNTO 0);-----addb1是b的低4位
adda2<='0'&a(7 DOWNTO 4);------adda2是a的高4位
addb2<='0'&b(7 DOWNTO 4);------addb2是b的高4位
cin1<=cin;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF clk'EVENT AND clk='1' THEN
add1<=adda1+addb1+cin1; ---低4位相加放入add1 注意考虑是否有进位
reg1a<=adda2;
reg1b<=addb2;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF clk'EVENT AND clk='1' THEN----高4位相加,考虑低4位相加的进位
add2<=reg1a+reg1b+add1(4);
reg2<=add1(3 DOWNTO 0);
END IF;
END PROCESS;
s<=add2(3 DOWNTO 0)&add1(3 DOWNTO 0);----结果是高四位与低四位并置
cout<=add2(4); ---是否有进位
END cheng ;
第二个 只需要搞清 二进制数的乘法原理就可以了 两个4位二进制数相乘,如a=1010,b=1111 那么可以看成是1010(1000+0100+0010+0001),结果等于 将1010左移三位加上1010左移两位,加上1010左移1位加上1010不移位
就是结果
y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000");
第一个是不移动 第二个是b低二位与a相乘左移1位 第三是b低3位 与a相乘左移两位,第四是b最高位与a相乘左移三位 结果相加
D是信号,进程中信号赋值只有在进程结束时才会生效,所以尽管此时D(10)被D(9)赋值,但是D(10)的值不会改变,直至END PROCESS才会变化;
VHDL中 信号 和 变量 是不一样的,变量的行为更接近于软件编程语言中的变量概念。
[1] 信号可以在实体或结构体中定义,变量在进程中定义;
[2] 信号可以在结构体任意地方读写,变量只能在进程中使用,且不同进程的变量是独立的;
[3] 信号在进程中的赋值在进程结束时生效,变量的赋值立即生效;
基于信号的赋值特性,可以推断,进程中所有信号的赋值在进程结束时同时生效,进程执行过程中,信号值保持不变,可以认为是常量。进程执行过程中,出现对同一信号多次赋值的情况时,新值以最后一次赋值为准。
VHDL:序列发生器实现,输出序列暂时选为"111010101 ",你可以根据需要给定输出序列,原代码如下(仿真结果见图)
LIBRARY ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_arithall;
use ieeestd_logic_unsignedall;
entity sequencer is --11101010--
port(clk : in std_logic;
rst : in std_logic;
seq : out std_logic);
end sequencer;
architecture arch of sequencer is
type state_type is (S0,S1,S2,S3,S4,S5,S6,S7);
signal state : state_type;
begin
P1 : process(clk,rst)
begin
if rst='0' then
state <= S0;
elsif clk'event and clk = '1' then
if state <= S0 then
state <= S1;
elsif state <= S1 then
state <= S2;
elsif state <= S2 then
state <= S3;
elsif state <= S3 then
state <= S4;
elsif state <= S4 then
state <= S5;
elsif state <= S5 then
state <= S6;
elsif state <= S6 then
state <= S7;
elsif state <= S7 then
state <= S0;
else
state <= S0;
end if;
end if;
end process P1;
P2 : process(clk,rst) --11101010--
begin
if rst='0' then
seq <= '0';
elsif clk'event and clk='1' then
case state is
when S0=>
seq <= '1';
when S1=>
seq <= '1';
when S2=>
seq <= '1';
when S3=>
seq <= '0';
when S4=>
seq <= '1';
when S5=>
seq <= '0';
when S6=>
seq <= '1';
when S7=>
seq <= '0';
when others=>NULL;
end case;
end if;
end process P2;
end arch;
和前面相同的我就不解释了
LIBRARY ieee;
USE ieeestd_logic_1164all;
USE ieeestd_logic_unsignedall;--不解释
ENTITY BUFF IS --buff实体定义
PORT
(
LD: IN STD_LOGIC;
AA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
BB: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);--ld AA为输入型号 bb为输出 其中AA BB 是4位信号
END BUFF;
ARCHITECTURE a OF BUFF IS 定义buff实体下的结构体a
SIGNAL BUFF1: STD_LOGIC_VECTOR(3 DOWNTO 0); 定义信号量buff1 共4位
BEGIN 开始
PROCESS(LD) 引入进程(LD为敏感信号) 一般敏感信号是你的输入端口
BEGIN 开始
IF LD='1' THEN BUFF1<=AA; 如果ld为高电平 则 AA的4位数据送入buff信号量 记住 只有 定义的信号量 采用“<=”这个符号 定义变量 符号为“:=”
ELSE NULL;--否则 不做任何事情
END IF;结束if
END PROCESS;结束进程
BB<=BUFF1; 把buff1的值送给外部端口BB
END A;结束A
另外说一句 信号量可以看成是内部电源线路 有硬件特性 是有先后顺序的,而变量 是可以随时改变的 如果不明白 可以查查C语言中的volatile关键字(VHDL里面没有这个关键字,但意思是一样的)
LIBRARY ieee;
USE ieeestd_logic_1164all;
USE ieeestd_logic_unsignedall;--不解释
ENTITY cnt10 IS --定义cnt10这个实体
PORT
(
clk,rst,en: IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC
); --端口定义 clk rst en为输入,cq 是4位输出 cout是输出
END CNT10;
ARCHITECTURE a OF CNT10 IS--定义cnt10实体下的a结构体
BEGIN-开始
PROCESS (clk,RST,EN)-进程开始 敏感信号 clk rst en
VARIABLE CQI: STD_LOGIC_VECTOR(3 DOWNTO 0);--定义变量 CQI 4位
BEGIN 开始
IF RST = '1' THEN CQI:=(OTHERS=>'0'); 如果RST为高电平 则 CQI全部是低电平 注意“:=”前面我说过
ELSIF (clk'EVENT AND clk = '1') THEN 否则 上升沿来的时候
IF EN = '1' THEN 外加en为高电平的时候
IF CQI<9 THEN CQI:=CQI+1; 然后CQI 小于9 这3个条件同时满足(有先后优先级顺序的)CQI 自加1
ELSE CQI:=(OTHERS=>'0'); 否则CQI清零
END IF;结束if
END IF;结束if
END IF;结束if
IF CQI=9 THEN COUT<='1';如果cqi=9 则cout输出高电平
ELSE COUT<='0'; 否则 cout一直为低电平
END IF;
CQ<=CQI; CQI的值传给CQ
END PROCESS;结束进程
END a; 结束
另外 一个实体可以有多个结构体 也就是说 一个cnt10可以有a这个结构体 比如上面这个程序 也可以有b,c,d这些 所以要有一个begin
这个程序每隔9个时钟周期输出一个高电平 可以看成分频程序
计算机组成原理是计算机科学与技术学科的支柱,也是计算机专业的最重要的基础教育之一。在计算机组成原理和数字电路实验中使用VHDL语言的最大优势在于其强大的描述能力,与其他描述语言相比具有诸多优势。
VHDL语言为学生提供了概念化和设计环境的能力,交替使用不同的算法来编译电路的运行,并根据编写的代码自行进行各种模拟和测试,以使编译达到最佳效果。
这样的实验过程更能激发学生的学习兴趣和实践兴趣,进一步提高学生的实践能力和创新能力。作为一名计算机专业的大三学生,下面和大家分享一些VHDL的知识。
—— 欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)