VHDL顶层文件是遵循什么思想啊signal信号是根据什么定义的

VHDL顶层文件是遵循什么思想啊signal信号是根据什么定义的,第1张

顶层文件 就是将所有的模块都连接起来的一个主程序,就类似于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的知识

——

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10104883.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)