精华内容
下载资源
问答
  • VHDL的并行语句
    千次阅读
    2021-05-28 12:06:30

    并行语句是硬件描述语言的一大特点,与像c语言不同的是,并行语句的执行是并行的,不会因为书写顺序的前后而产生执行时的先后。VHDL语言支持的并行语句主要有以下7种:

    • 端口映射语句
    • 信号赋值语句
    • when条件选择语句
    • generate语句
    • 进程语句
    • 过程调用语句
    • 块语句

    并行语句在VHDL程序中的位置
    并行语句可以是结构体的begin与end之间的任何位置,举例如下:

    architecture <arch_name> of <entity_name> is
    
    	-- Declarations (optional)结构体声明部分
    
    begin
    
    	-- Process Statement (optional)
    
    	-- Concurrent Procedure Call (optional)
    
    	-- Concurrent Signal Assignment (optional)
    
    	-- Conditional Signal Assignment (optional)
    
    	-- Selected Signal Assignment (optional)
    
    	-- Component Instantiation Statement (optional)
    
    	-- Generate Statement (optional)
    并行语句;
    并行语句;
    。。。
    并行语句
    end <arch_name>;
    

    一、映射语句

    1、映射语句
    映射语句主要应用于模块的调用,在例化模块时用于传递类属性参数和端口连接。

    2、component格式
    声明被引用模块的接口信息,以便调用该模块时正确进行端口与类属性参数的连接。QuartusII声明格式如下:

    3、模块的例化
    在VHDL程序中用在结构体声明中声明的模块,模块例化一次产生一块硬件电路,例化两个就产生两块硬件电路。quartusII模块例化格式如下:

    architecture <arch_name> of <entity_name> is
    
    	-- Declarations (optional)
    
    begin
    
    	-- Process Statement (optional)
    
    	-- Concurrent Procedure Call (optional)
    
    	-- Concurrent Signal Assignment (optional)
    
    	-- Conditional Signal Assignment (optional)
    
    	-- Selected Signal Assignment (optional)
    
    	-- Component Instantiation Statement (optional)
    
    	-- Generate Statement (optional)
    
    end <arch_name>;
    

    二、赋值语句

    1、并行赋值语句
    并行赋值语句是最简单的并行语句,基本格式如下:
    信号<=表达式;
    并行赋值语句由4部分组成:左操作数、赋值操作符“<=”、表达式和“;”。左操作数不能是输入端口信号,表达式中不能含有输出端口信号。

    三、进程语句

    1、process语句
    进程本身是并行语句,多个process语句并行执行,但它却是由顺序语句组成的。它可以组成组合电路,也可以组合成时序电路。基本格式如下:
    [标号:]process(敏感信号列表)
    声明语句;
    begin
    顺序语句1;
    顺序语句2;
    顺序语句3;

    end process;

    其中标号是可选的,敏感信号列表至少需要一个敏感信号。敏感信号的变化决定进程受否执行,如果敏感信号列表没有信号,那么进程永远挂起不执行;如果进程敏感信号列表没有信号,则需要使用wait语句来代表敏感信号列表的功能。

    2、敏感信号列表
    如果进程是实现组合逻辑功能,则赋值操作符右边的信号就应该都列入敏感信号列表;
    如果进程是实现时序逻辑功能且没有一个异步信号,则需要把时钟信号列入敏感信号列表即可;
    如果进程实现时序逻辑功能但与异步信号,则需要把时钟信号与异步信号列入敏感信号列表。
    进程的声明语句可以为进程定义一些变量供进程内部使用,举例如下:

    process(clk)
    --进程内部声明变量的位置
    		variable temp:integer range 0 to 127:=0;
    begin
    	if clk'event and ckl='1' then
    			temp:=temp+1;\
    			dout<=temp;
    	end if;
    end process;
    

    四、条件选择语句

    条件选择作用是根据指定的条件表达式,根据多种可能性进行相应的赋值。条件选择语句有when/else与with/select/when两种形式。
    1、when/else 条件选择语句
    基本格式如下:
    信号<=表达式1 when 条件1 else
    表达式2 when 条件2 else

    表达式n when 条件n else
    表达式n+1;

    2、with/select/when条件选中语句
    with/select/when语句与when/select语句类似,根据分支条件选中相应的表达式对目标信号进行赋值,但也有不同,首先with/select/when语句的分支不能有重复,必须唯一。格式如下:
    信号<=表达式1 when 条件1 ,
    表达式2 when 条件2 ,

    表达式n when 条件n ,
    表达式n+1 when others;

    3、条件选择语句的替换
    条件选择语句是并行语句,但它却可以由顺序语句来替换。用进程中的if语句来替换when/else语句,用进程中的case语句来替换with/select/when语句。

    when/else语句如下:
    信号<=表达式1 when 条件1 else
    表达式2 when 条件2 else

    表达式n when 条件n else
    表达式n+1;

    if语句来替换
    process(条件项与表达式中的敏感信号)
    begin
    if 条件1 then
    信号<=表达式1;
    elsif 条件2 then
    信号<=表达式2;

    elsif 条件n then
    信号<=表达式n;
    else
    信号<=表达式n+1;
    end if;
    end process

    with/select/when基本格式如下;
    with 信号选择判断量select
    信号<=表达式1 when 条件1,
    表达式2 when 条件2,

    表达式n when 条件n,
    表达式n+1 when others;

    可由case语句来替换,替换如下:
    process(信号选择判断量、条件项与表达式的敏感信号表)
    begin
    case 信号选择判断量 is
    when 条件1 =>
    信号<=表达式1;
    when 条件1 =>
    信号<=表达式1;

    when others=>
    信号<=表达式n+1;
    end case;
    end process;

    五、generate生成语句

    1、for/generate生成语句
    for/generate语句在for的范围内执行generate操作,格式如下:
    标号:for循环变量in循环变量的范围generate
    声明语句;
    begin
    并行语句;
    end generate;

    2、if/generate生成语句
    if/generate生成语句是在if条件为真的情况下才执行generate操作,格式如下:
    标号:if判断条件generate
    声明语句;
    begin
    并行语句;
    end generate 标号;

    六、procedure语句

    过程procedure是VHDL两种子程序(过程与函数)之一,可当作并行语句使用,出现在结构体中。过程procedure语句由两部分组成:过程头与过程体,定义格式如下:
    procedure 过程名 参数表 is
    [说明部分]
    begin
    顺序语句
    end procedure 过程名

    参数表是过程的对外接口,可以是信号、变量与常量。说明部分可以为过程声明变量。begin到end procedure之间是过程功能的实现部分,用顺序语句来描述。调用过程子程序时,当参数表输入信号发生变化时即执行过程中的顺序语句。

    七、块语句

    块语句由两行或两行以上的并行语句组成的;一般这种并行语句有一定内在联系,可能是共同组成一个逻辑功能。块语句有两种基本形式:简单块语句和保护块语句。
    1、简单块语句
    基本格式如下:
    标号:block
    块说明语句;
    begin
    并行语句;
    end block标号;

    块说明语句可以是信号的声明、类属性的声明或是不需要任何的块说明语句。

    2、保护块语句
    格式如下:
    标号:block(保护表达式)
    块说明语句;
    begin
    并行语句;
    end block标号;

    保护块说明语句与简单块说明语句意义相同,保护表达式的意义在于如果保护表达式为真,则执行下面的块语句;如果为假,则不执行下面的块语句。

    八、程序包

    程序包是VHDL程序的共享部分,在程序包内定义的数据对象与子程序在引用该程序包的VHDL程序中是可见的,因此程序包是VHDL设计能够复用的一个具体表现。程序包可声明的数据对象与子程序如下:

    -类型的声明

    • 常量的声明
    • 文件的声明
    • 别名的声明
    • 元件的component声明
    • 函数的定义
    • 过程的定义

    程序的使用分为3个过程:程序包的声明、程序包体的定义及使用use语句对程序包的引用。
    程序包声明格式如下
    package 程序包名 is
    声明语句1;
    声明语句2;
    声明语句3;

    声明语句n;
    end 程序包名;

    程序包体的基本格式如下:
    package body 程序包名 is
    函数或过程的定义;
    end 程序包;

    更多相关内容
  • 硬件描述语言VHDL之并行语句基本介绍 -- process语句 process语句本身是并行执行语句 但是process语句内部的语句都是顺序执行语句


    1. process语句


    1.1 基本介绍

    VHDL并行语句process语句:在VHDL中,并行执行语句代表功能独立的电路块,而顺序执行语句则用于描述电路块的功能。

    任意一个敏感信号的改变,进程中由顺序语句定义的行为就会重新执行一遍

    当执行进程中最后一个语句后,执行过程将返回到进程的第一个语句,以等待下一次,敏感信号的变化。


    1.2 基本格式

    一开始将敏感信号视为输入信号即可。
    请添加图片描述


    1.3 代码示例

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity nn is
    	port(
    		a1,a2,a3,a4:in std_logic;
    		b:out std_logic
    	);
    end entity_name;
    
    architecture architecture_name of entity_name is
    	signal tmp:std_logic;
    begin
    
     -- 这是一段process语句
    	P0:process(a1,a2,a3,a4)
    		begin
    			if a1='0' then
    				b <= '0';
    			else
    				b <= '1';
    			end if;
    	end process P0;
    -- 这是一段process语句
    
    end architecture;
    

    2. 简单形式并行信号赋值语句


    2.1 简单并行信号赋值语句说明

    区分一个简单形式的赋值语句是并行语句还是顺序语句的方法:

    如果简单形式的赋值语句是写在process语句中的,那么他就是顺序赋值语句;
    如果是直接写在architecture中的赋值语句,那么他就是并行赋值语句。


    2.2 代码示例

    architecture architecture_name of entity_name is
    	signal tmp1,tmp2,tmp3:std_logic;
    begin
    	tmp1 <= a xor b; -- 并发赋值语句
    	s <= tmp1 xor cin;-- 并发赋值语句
    	tmp2 <= tmp1 and cin;-- 并发赋值语句
    end architecture;
    

    3. 条件信号赋值语句


    3.1 基本格式

    请添加图片描述


    3.2 代码示例

    architecture architecture_name of entity_name is
    begin
    	
    	-- 条件信号赋值语句 [等价于process进程语句中的多选择if语句]
    	q <= i0 when sel="00" else
    	i1 when sel="01" else
    	i2 when sel="10" else
    	i3 when others;
    	-- 条件信号赋值语句
    	
    end architecture;
    

    4. 选择信号赋值语句


    4.1 基本格式

    请添加图片描述


    4.2 代码示例

    library ieee;
    use ieee.std_logic_1164.all;
    entity entity_name is
    	port(
    		m:in std_logic_vector(1 downto 0);
    		s:out std_logic
    	);
    end entity_name;
    
    architecture architecture_name of entity_name is
    begin
    	
    	-- 选择信号赋值语句
    	with m select
    	s <= '1' when "01",
    	'1' when "10",
    	'0' when others;
    	-- 选择信号赋值语句
    	
    end architecture;
    

    5. block块语句


    5.1 简单说明

    block块语句和process语句的区别:

    ,process语句内部是顺序执行的,而 block内部是并行执行的,常用于改善代码结构


    5.2 代码示例

    以下示例代码同时使用了block嵌套:

    architecture architecture_name of entity_name is
    	signal tmp:std_logic;
    begin
    	B0:block
    		signal s:bit;
    	begin
    		s <= a and b;
    		B1:block
    			signal s:bit;
    		begin
    			s <= c and d;
    			B2:block
    			begin
    				z <= s;
    			end block B2;
    		end block B1;
    		y <= s;
    	end block B0;
    end architecture;
    

    6. 并行断言语句


    6.1 简单说明

    并行断言语句在执行时不会引起任何事件的发生
    只是在断言条件为FALSE下给出一条信息报告


    6.2 基本格式

    ASSERT 条件 [REPORT 报告信息] [SEVERITY 出错级别]
    

    6.3 注意事项

    1. 执行过程中,断言语句对条件真假进行判断,如果为‘FALSE’,那么输出错误信息和错误严重程度的级别。
    2. REPORT后面加错误原因字符串,用双引号引起来。
    3. SEVERITY后面错误程度级别有:NOTE / WARNING / ERROR / FAILURE。
    4. REPORT缺省,默认为“Assertion violation”。
    5. SEVERITY缺省,默认为“ERROR”。

    6.4 代码示例

    architecture architecture_name of entity_name is
    	signal tmp:std_logic;
    begin
    
    	ASSERT FALSE
    	REPORT "ERROR"
    	SEVERITY NOTE;
    
    end architecture;
    

    7. Generate语句


    7.1 简单介绍

    generate语句是一种基本的并发描述语句,与顺序描述语句中的loop语句一样用于循环执行某种操作,常与FOR一起使用,另外,也可以和if一起使用。


    7.2 基本格式

    在这里插入图片描述
    在这里插入图片描述


    7.3 代码示例

    signal x : bit_vector(7 downto 0);
    signal y : bit_vector(15 downto 0);
    signal z : bit_vector(7 downto 0);
    ...
    G1 : for i in x range generate
    	z(i) <= x(i) and y(i+8);
    END GENERATE
    

    ——————END-2022-04-24——————

    展开全文
  • Verilog的并行语句

    千次阅读 2021-08-07 10:58:22
    文章目录并行语句verilog生成语句 并行语句 1. 连续赋值语句---assign语句 2. Verilog程序块语句---initial与always块 3. Verilog实例化语句----单独实例化与数组实例化 4. verilog生成语句 verilog生成语句 生成...

    并行语句

    主要包括

    1. 连续赋值语句—assign语句
    2. Verilog程序块语句—initial与always块
    3. Verilog实例化语句----单独实例化与数组实例化
    4. verilog生成语句
    5. verilog函数调用语句
    6. Verilog模块说明语句

    verilog生成语句

    生成语句的关键字为generate,按照形式分为循环生成和条件生成。
    (1)循环生成
    基本语法如下:

        genvar <var>;
        generate 
        	for(<var>=0 ; <var> < <limit> ; <var> = <var> + 1'b1)
        	begin:<label>
        		<statement>
        	end
        endgenerate
    

    注意:
    a、for语句中的变量必须用关键字genvar定义,genvar关键字可以写在generate
    语句外面,也可写在generate语句里面,只要先于for语句声明即可。
    b、必须给循环段起一个名字。即

      	input [3:0] a,b;
      	outpt[3:0] c,d;
      	generate
      	genvar i
      		for (i=0 ; i < 4; i = i + 1)
      		begin: genExample
    			myAnd instance(.a(a) , .b(b), .c(c));
    			assign d[i] = a[i];
    		end
    	endgenerate
    		结果为
    

    在这里插入图片描述

    (2)条件生成
    generate-if语句

     		generate 
     			if(<condition>) begin:<label_1>
     				<code>;
     			end else if(<cindition>)begin:<label_2>
     				<code>;
     			end else begin:<label_3>
     				<code>;
     			end
     		endgenerate
    

    注:
    a、必须为常量比较。
    b、if语句中,begin-end只有在有多条语句时才是必须的。
    c、每一条分支的名称是可选的。与循环语句不同。
    *生成打的电路一旦连通,要想更改必需重新编译——即生成的电路不是动态的没有
    用到多路选择器。如果需要动态选择,直接用assign写多路选择器。

    (3)generate-case语句

     generate
     	case(<constant_expession>)
     		<value>:begin:<label_1>
     			<code>;
     			end
     		<value>:begin:<label_2>
     			<code>;
     			end
     		......
     		default:begin:<label_n>
     			<code>
     			end
     		endcase
     	endgenerate
     	注:与generate-if相同
    

    Verilog函数调用语句

    函数的定义可以放在模块实现部分的声明部分,function语法定义如下:

     	function[<lower>:<upper>]<output_name>;
     		input <name>;
     		<other inputs>
     		<variable declaration>
     		begin
     			<statement>
     		end
     	endfunction
    

    注:
    a、<output_name>既是是输出的变量名也是函数调用名,位宽由function
    关键字后面的范围指定。
    b、中,只能够声明寄存器类型的变量
    c、函数体中语句只能使用阻塞赋值符号;
    d、函数调用的时候只能使用位置赋值,需要按照input的顺序罗列变量
    e、函数调用可以在并行语句中也可以在串行语句中。
    f、函数中可以调用别的函数;
    g、函数支持递归,不过一般用于仿真;
    h、函数不能调用任务,主要由于任务中可以有定时相关语句,而函数中不能有
    例1:

     		moudule tft(
     		input clk,a,b,c,
     		output reg d,e,g
     		 );
     		 function andFunc;
     		 	input a;
     		 	input b;
     		 begin
    			andFunc = a&b;
    		end
    		endfunction
    		
    		always@(posedge clk)begin
    			e <= andFunc(a,b);			//非阻塞赋值
    		end
    
    		always@(*)begin
    			d = andFunc(a,b);
    		end
    
    		assign g = andFunc(a,b);
    	endmodule
    
    展开全文
  • VHDL并行语句于顺序语句的理解

    万次阅读 2018-03-08 10:08:49
    VHDL的并行语句用来描述一组并发行为,它是并发执行的,与程序的书写顺序无关。进程语句begin进程语句包含在结构体中,一个结构体可以有多个进程语句,多个进程语句间是并行的,并可访问结构体或实体中定义的信号。...

    VHDL的并行语句用来描述一组并发行为,它是并发执行的,与程序的书写顺序无关。

    进程语句

    begin
    进程语句包含在结构体中,一个结构体可以有多个进程语句,多个进程语句间是并行的,并可访问结构体或实体中定义的信号。因此进程语句称为并行描述语句。

    进行语句结构内部所有语句都是顺序执行的
    进程语句的启动是由process后敏感信号表中所标明的敏感信号触发来的。
    各进程间的通信是由信号来传递的
    语法如下:
    标记:

    process(敏感信号表)
                              变量说明语句;
    begin 
                               一组顺序语句;
    end process 标记;

    标记:为进程标号
    敏感信号表:是进程用来读取所有敏感信号(包括端口)的列表。
    变量说明:主要包括变量的数据类型说明、子程序说明等
    从begin到end process之间是一组顺序执行语句。

    敏感信号表
    所 谓敏感信号表:就是用来存放敏感信号的列表。在进程语句中,敏感信号指那些发生改变后能引起进程语句执行的信号。敏感信号表中可以使用一个或多个信号,当 其中一个或多个信号值改变时,就在进程内部引起语句执行。敏感信号表也可忽略,但程序中必须有其他形式的敏感信号激励。例如wait、wait for、wait until和wait on。

    进程语句的启动
    在VHDL语言中,进程有两种工作状态:等待和执行。当敏感信号表中的信号没有变化时,进程处于等待状态;当敏感信号表中的信号有变化时,进程处于执行状态
    进程语句的同步
    同一个结构体中不仅可以有多个进程存在,同一个结构体中的多个进程还可以同步。VHDL中通常采用时钟信号来同步进程,具体方法是:结构体中的几个进程共用同一个时钟信号来进行激励。

    并发信号赋值语句
    信号赋值语句在进程内部出现时,它是一种顺序描述语句。

    信号赋值语句在结构体的进程之外出现时,它将以一种并发语句的形式出现。它们在结构体中是并行执行的。

    注意:并发信号赋值语句是靠事件来驱动的,因此对于并发信号赋值语句来说,只有当赋值符号“<=”右边的对象有事件发生时才会执行该语句。

    条件信号赋值语句
    语法结构:
    目标信号<=表达式1 when 条件1 else
                         表达式2 when 条件2 else
                         表达式3 when 条件3 else
                          ...
                         表达式n-1 when 条件n-1 else
                         表达式n;
     
    VHDL 语言程序执行到该语句时,首先要进行条件判断,之后才进行信号赋值。如果满足条件,就将该条件前面那个表达式的值赋给目标信号;如果不满足条件按,就继续 判断,直到最后一个表达式,如果前面的条件均不满足就无条件的赋值给最后一个表达式,因为最后一个表达式赋值无需条件。

    选择信号赋值语句
    语法结构:
    with 表达式 select
              目标信号<=表达式1 when 选择条件1,
                                   表达式2 when 选择条件2,
                                    ...
                                    表达式n when 选择条件n;
     
    该语句在赋值之前需要对条件进行判断,附和条件则赋值,否则继续判断,直到最后一个语句。选择赋值语句需要把表达式的值在条件中都列举出来。

    元件例化语句
    在VHDL中,引用元件或者模块的说明采用component语句,他的作用是在结构体说明部分说明引用的元件或者模块,是元件说明语句。
    语法格式:
    component 引用的元件名
                     generic 参数说明;
                     port 端口说明;
    end componet;
    引用的元件名 :

    是将一个设计现成的实体定义为一个元件,是已经设计好的实体名,用来制定要在结构体中使用的元件名称
    如果结构体中要进行参数的传递,那么component语句中需要类属参数说明--可选项;
    引用元件端口的说明,是已经设计好的实体端口名表;
    元件说明语句在architecture和begin之间。

    元件例化引用
    采用componet语句对要引用的原件进行说明后,为了引用的元件正确地嵌入到高一层的结构体描述中,就必须把被引用的元件端口信号于结构体中相应端口信号正确地连接起来,这就是元件例化语句要实现的功能。
    语法结构:
    标号名:元件名
                    generic map(参数映射)
                    prot map(端口映射);
     
    其中标号:是元件例化语句的惟一标识,结构体中的标号名应该是惟一的
    generic map语句:它的功能是实现对参数的赋值操作,从而可以灵活地改变引用元件的参数,为可选项
    prot map:它的功能是把引用元件的端口信号与实际连接的信号对应起来,从而进行元件的引用操作。
    VHDL中,为了实现引用元件的端口信号与结构体中的实际信号相连接,往往采用两种映射方法:
    1、位置映射方法:指port map语句中实际信号的书写顺序于componet语句中端口说明的信号书写语句顺序一致
    2、名称映射方法:指在port map中将引用的元件的端口信号名称赋值给结构体中要使用例化元件的各个信号
    (名称映射语句的书写要求不是十分严格,只要把映射的对应信号连接起来就可以,顺序可以颠倒)。

    生成语句 
    规则结构
    某些电路部分是由同类元件组成的阵列,这些同类元件叫规则结构,例如:随机RAM、只读ROM、移位寄存器等规则结构一般用生成语句来描述。
    生成语句有两种形式:for_generate和if_generate
    for_generate主要用来描述规则
    if_generate主要用来描述结构在其端部表现出的不规则性,例如边界条件的特殊性
    for_generate语句
    标号:for 循环变量 in 离散范围 generate
                      并行处理语句;
                end generate 标号;
     
    标号:用来作为for_generate语句的唯一标识符,可选项;
    循环变量:它的值在每次循环中都将发生变化;
    离散范围:用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围的最右边,实际上限定了循环次数
    for_generate与for_loop语句很类似,但二者有区别。for_loop语句的循环体中的处理语句是顺序的,而for_generate语句中处理的语句是并行处理的,具有并发性。

    if_generate语句
    标号:if 条件 generate
                并行处理语句;
    end generate 标号;
    if_generate语句是并行处理语句,其中不允许出现else子语句

     

     

    初学VHDL,对一些问题总是感到困惑。比如,同样的赋值语句,在什么场合是并行的,什么时候又是顺序的?信号与变量有什么区别,为什么在PROCESS 里,对信号赋值的结果要等到进程挂起才起作用,而变量赋值却立刻起作用?其实,从语句产生的电路这个角度,可以更深刻地理解这些问题,下面是我自己摸索的 一些理解方法,有不妥之处请大虾们指正!

    1、赋值语句。
        同样a <= b的赋值语句,会形成什么电路,起关键作用的是敏感信号。
        a) 如果a <= b是在进程之外,那么隐含的敏感信号就是b,那么,这个赋值语句就形成一条连线。
        b) 如果是在一个同步进程中,如if (rising_edge(CLK)) then a <= b,这时候,就会形成一个触发器,因为敏感信号是时钟边沿。
       c) 如果敏感信号是一个电平信号,那么会形成一个锁存器。如一个不完整的if条件:if (cond = '1') then a <= b;

    2、并行语句和顺序语句。
        从形成的电路的角度,并行语句最终会有两种形式:
        a) 并联或不相联的逻辑门或组合电路。因为是并联或不相联的,当然是同时执行,这个好理解。
        b) 由同一个时钟边沿驱动的D触发器,不论D触发器之间是并联、串联或者不相连的。为什么呢?因为触发器是在同一个时钟边沿同时翻转的,也就是同时执行,所以本质上就是并行。
        顺序语句只有一种情况,就是形成串联的逻辑门或组合电路。

    3、信号与变量有什么不同?为什么信号赋值要等到进程挂起生效,变量赋值却立刻生效?
        其实,了解了上一点并行语句和顺序语句所生成的电路,这个问题就好理解了。因为在同步进程里的并行语句,大多是形成b的情况,就是多个由同一时钟驱动的触 发 器。由于从触发器的输入到翻转、输出需要一定的延时,这个延时基本就是进程执行完毕的时间,所以,触发器翻转后的输出在同一个时钟边沿中是看不到的,因为 它还没翻转过来呢。这就是信号赋值要等到进程挂起才生效的原因。
        那为什么变量赋值却能立刻生效呢?这是因为,变量其实是为了帮助在同步进程中生成一些逻辑门或组合电路用的。看一看代码:var1 := not i1; var2 := var1 and i2 ; sig <= var2; 生成的RTL,就会看到,两个变量赋值语句其实生成了一个非门、一个与门。而且,输入信号i1和i2到var2这段是个组合电路,是不受时钟边沿控制的, 而到信号赋值语句sig <= var2,才形成一个D触发器。所以,这两个变量赋值语句生成了一个串联的非门和与门,那当然var2取到的是var1赋值后的值了。
        最后顺便提一下为什么变量必须只能在进程内可见,我猜可能是为了防止在同步进程中输出异步信号,造成混乱吧。因为如果变量是外部可见的,如上面的 var2,那么var2的值就可以异步输出到进程外了。所以限制变量只能进程内可见后,要输出变量的值就只能赋值给一个信号,在同步进程中,就是加了一个 触发器了。

    展开全文
  • EDA笔记(6)--并行语句

    千次阅读 2020-04-29 17:28:19
    一.进程语句 1.进程(PROCESS)语句 ...一个结构体中可以有多个并行运行的进程结构,而每一个进程的内部结构却是由一系列顺序语句来构成的。 PROCESS结构中既可以有时序逻辑的描述,也可以有组合逻辑的描述,它们...
  • 并行语句的特点:2.结构体2.1 并行信号赋值语句2.2条件信号赋值语句2.3选择信号赋值语句3.元件例化语句4.生成语句5.参数传递映射语句及其使用方法参数传递说明的一般书写格式如下:6.参数传递映射语句及其使用方法...
  • sv中并行语句

    2021-11-10 14:06:26
    sv中并行语句 sv中有fork-join、fork-join_none、fork-join_any三种并行语句,拿一个栗子说明三者的区别。 有三个子线程同时运行 ,只要有任何一个线程结束,就退出并行块,以下是三种实现方法。 task test(); ...
  • FPGA之道(28)VHDL的并行语句

    千次阅读 2020-02-13 00:04:16
    VHDL的并行语句 在VHDL的基本程序框架一节中,我们了解到,architecture语句部分里面的语句都是并行的。 那么到底VHDL里面有哪些并行语句可以供我们使用呢?请看如下描述: architecture <arch_name> of ...
  • 硬件描述语言VHDL——并行语句

    千次阅读 2019-04-07 22:37:16
    并行语句是是硬件描述语言的特殊之处,这也是硬件描述语言不可少的一部分。硬件电路例如:总线,它需要多个输入。这个时候,我们必须并发的给出总线上的数据。软件程序设计语言也有并发,但是在性能要求不是苛刻的...
  • VHDL程序并行语句的应用[参考].pdf
  • 《在系统可编程技术应用设计&SOPC技术及应用》——第6讲 VHDL并行语句.ppt
  • 一、并行赋值语句 包括并发信号赋值、条件信号赋值、选择信号赋值。 1、并发信号赋值: q <= tmp3; tmp3类似于敏感信号,每当tmp3信号变化一次,就执行一次。 2、条件信号赋值 条件赋值语句的赋值具有优先级,第...
  • EDA技术与VHDL第四版课件,潘松——第5章 VHDL并行语句
  • VHDL并行语句(Concurrent Statements)

    千次阅读 2017-02-23 12:46:05
    VHDL并行语句(Concurrent Statements)并行语句和其他并行语句同步执行。以为为并行语句: Concurrent statements are concurrent with respect to all other such statements. The following are concurrent ...
  • architecture中如果没有process的时候是不是整个代码就是按顺序语句运行了?如 architecture rtl of process_test is begin c; end architecture rtl; 假如说结构体中有process的时候,整个代码就是按并行做了?...
  • 本文节选自《FPGA之道》,来一起学习下作者对于并行与串行的讲解。
  • 并行信号赋值语句

    2021-11-05 08:32:49
    这3信号赋值语句的共同点是赋值目标必须都是信号,所有赋值语句与其他并行语句一样,在结构体内的执行是同时发生 简单信号赋值语句 语句格式 赋值目标 <= 表达式; 式中赋值目标的数据对象必须是信号,它的数据...
  • 比如,同样的赋值语句,在什么场合是并行的,什么时候又是顺序的?信号与变量有什么区别,为什么在PROCESS 里,对信号赋值的结果要等到进程挂起才起作用,而变量赋值却立刻起作用?其实,从语句产生的电路这个角度,...
  • 比如,同样的赋值语句,在什么场合是并行的,什么时候又是顺序的?信号与变量有什么区别,为什么在PROCESS 里,对信号赋值的结果要等到进程挂起才起作用,而变量赋值却立刻起作用?其实,从语句产生的电路这个角度,...
  • C语言设计并行处理

    2021-05-21 17:54:31
    并行机制要涉及到一个重要的语句,那就是While语句。你可能不禁会问:那不就是循环吗?对,并行机制就是要利用循环,即游戏循环(Game Loop)。实际上,所有程序并行的本质就是循环,连Windows也不例外。Windows号称多...
  • 所谓的块语句,无非就是一组语句,例如在initial或者always中,使用begin...end或者fork...join包裹的语句,都可以称为块语句。块语句有两种
  • VHDL的顺序语句

    千次阅读 2021-05-30 15:23:18
    上次我们了解了VHDL语言的并行语句,现在我们来学习VHDL的顺序语句。 顺序语句与并行语句共同构成了VHDL的描述语言,是VHDL作为硬件描述语句的一个特点。顺序语句只在仿真时间上是相对并行语句而言的,实际硬件的...
  • 基于OpenMP的并行计算

    2021-10-01 23:25:45
    基于OpenMP的并行计算 本人所有博客仅用于个人的知识积累,禁止商业与非商业用途的剽窃和抄袭,如有错误,欢迎各位大佬批评指正,一起交流讨论、共同成长。 序言:本学期选修了《GPU并行计算》这门课程,借此来...
  • 文章目录一、从@语句中break的问题二、并行线程的几种实现 一、从@语句中break的问题 最近遇到一个情形,已经进入@语句等待敏感事件A,但是中途若出现另一个事件B,要求立即从@语句中break出来,且不执行后续语句。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,409
精华内容 65,763
关键字:

并行语句

友情链接: 移动端小商城.zip