文档库 最新最全的文档下载
当前位置:文档库 › 六、比较阻塞赋值与非阻塞赋值的区别

六、比较阻塞赋值与非阻塞赋值的区别

六、比较阻塞赋值与非阻塞赋值的区别
六、比较阻塞赋值与非阻塞赋值的区别

六、比较阻塞赋值与非阻塞赋值的区别

一:源代码:

module blocking(clk, a, b, c);

output[3:0] b, c;

input[3:0] a;

input clk;

reg[3:0] b, c;

always @(posedge clk)

begin

b=a;

c=b;

end

endmodule

module non_blocking(clk, a, b, c);

output[3:0] b, c;

input[3:0] a;

input clk;

reg[3:0] b, c;

always @(posedge clk)

begin

b<=a;

c<=b;

end

endmodule

二:测试代码:

`timescale 1ns/100ps

`include "source_code.v"

module compareTop;

wire[3:0] b1, c1, b2, c2;

reg[3:0] a;

reg clk;

initial

begin

clk=0;

forever #50 clk=~clk;

end

initial

begin

a=4'h3;

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

#10 a=4'h7;

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

#10 a=4'hf;

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

#10 a=4'ha;

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

#10 a=4'h2;

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

#10

$display("%dns->blocking is: %d %d %d ->non_blocking is: %d %d %d", $time, a, b1, c1, a, b2, c2);

$stop;

end

non_blocking non_blocking(clk, a, b2, c2);

blocking blocking(clk, a, b1, c1);

endmodule

三:Transcript显示结果:

# Reading D:/altera/91/modelsim_ase/tcl/vsim/pref.tcl

# Loading project cnt16

# reading D:\altera\91\modelsim_ase\win32aloem/../modelsim.ini

# Loading project blocking

# Compile of blocking.v was successful.

# Compile of blockingtp.v was successful.

# Compile of blocking.v was successful.

# 2 compiles, 0 failed with no errors.

vsim work.blockingtp

# vsim work.blockingtp

# Loading work.blockingtp

# Loading work.non_blocking

# ** Warning: (vsim-3009) [TSCALE] - Module 'non_blocking' does not have a `timescale directive in effect, but previous modules do.

# Region: /blockingtp/non_blocking

# Loading work.blocking

# ** Warning: (vsim-3009) [TSCALE] - Module 'blocking' does not have a `timescale directive in effect, but previous modules do.

# Region: /blockingtp/blocking

add wave -r /*

# Compile of blocking.v was successful.

# Compile of blockingtp.v was successful.

# Compile of blocking.v was successful.

# 2 compiles, 0 failed with no errors.

run

# 0ns->blocking is: 3 x x ->non_blocking is: 3 x x run -continue

run -all

# 10ns->blocking is: 7 x x ->non_blocking is: 7 x x # 20ns->blocking is: 15 x x ->non_blocking is: 15 x x # 30ns->blocking is: 10 x x ->non_blocking is: 10 x x # 40ns->blocking is: 2 x x ->non_blocking is: 2 x x # 50ns->blocking is: 2 x x ->non_blocking is: 2 x x # Break in Module blockingtp at E:/workverilog/blockingtp.v line 26

四:测试波形如下图所示:

精讲阻塞赋值非阻塞赋值

所谓阻塞赋值"="和非阻塞赋值"<="的的区别在于"="是直接赋值。常见于组合逻辑 当C=B;B=A;这种情况下,在一个时钟周期里,B和C可以同时等于A;也就是说这时候B 的原始数据将会丢失。 而<=是非阻塞赋值。常见于时序逻辑,也就是与CLK有关的always块里,当C<=B;B<=A;此时C得到A的值需要两个时钟周期来完成,也就是第一个时钟周期A的值赋给B,第二个周期B赋给C。也就是说B的原始数据在第一个时钟周期会保留在C中。B非瞬间丢失。 所以阻塞可以理解成瞬间丢失;而非阻塞即可以理解成非瞬间丢失。简单的就是阻塞理解成丢失。非阻塞理解成非丢失。 看下面两个程序: 1.module top(clk,a,c); input a,clk; output c; reg c,b; always @( posedge clk ) begin b<=a; c<=b; end endmodule 2.module top(clk,a,c); input a,clk; output c; reg c,b; always @( posedge clk ) begin b=a; c=b; end endmodule 第一个程序用的是非阻塞赋值,对其生成模块如下:

clk信号的上升沿到来时,b就等于a,c就等于b,这里应该用到了两个触发器。请注意:赋值是在"always"块结束后执行的,c应为原来b的值。(这里的理解是,在第一拍时钟下,第二个触发器不可能取到a值作为输入的D端,若采到即保持时间违例。)第二个程序用的是阻塞赋值,对其生成模块如下: clk信号的上升沿到来时,将发生如下的变化:b马上取a的值,c马上取b的值(即等于a),生成的电路图如下所示只用了一个触发器来寄存器a的值,又输出给b和c。 下面从功能和执行时间上对其进行分析: 阻塞赋值操作符用等号(即= )表示。为什么称这种赋值为阻塞赋值呢?这是因为在赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,它才允许别的赋值语句的执行。一般可综合的阻塞赋值操作在RHS不能设定有延迟,(即使是零延迟也不允许)。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延迟。 阻塞赋值的执行可以认为是只有一个步骤的操作: 计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。 非阻塞赋值操作符用小于等于号 (即 <= )表示。为什么称这种赋值为非阻塞赋值?这是因为在赋值操作时刻开始时计算非阻塞赋值符的RHS表达式,赋值操作时刻结束时更新LHS。在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的Verilog非阻塞赋值语句都能同时计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。非阻塞赋值的操作可以看作为两个步骤的过程: 1)在赋值时刻开始时,计算非阻塞赋值RHS表达式。 2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。 非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial"块和"always"块等过程块中。非阻塞赋值不允许用于连续赋值。 在编程时应该注意以下问题: 1)时序电路建模时,用非阻塞赋值。 2)锁存器电路建模时,用非阻塞赋值。 3)用always块建立组合逻辑模型时,用阻塞赋值。 4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。

fpga小梅哥理解阻塞赋值程序

07_理解阻塞赋值与非阻塞赋值 //非阻塞语句,同步执行 module block_unblock(clk,rst_n,a,b,c,out); //定义输入输出端口 input clk; input rst_n; input a,b,c; output reg[1:0] out; //定义过程中寄存器 reg[1:0] d; //程序块 //out=a+b+c=d+c always@(posedge clk or negedge rst_n) if(!rst_n) out=2'b0; else begin d <= a + b;//非阻塞语句 out <= d + c;//非阻塞语句 end endmodule

结论:非阻塞赋值与语句出现的前后顺序无关,阻塞赋值与语句出现顺序有关,推荐使用非阻塞复制,状态稳定。附:testbench文件 //定义步长和精度 /**定义的参数在后续引用时需要加转义字符`**/ `timescale1ns/1ps `define clk_period 20 `define count 10 module block_unblock_tb; //定义激励信号, /**与与测试模块中一一对应,省去端口例化,但是注意要写在模块内部**/ reg clk; reg rst_n; reg a,b,c; wire[1:0] out; //例化待测试模块 block_unblock block_unblock0(clk,rst_n,a,b,c,out); //时钟信号 initial clk=1; always#(`clk_period/2) clk=~clk; //复位信号 initial begin rst_n=1; // #(`clk_period*2) rst_n=0; // #(`clk_period*`count) rst_n=1; end //编写测试输入信号 initial begin a=0;b=0;c=0; #(`clk_period*2); a=0;b=0;c=1; #(`clk_period*2); a=0;b=1;c=0; #(`clk_period*2); a=0;b=1;c=1; #(`clk_period*2); a=1;b=0;c=0; #(`clk_period*2); a=1;b=0;c=1; #(`clk_period*2); a=1;b=1;c=0; #(`clk_period*2); a=1;b=1;c=1; #(`clk_period*2); $stop; end endmodule

Verilog期末复习题

Verilog 复习题 一、填空题 1.用EDA技术进行电子系统设计的目标是最终完成ASIC的设计与实现。 2.可编程器件分为CPLD和FPGA。 3 . 随着EDA技术的不断完善与成熟,自顶向下的设计方法更多的被应用于VerilogHDL 设计当中。 4 . 目前国际上较大的PLD器件制造公司有ALtera和Xilinx公司。 5.完整的条件语句将产生组合电路,不完整的条件语句将产生时序电路。 6.阻塞性赋值符号为=,非阻塞性赋值符号为<=。 7.有限状态机分为Moore和Mealy两种类型。 8、EDA缩写的含义为电子设计自动化(ElectronicDesignAutomation) 9.状态机常用状态编码有二进制、格雷码和独热码。 10.VerilogHDL 中任务可以调用其他任务和函数。 11.系统函数和任务函数的首字符标志为$ ,预编译指令首字符标志 为 12.可编程逻辑器件的优化过程主要是对速度和资源的处理过程。 13、大型数字逻辑电路设计采用的IP核有软IP、固IP和硬IP。 # 。 二、选择题 1、已知“a=1b’1;b=3b'001;”那么{a,b}=( C ) (A)4b'0011(B)3b'001(C)4b'1001(D)3b'101 2、在verilog 中,下列语句哪个不是分支语句? ( D ) (A)if-else(B)case(C)casez(D)repeat 3、VerilogHDL 语言进行电路设计方法有哪几种 ( ①自上而下的设计方法( Top-Down) ②自下而上的设计方法( Bottom-Up) 8分) ③综合设计的方法 4、在verilog语言中,a=4b'1011,那 么 &a=(D ) (A)4b'1011(B)4b'1111(C)1b'1(D)1b'0 5、在verilog语言中整型数据与(C)位寄存器数据在实际意义上是相同的。 (A)8(B)16(C)32(D)64 6、大规模可编程器件主要有FPGA、CPLD两类,下列对FPGA结构与工作原理的描述中,正确的是___C____。 A.FPGA全称为复杂可编程逻辑器件; B.FPGA是基于乘积项结构的可编程逻辑器件; C.基于SRAM的FPGA器件,在每次上电后必须进行一次配置; D.在Altera公司生产的器件中,MAX7000系列属FPGA结构。 7.子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行速度(即速度优化);指出下列哪些方法是面积优化___B______。 ①流水线设计 ②资源共享 ③逻辑优化

阻塞与非阻塞

001 阻塞赋值与非阻塞赋值 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方。关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错。所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献。 本文共分为三部分,第一部分是正确使用阻塞与非阻塞赋值的基本原则。第二部分是阻塞与非阻塞赋值对应电路的行为逻辑。第三部分是阻塞与非阻塞赋值的原理简介。 一.Golden Rule 编码原则很多,就阻塞非阻塞赋值而言,新手最需要牢记的是其中三条: 1)时序逻辑一定用非阻塞赋值”<=”,一旦看到敏感列表有posedge就用”<=”。 2)组合逻辑一定用”=”,一旦敏感列表没有posedge就用”=”,一旦看到assign 就用”=”。 3)时序逻辑和组合逻辑分成不同的模块,即一个always模块里面只能出现 非阻塞赋值”<=”或者”=”。如果发现两种赋值并存,一个字”改”,心存侥 幸可能会给后续工作带来更多麻烦。 以上三条,对新手而言不必追求为什么,需要的就是条件反射的照章办事。 最后说一句,新手可能记不住哪个符号是阻塞赋值,哪个是非阻塞赋值,大家可以数数,”非阻塞赋值”一共5个字,“阻塞赋值“4个字,所以非阻塞用的符号”<=”比阻塞赋值用的符号”=”长。 二.电路行为逻辑。 第一节给出了三条最基本的编码原则,有个朋友可能会想,按照这三条编码原则写出来的代码会按怎样的逻辑工作呢?这一节就是回答这个问题。

第1节 组合逻辑和时序逻辑

第1节组合逻辑和时序逻辑 来源:https://www.wendangku.net/doc/f113158466.html,/book/09-03/8331410070307.html 通过前面各章的学习可知,Verilog HDL语言分为面向综合和面向仿真两大类语句,且可综合语句远少于仿真语句,读者可能会有可综合设计相对简单的感觉。然而事实刚好与此相反,这是因为:首先,可综合设计是用来构建硬件平台的,因此对设计的指标要求很高,包括资源、频率和功耗,这都需要通过代码来体现;其次,在实际开发中要利用基本Verilog HDL语句完成种类繁多的硬件开发,给设计人员带来了很大的挑战。所有的仿真语句只是为了可综合设计的验证而存在。为了让读者深入地理解可综合设计、灵活运用已学内容,本章将可综合设计中的基本知识点和难点提取出来,融入Verilog HDL语法以及开发工具等诸多方面,以深入浅出的方式向读者说明设计中的难点本质。 8.1 组合逻辑和时序逻辑 数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做时序逻辑电路(简称时序电路)。掌握组合逻辑和时序逻辑的区分手段与实现方法是数字系统设计的基本要求。 8.1.1 组合逻辑设计 1.组合逻辑概念 组合逻辑是Verilog HDL设计中的一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关。无存储电路,也没有反馈电路,其典型结构如图8-1所示。从电路行为上看,其特征就是输出信号的变化仅仅与输入信号的电平有关,不涉及对信号跳变沿的处理。 尽管组合电路在功能上千差万别,可是其分析方法却有很多相似之处。给定逻辑电路后,得到其输入与输出的直接表达式,将输入组合全部带入表达式中计算得到输出结果,并以真值表的形式表达出来,最后根据真值表说明电路功能。 组合逻辑电路的设计就是在给定逻辑功能的前提下,通过某种设计渠道,得到满足功能要求且最简单的逻辑电路。基于HDL 语言和EDA 工具的组合逻辑电路的设计流程如图8-2 所示。

Verilog阻塞赋值与非阻塞赋值

硬件描述语言是对硬件的描述,最终生成的是硬件电路。所以对硬件描述语言的分析的最佳方法就是从它生成的电路入手。 其次清晰阻塞赋值和非阻塞赋值之间的区别,用一个简单的例子来说明,具体解释见教材。 阻塞非阻塞 b=a; b<=a; c=b; c<=b; 前一时刻abc的值分别为a0,b0,c0 则执行以上语句后,abc的值分别为 a0,a0,a0(阻塞)a0,a0,b0(非阻塞) 下面以一个流水灯例子来介绍一下两者区别: module led_water(LED,CLK,reset); output[5:0] LED; input CLK,reset; reg [5:0] LED; reg [39:0] counter; //initial //LED=8'b11111111; //assign LED<=8'b00000001; initial LED=6'b111110; [url=]always@(posedge[/url] CLK) // begin counter<=counter+1; // if(counter==40'b1001100010010110100000000) //40M begin if(LED==6'b111111) LED<=6'b111110; //------1-------号位置 begin LED<=(LED<<1); LED[0]<=1; end counter<=0; //--------2---------号位置 end

end endmodule 下面来分析这个问题, 请看放在一号位置的情况下,LED输出的最终硬件输出, 当满足counter==40'b1001100010010110100000000且LED==6'b111111时, 首先我们对LED赋值LED<=6'b111110;注意这是非阻塞赋值语句,也就是说LED的输出并没有马上变为6'b111110,而是维持在原来的6'b111111。 接着我们对LED赋值 LED<=(LED<<1); LED[0]<=1; 那么这时LED被后赋值为6'b111111<<1,即6'b111110,随后LED[0]<=1;是的LED为6'b111111。随后,由于没有低电平位,所以无论怎么左移都不可能出现灯亮的情况,这就是为什么第一轮LED可以循环,一轮结束后灯就不会再亮了。 当我们把语句放在二号位置后, 我们是先对LED赋值 LED<=(LED<<1); LED[0]<=1; 然后再次对它赋值为LED<=6'b111110;这时寄存器存贮的就是后赋值的6'b111110,可以保证流水灯的正常循环。 阻塞和非阻塞赋值的语言结构是V erilog语言中最难理解概念之一,我看到许多相关文献推荐可综合风格的Verilog 模块阻塞和非阻塞赋值编程的八个原则,在本设计中严格遵守了它们,深感获益匪浅,在此也推荐出来: 原则1:时序电路建模时,用非阻塞赋值。 原则2:锁存器电路建模时,用非阻塞赋值。 原则3:用always块写组合逻辑时,采用阻塞赋值。 原则4:在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。 原则5:在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。 原则6:不要在多个always块中为同一个变量赋值。 原则7:用$strobe系统任务来显示用非阻塞赋值的变量值。 原则8:在赋值时不要使用#0延迟。 最后附上一篇有关Verilog非阻塞赋值的仿真综合问题的文章,希望对大家对深入理解VerilogHDL阻塞赋值和非阻塞赋值有帮助!

EDA试题

1.wire型变量与reg型变量有什么本质区别?它们可以用于什么类型语句中? 2.阻塞赋值与非阻塞赋值有何区别? 1.用Verilog设计一个3-8译码器。 2.设计一个异步清0,同步时钟使能和异步数据加载型8位二进制加法计数器。参考例3-22 module CNT10(clk,rst,en,load,cout,dout,data); input clk,en,rst,load; input [3:0] data; output[3:0] dout; output cout; reg [3:0] q1; reg cout; assign dout=q1; always@(posedge clk or negedge rst or negedge load) begin if(!rst) q1<=0; else if(!load) q1<=data; else if(en) begin if (q1<9) q1<=q1+1; else q1<=4'b0000; end end always@(q1) if(q1==4'h9) cout=1'b1; else cout=1'b0; endmodule 3.设计一个功能类似74LS160的计数器。 4.设计一个含有异步清零和计数使能的16位二进制加减可控计数器的Verilog HDL描述。

5.设计七人表决器。 module voter7(pass,vote); output pass;input [6:0] vote; reg pass;reg [2:0] sum; always @(vote) begin sum=0; if(vote[0]==1) sum=sum+1'b1; if(vote[1]==1) sum=sum+1'b1; if(vote[2]==1) sum=sum+1'b1; if(vote[3]==1) sum=sum+1'b1; if(vote[4]==1) sum=sum+1'b1; if(vote[5]==1) sum=sum+1'b1; if(vote[6]==1) sum=sum+1'b1; if(sum[2]) pass=0; //若超过4人赞成,则pass=0,LED1亮 else pass=1; end endmodule Altera Xilinx 一、填空题(10分,每小题1分) 1.用EDA技术进行电子系统设计的目标最终完成 ASIC 的设计与实现。 2.可编程逻辑器件分为 FPGA 和 CPLD 。 3.随着EDA技术的不断完善与成熟,自顶向下的设计方法更多的被应用于Verilog HDL设计当中。 4.目前国际上较大的PLD器件制造公司有 Altera 和 Xilinx 公司。 5.完整的条件语句将产生组合电路,不完整的条件语句将产生时序电路。 6.阻塞性赋值符号为=,非阻塞性赋值符号为<=。 二、选择题(10分,每小题2分) 1.大规模PLD器件主要有FPGA、CPLD两类,下列对FPGA结构与工作原理的描述中,正确的是 C 。 A.FPGA全称为复杂可编程逻辑器件; B.FPGA是基于乘积项结构的可编程逻辑器件; C.基于SRAM的FPGA器件,在每次上电后必须进行一次配置; D.在Altera 公司生产的器件中,MAX7000系列属于FPGA结构。 2.基于EDA软件的FPGA/CPLD设计流程为:原理图/HDL文本输入→综合→→→适配→编程下载→硬件测试。正确的是 B 。 ①功能仿真②时序仿真③逻辑综合④配置⑤分配管脚 A.③① B. ①⑤ C. ④⑤ D. ④② 3.子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行速度(即速度优化);指出下列哪些方法是面积优化 B ①流水线设计②资源共享③逻辑优化④串行化⑤寄存器配平⑥关键路径法

EDA考试试卷

1.给出下述Verilog语句的仿真输出结果(本题5分,每个1分)。 (1)$displayb ( 4'b1010 < 4'b0110 );输出为: 0 (2)$displayb ( 4'b1x10 = = 4'b1x10 ); 输出为: x (3)$displayb ( ^4'b1110 ); 输出为: 1 (4)$displayb ( {3{2’b10}} ) ; 输出为: 101010 (5)//假设reg [3:0] a; a=4'b1010; $displayb ( {{4{a[3]}},a} ); 输出为: 11111010 2.假设design为Lab1.v,顶层模块名为Lab1;TestBench为Lab1_TB.v, 顶层模块名为Lab1_TB, 按下述步骤要求,采用modelsim命令行方式时的完整 仿真命令序列为:(本题10分,每个2分) 创建物理库mywork: vlib mywork 映射逻辑库work至物理库mywork: vmap work mywork 编译design至work库: vlog Lab1.v 编译testbench至work库: vlog Lab1_TB.v 启动仿真工具仿真: vsim Lab1_TB 二.简答题(共45分) 1.简述下述Verilog语句的含义(所有信号均为1bit位宽;有时序信息时 请同时说明时序含义,若需要用式子表达,可用X(t)表达“t时刻时X的值”; 可均从0时刻描述)(本题10分,每个2分) (1) assign #10 out = in1 & in2 ; 先延迟10个时间单位,再计算in1&in2的值,并赋给out。 (2) assign out = # 5 in1 | in2 ; 先计算in1&in2的值,延迟5个时间单位后,赋给out。 (3) or #(1,2,3) or_inst(o,in1,in2); 当输出为上升沿时延迟一个时间单位,输出为下降沿时延迟两个时间单位,输出为高阻态时延迟三个时间单位。

阻塞赋值和非阻塞赋值的区别

verilog中阻塞赋值和非阻塞赋值的区别 参考文献:https://www.wendangku.net/doc/f113158466.html,/BLOG_ARTICLE_1993789.HTM 1、阻塞赋值操作符用等号(即= )表示。“阻塞”是指在进程语句(initial和always) 中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。例如: 当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到 “x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。 赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。

2、非阻塞赋值操作符用小于等于号(即<= )表示。“非阻塞”是指在进程语句(initial 和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步 骤进行的: ①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。 ②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。 例如: 当执行“x<=next_x;”时,并不会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x 的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。 基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果,next_x à x à y。 简单理解就是,阻塞赋值是按需执行,非阻塞赋值是并行执行。

EDA实验中问题及注意事项

EDA实验中问题及注意事项 一、实验四总结 1.做得比较好的同学(7个) 32060501沙安澜:报告很详细,严格按照要求写的。给出了所有源程序和仿真波形。 32060507王冠:在文档中画出的原理框图很清晰。报告很详细,严格按照要求写的。给出了所有仿真波形,有详细的设计思路和工作过程分析。 32060614任铁男:完全用Verilog HDL语言在一个程序中实现。并利用Modelsim仿真。 32060618楼奕华:在文档中画出的原理框图很清晰。报告很详细,给出了主要程序的源代码,程序中有详细的注释。回答问题正确。 32060624王克:报告很规范、很用心。给出了所有源程序和仿真波形,并利用Modelsim仿真。 32060718马啸宇、32060730肖晖:预习充分,实验完成得很好。 2.要求重写的同学(13) 实验报告严格按照要求重写(注意给出每个子模块的源代码)。并按学号(不要姓名)建一个文件夹,将所有设计文件(包括源文件和仿真波形、顶层文件等)拷入其中,压缩后一起发给我。 实验报告要求: 1.实验目的 2.实验要求 3.实验内容 4.设计思路 给出原理框图及每部分的说明,说明完成了哪些功能,对于本实验中的关键设计进行详细的说明。并给出每个子模块的源代码。 5.仿真波形及分析 给出主要模块和顶层文件的仿真波形的截图(注意仿真各种情况)。然后对照波形,详细分析其工作过程。 6.对遇到的问题及解决方法进行详细的说明 7.回答“五、实验报告”中提出的问题 (1)袁丁、孙晓良与吕元报告相同!(时钟分频波形是否正确?) (2)32060515史磊:只写了遇到问题和实验五思考题,按要求重写! (3)32060522_陈辉: “此部分由e_clock模块实现。此模块中还集成了复位信号(CLK)和启动/暂停信号(STARTSTOP)的功能。复位信号的高电平有效,可对整个系统异步清零。启动/暂停信号为低电平时秒表开始计时,为高电平时暂停,变低后在原来的数值基础上再计数。” 同郑清吉、袁丁、孙晓良、吕元 (4)32060523_钱恒恒:有些地方与袁丁同? (5)32060603_杨颖报告完全同陈辉! (6)32060620_周彬,几乎没有实质内容,无任何波形,按要求重写! (7)32060626-吴拯宇:几乎完全同袁丁的。 (8)32060931_周亮:与32060919_林煜晨完全相同! (9)32060932 柴永锋:与32060919_林煜晨几乎完全相同!

EDA-Verilog HDL期末复习题总结必过

选择题 1.大规模可编程器件主要有FPGA、CPLD 两类,下列对FPGA 结构与工作原理的描述中,正确的是(C)。 A.FPGA 全称为复杂可编程逻辑器件; B.FPGA 是基于乘积项结构的可编程逻辑器件; C.基于SRAM 的FPGA 器件,在每次上电后必须进行一次配置; D.在Altera 公司生产的器件中,MAX7000 系列属FPGA 结构。 2.不完整的IF语句,其综合结果可实现(A) A. 时序逻辑电路 B.组合逻辑电 C. 双向电路 D. 三态控制电路 3.综合是EDA设计流程的关键步骤,在下面对综合的描述中,(D)是错误的。 A.综合就是把抽象设计层次中的一种表示转化成另一种表示的过程; B.综合就是将电路的高级语言转化成低级的,可与FPGA / CPLD的基本结构相映射的网表文件; C.为实现系统的速度、面积、性能的要求,需要对综合加以约束,称为综合约束; D.综合可理解为一种映射过程,并且这种映射关系是唯一的,即综合结果是唯一的。 4.大规模可编程器件主要有FPGA、CPLD两类,下列对FPGA结构与工作原理的描述中, 正确的是( C )。 A. FPGA全称为复杂可编程逻辑器件; B. FPGA是基于乘积项结构的可编程逻辑器件; C. 基于SRAM的FPGA器件,在每次上电后必须进行一次配置; D. 在Altera公司生产的器件中,MAX7000系列属FPGA结构。 5.以下关于状态机的描述中正确的是(B) A.Moore型状态机其输出是当前状态和所有输入的函数 B.与Moore型状态机相比,Mealy型的输出变化要领先一个时钟周期 C.Mealy型状态机其输出是当前状态的函数 D.以上都不对

Verilog中的延时、阻塞与非阻塞赋值仿真

从仿真语义的角度看Verilog中的延时、阻塞与非阻塞赋值

1 Verilog中的延时 Verilog没有和VHDL中类似的最小延时概念,所有的延时都由符号“#”来定义,如果没有这个符号就意味着没有延时,清单1中描述了一个有关延时的简单例子。 清单1 简单的延时 wire #5 Y = A & B; 清单1 中使用持续赋值语句描述了一个两输入端与门逻辑,并且在表达式前插入了5ns (#5)的延时,意义为Verilog仿真器会在5ns的延时后将A和B相与赋值给Y。通过这个例子可以看出,延时的插入只需要在原本的语句中加入“#”关键字即可,但在实际的使用中却经常产生错误,实际中的延时时间是由具体的硬件电路来决定的。使我们更深入的理解Verilog中的延时,更加关注描述的电路意义而不是描述语句本身,Verilog也是一种机于硬件的语言。 1.1 实际中的延时 在实际的电路中,只存在着两种延时行为,一个是惯性延时,另一个是传输延时。 1.1.1 惯性延时(Inertial Day) 惯性延时通常在信号通过逻辑门的时候发生,图1所示是信号通过一个具有5ns延迟的非门时的行为。 图1 惯性延时 输入信号WireIn有两个高电平脉冲,一个宽度为3ns,另一个宽度为9ns。当第一个3ns 的脉冲到达非门时,因为其宽度小于非门的本身延时(5ns),输出还来不及建立低电平,输入脉冲就已经过去,所以在输出信号WireOut上没有体现出第一个3ns脉冲的响应。第二个脉冲宽度为9ns,大于非门的本身延时,所以在脉冲上升沿5ns之后,WireOut输出了一个宽度为9ns的低脉冲,这个脉冲与输入脉冲等宽、反向而且延迟了5ns。 这种延时称为惯性延时或惰性延时。如果输入的变化过快,小于逻辑门本身的延时,就不会被体现在输出上。 1.1.2 传输延时(Transport Delay) 传输延时相对于惯性延时更容易理解,相当于信号通过了一条拥有固定延时的传输线。如图2所示是信号通过一条5ns的延时线地示意图与波形。

VHDL非阻塞赋值理解(转载)

在always语句块中,verilog语言支持两种类型的赋值:阻塞赋值和非阻塞赋值。阻塞赋值使用“=”语句;非阻塞赋值使用“<=”语句。注意,千万不要将这两种赋值方法与assign赋值语句混淆起来,assign赋值语句根本不允许出现在always语句块中。 位于begin/end块内的多条阻塞赋值语句是串行执行的,这一点同标准的程序设计语言是相同的。但是多条非阻塞赋值语句却是并行执行的,这些非阻塞赋值语句都会在其中任何一条语句执行完成之前开始执行。这正是硬件电路的特点,因为实际的逻辑门电路都是独立运转的,而不是等到其他门电路运转结束之后自己才开始运转。 下面我们以描述移位寄存器的两种方法为例来讲述两种赋值类型的区别。在下面的这种描述中,第一个触发器中的数据被移到第二个触发器中,第二个触发器中的数据被移到第三个触发器中……如此继续下去,直到最后一个触发器中的数据被移出该寄存器为止。 1module shiftreg (input clk, 2input sin, 3 outout reg [3:0]q);//这是正确使用非阻塞赋值的实例 4always @(posedge clk) 5begin 6 q[0] <= sin;//非阻塞赋值:<= 7 q[1] <= q[0]; 8 q[2] <= q[1] 9 q[3] <= q[2]; 10//这里写作q <= {q[2:0],sin};更简单更好一些 11end 12endmodule 非阻塞赋值语句的功能是使得所有语句右侧变量的值都同时被赋给左侧的变量。因此,在上面的实例中,q[1]得到的是q[0]的原始值,而非sin的值(在第一条语句中,sin的值被赋给了q[0])。这正是我们期望得到的实际硬件电路。当然,我们可以把上边的四条语句合并写成一条简短的语句:q<= {q[2:0],sin}。 阻塞赋值语句的功能更接近于传统的程序设计语言,但是阻塞赋值语句并不是准确的硬件工作模型。下面考虑使用阻塞赋值语句来实现同一模块可以得到什么结果。在始终clk的上升沿,verilog将会把sin的值赋给q[0],然后q[0]的新值被赋给q[1],如此继续执行下去。最终所有的四个寄存器都会得到相同的值:sin的值。 本部分内容用意在于:讲述使用always语句块对时序逻辑电路进行建模的时候,如何使用非阻塞赋值。如果设计者能够充分的灵活应用,比如倒转上例中四条语句的顺序,那么使用阻塞赋值语句仍然能实现相应的功能,但是与使用非阻塞赋值的方法相比,这种方法并不会带来任何好处,相反还暗藏了巨大的风险。 最后需要注意的是:每个always语句块都隐含表示一个独立的逻辑电路模块。因此,对于特定的

设计时序逻辑时采用阻塞赋值与非阻塞赋值

时序逻辑设计 ‐‐‐‐‐‐‐‐‐阻塞赋值与非阻塞赋值区别 阻塞式 `timescale 1ps/1ps module blocking(b,c,a,clk); output [3:0] b,c; input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) begin b = a; c = b; $display("Blocking: a = %d, b = %d, c = %d.",a,b,c); end endmodule 非阻塞式 `timescale 1ps/1ps module non_blocking(clk,a,b,c); output [3:0] b,c; input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk)

begin b <= a; c <= b; $display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); end endmodule Testbench `timescale 1ps/1ps module test_tp(); wire [3:0] b1,c1,b2,c2; reg [3:0] a; reg clk; initial begin clk = 0; forever #50 clk = ~clk; end initial begin a = 4'h3; $display("____________________________"); # 100 a = 4'h7; $display("____________________________"); # 100 a = 4'hf; $display("____________________________"); # 100 a = 4'ha; $display("____________________________"); # 100 a = 4'h2; $display("____________________________"); # 100 $display("____________________________"); $stop; end non_blocking non_blocking1(.clk(clk),.a(a),.b(b2),.c(c2)); blocking blocking1(.clk(clk),.a(a),.b(b1),.c(c1)); endmodule

阻塞与非阻塞

第二章Verilog HDL语言与 VIVADO

赋值语句 ?1 连续赋值语句assign ?assign语句 ?用于对wire型变量赋值,是描述组合逻辑最常用的方法之一。 ?例如assign c=a&b; ?//a、b可以是wire型变量或寄存器变量,c必须是wire型变量或其他线网型变量。 ?2 过程赋值语局“=”和“<=” ?用于对reg型变量赋值 ?在过程块中使用过程赋值语句。

结构说明语句always ?always块包含一个或一个以上的语句(如:过程赋值语句、条件语句和循环语句等),在运行的全过程中,在时钟控制下被反复执行。 ?时钟有效边沿来了就执行。 ?在always块中被赋值的只能是寄存器reg型变量。 ?always块的写法是:always @ (敏感信号表达式) ?例如: ?always @ (clk)//只要clk发生变化就触发 ?always @ (posedge clk)//clk上升沿触发 ?always @ (negedge clk)//clk下降沿触发 ?always @ (negedge clk1 or posedge clk2)// clk1下降沿触发,clk2上升沿也触发 ?always @ (*)该语句所在模块的任何输入信号变化了都触发。

initial 语句用于对寄存器变量赋予初值 结构说明语句initial

阻塞与非阻塞 ?阻塞的概念: ?在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。 ?非阻塞的概念: ?多条非阻塞赋值在过程块内同时完成赋值操作,多条语句相当于同时执行! ?非阻塞(non-blocking)赋值方式: ?赋值符号为<=,如b <= a ; ?阻塞(blocking)赋值方式: ?赋值符号为=,如b = a ; ?非阻塞和阻塞是截然不同的!

阻塞赋值与非阻塞赋值

阻塞赋值与非阻塞赋值 作者:zhsj 日期:2015-7-27 在Verilog语法中,阻塞赋值和非阻塞赋值是非常难理解的一个概念,尤其是对于初学者,往往搞不懂何时使用非阻塞赋值及何时使用阻塞赋值才能设计出符合要求的电路。本文是笔者学习此概念时的学习笔记,主要分为概念解析和实例分析,并对一些编程要点进行总结分析,希望对各位初学者有所帮助。 在正式讲解之前先定义两个英文缩写字: RHS——赋值符合右边的表达式或变量; LHS——赋值符号左边的表达式或变量。 一、概念解析 1.1 阻塞赋值 阻塞赋值操作符为等号(即“=”),当采用阻塞赋值方式赋值时,需要先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,它才允许别的赋值语句的执行。一般可综合的阻塞赋值操作在RHS不能设定有延迟,即使是零延迟也不允许。若在RHS上加上延迟,则在延迟期间会阻止赋值语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块中不可使用这种风格的代码。 阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,此时不允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是前一句赋值语句结束后在开始赋值的,请注意,这只是概念上的先后,而无实质上的延迟。 在使用阻塞赋值时,如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又使用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的顺序安排不好,就会出现竞争。若这两个赋值操作用同一个时钟沿触发,则执行的顺序是无法确定的,在后面的例子中会看到这一问题。 1.2 非阻塞赋值 非阻塞赋值操作符为小于等于号(即“<=”),当采用非阻塞赋值时,在赋值操作开始的时刻计算非阻塞赋值符RHS表达式,赋值操作结束的时刻才更新LHS。在计算非阻塞赋值的RHS表

Nonblocking Assignments in Verilog非阻塞赋值

SNUG-2000 San Jose, CA Voted Best Paper 1st Place
World Class Verilog & SystemVerilog Training
Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!
Clifford E. Cummings
Sunburst Design, Inc. cliffc@https://www.wendangku.net/doc/f113158466.html, https://www.wendangku.net/doc/f113158466.html,
ABSTRACT One of the most misunderstood constructs in the Verilog language is the nonblocking assignment. Even very experienced Verilog designers do not fully understand how nonblocking assignments are scheduled in an IEEE compliant Verilog simulator and do not understand when and why nonblocking assignments should be used. This paper details how Verilog blocking and nonblocking assignments are scheduled, gives important coding guidelines to infer correct synthesizable logic and details coding styles to avoid Verilog simulation race conditions.

verilog中阻塞赋值和非阻塞复制的理解

verilog中阻塞赋值和非阻塞复制的理解 阻塞和非阻塞语句作为verilog HDL 语言的最大难点之一,一直困扰着FPGA 设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯下 一些不必要的错误。阻塞和非阻塞可以说是血脉相连,但是又有着本质的差别。理解不清或运用不当,都往往会导致设计工程达不到预期的效果,而其中的错 误又很隐晦。下面我给大家谈谈阻塞和非阻塞语句的本质区别和在FPGA 设计中的不同运用。阻塞语句顾名思义,即本条语句具有影响下一条语句的作用,在同一个进程always 中,一条阻塞赋值语句的执行是立刻影响着下条语句的执行情况和结果。如果该条语句没有执行完,那么下条语句不可能进入执行状态的,因此,从字面层上理解,该条语句阻塞了下面语句的执行。阻塞语句最能 体现verilog HDL 和C 语言之间的血缘关系,比如,在时钟沿触发的always 进程里,若先执行b=c,再执行a=b,那么本质上,在一个时钟沿触发里面,a=c 成立,即是说,不要b 变量,直接在进程里赋值a=c,结果是一样的。这和c 语言中b=c,a=b 性质相同。非阻塞语句非阻塞语句应该来说,更能体现硬件电路的特点。这正是非阻塞语句广泛应用于时序逻辑电路的原因。接上面的例子,如果在一个时钟沿触发的always 进程里面,b=c,a=b 那么就不可能直接在进程里面赋值a=c.因为c 的值要经过两个时钟延迟才传到a 里面,即c 若从0 变为1,那么要经过两个clk 上升沿才传到a,a 的值才从0 变为1。两次赋值正是体现了两个时钟延迟的特点。这种特点即是非阻塞语句非阻塞的的原因导 致的,就是说,a=b,不会因为b=c 没有执行完毕而不执行,只要时钟触发进程,那么a=b,b=c 同时执行。所以,如果c 为1,b 为0,a 为1 的话,那么在在非阻塞语句的进程里面,一个时钟沿到来,由于他们之间是同时执行的,所以把 c 的1 赋给了b,把b 的0 赋给了a,但是在阻塞语句里面,c 的1 先给了b,

相关文档
相关文档 最新文档