原文鏈接:學verilog 一個月了,在開發板上面寫了很多代碼,但是始終對一些問題理解的不夠透徹,這里我們來寫幾個例子仿真出阻塞和非阻塞的區別,我們先上代碼module LED ?(??? CLK, RSTn,??? scan,??? flag ,??? c,??? ,one,two,three,four);???? input CLK;???? input RSTn;???? input scan;???? output flag,c;???? output [3:0] one,two,three,four;/***********************************************************/??????? reg F1,F2;??? reg a,b;??? reg [3:0] one,two,three,four;?/********************信號傳遞之間的非阻塞賦值***************************************/??? always @ ( posedge CLK or negedge RSTn ) ??//????? if( !RSTn )???????? begin?????????? F1 <= 1'b1;?????????? F2 <= 1'b1;????? end????? else??begin???F1 <= scan;???F2 <= F1;????? end?/*******************信號傳遞之間的阻塞賦值****************************************/??? always @ ( posedge CLK or negedge RSTn ) ??//????? if( !RSTn )???????? begin?????????? a = 1'b1;?????????? b = 1'b1;????? end????? else??begin???a = scan;???b = a;????? end?/******************數據加? 非阻塞賦值? 先判斷后計數*****************************************/??????always @ ( posedge CLK or negedge RSTn )?? //one <=??if( !RSTn )???begin????one<=0;???end??else??begin???if(one==14)???????one<=0;???else ?????????one<=one+1;??end/***************數據加? 非阻塞賦值? 先計數后判斷********************************************/ ???always @ ( posedge CLK or negedge RSTn )??? //? two<=??if( !RSTn )???begin????two<=0;???end??else??begin???two<=two+1;???if(two==14)????two<=0;??end?/**************數據加? 阻塞賦值? 先判斷后計數*********************************************/?always @ ( posedge CLK or negedge RSTn ) ?//three =??if( !RSTn )???begin????three=0;???end??else??begin???if(three==14)????three=0;???else????three=three+1;??end/*************數據加? 阻塞賦值? 先計數后判斷**********************************************/?always @ ( posedge CLK or negedge RSTn ) ?//four =??if( !RSTn )???begin????four=0;???end??else??begin???four=four+1;???if(four==14)????four=0;??end????????????/****************信號之間傳遞***********************/?assign flag = F2 & !F1;assign c ?= b? & !a;/***************************************/?endmodule ?????2、我使用modesim 仿真,下面為我的? test bench?`timescale 1 ps/ 1 psmodule LED_vlg_tst();// constants??????????????????????????????????????????// general purpose registersreg eachvec;// test vector input registersreg CLK;reg RSTn;reg scan;// wires??????????????????????????????????????????????wire c;wire flag;wire [3:0]? four;wire [3:0]? one;wire [3:0]? three;wire [3:0]? two;// assign statements (if any)?????????????????????????LED i1 (// port map - connection between master ports and signals/registers???.CLK(CLK),?.RSTn(RSTn),?.c(c),?.flag(flag),?.four(four),?.one(one),?.scan(scan),?.three(three),?.two(two));/*initial???????????????????????????????????????????????begin?????????????????????????????????????????????????// code that executes only once???????????????????????// insert code here --> begin???????????????????????????????????????????????????????????????????????????????// --> end????????????????????????????????????????????$display("Running testbench");??????????????????????end???????????????????????????????????????????????????always????????????????????????????????????????????????// optional sensitivity list??????????????????????????// @(event1 or event2 or .... eventn)?????????????????begin?????????????????????????????????????????????????// code executes for every event on sensitivity list??// insert code here --> begin???????????????????????????????????????????????????????????????????????????????@eachvec;?????????????????????????????????????????????// --> end????????????????????????????????????????????end???????????????????????????????????????????????????endmodule*/initial beginCLK = 0;forever#10 CLK = ~CLK;?endinitial beginscan = 0;forever#100 scan = ~scan;?endinitial beginRSTn = 0;#1000 RSTn =? 1;#1000;#1000;#1000;#1000;#1000;#1000;#1000;#1000;$stop;endendmodule?主要就是初始化一個CLK 和scan的信號,然后就是初始化一下復位,最后就是設置仿真時間,這樣modesim 就不會一直處于仿真狀態,消耗資源,也可以方便仿真。?其中quartus? 與modesim? 互相調用調試,可以關注我的博客,這里我就不具體講解了!?3、modesim 波形圖??大家注意到紅線框內的數據變化,就能很清楚的理解 阻塞與非阻塞了!??微觀分析 阻塞與非阻塞1、上代碼,具體觀察,a,b,c與F1,F2,flage 的變化?module LED??(??? CLK, RSTn,??? scan,??? flag ,??? a,b,c,F1,F2,);???? input CLK;???? input RSTn;???? input scan;???? output flag,a,b,c;???? output F1,F2;/***********************************************************/??????? reg F1,F2;??? reg a,b;?/***********************************************************/??? always @ ( posedge CLK or negedge RSTn ) ??//????? if( !RSTn )???????? begin?????????? F1 <= 1'b1;?????????? F2 <= 1'b1;????? end????? else??begin???F1 <= scan;???F2 <= F1;????? end?/***********************************************************/??? always @ ( posedge CLK or negedge RSTn ) ??//????? if( !RSTn )???????? begin?????????? a = 1'b1;?????????? b = 1'b1;????? end????? else??begin???a = scan;???b = a;????? end?/***********************************************************/??????assign flag = F2 & !F1;assign c ?= b? & !a;/***************************************/?endmodule ????代碼涵義就不講解了?2、test bench 代碼,與上面相同,這里不重復了?3、上圖?? 看波形
深入分析verilog阻塞和非阻塞賦值
- Verilog(109207)
- 阻塞(8028)
- 非阻塞(2154)
相關推薦
FPGA基礎篇(一):阻塞與非阻塞賦值,不只是比原始信號差一個時鐘周期的問題?。?b class="flag-6" style="color: red">深入剖析)
阻塞與非阻塞賦值 首先從名字上理解,阻塞賦值即賦值沒完成,后邊的語句將無法執行,非阻塞剛好與其相反,即賦值完不完成并不阻礙后續程序的執行,所以我們常說非阻塞賦值的對象并未立馬得到新值,如果從時序來看
2017-09-19 18:32:43
11967

Verilog語言中阻塞和非阻塞賦值的不同
來源:《Verilog數字系統設計(夏宇聞)》 阻塞和非阻塞賦值的語言結構是Verilog 語言中最難理解概念之一。甚至有些很有經驗的Verilog 設計工程師也不能完全正確地理解:何時使用非阻塞
2021-08-17 16:18:17
6000

Verilog HDL語言編程的誤區與經驗
Verilog的兩個誤區:使用Reg類 型還是Net類型:Reg類 型只在過程塊中被賦值;而Net類型則在過 程塊外面被賦值或者驅動.阻塞賦值和非阻塞賦值:Verilog中競爭發生的條件:兩個或多個
2019-03-26 08:00:00
Verilog阻塞和非阻塞原理分析
Verilog阻塞和非阻塞原理分析在Verilog語言最難弄明白的結構中“非阻塞賦值”要算一個。甚至是一些很有經驗的工程師也不完全明白“非阻塞賦值”在仿真器(符合IEEE標準的)里是怎樣被設定執行
2009-11-23 12:02:57
Verilog中阻塞賦值和非阻塞賦值的正確使用
[table][tr][td] Verilog中有兩種為變量賦值的方法。一種叫做連續賦值,另一種叫做過程賦值。過程賦值又分為阻塞賦值和非阻塞賦值。阻塞性賦值使用“=”為變量賦值,在賦值結束前不可以進行其他操作,在賦值結束之后繼續后面的操作。這個過程就好像阻斷了程序的運行。非阻塞賦值使用“
2018-07-03 03:06:04
Verilog流水線加法器always塊中應該采用阻塞賦值(=),還是非阻塞賦值(<=)?
圖一圖二圖三圖四最近寫了一個16位二級流水線加法器,并進行了一下仿真。發現在always塊中采用阻塞賦值(=)和非阻塞賦值(
2016-09-09 09:18:13
Verilog過程賦值語句提問
時,dreg還是變成了areg這樣不就是延時3個時鐘周期了嗎?為什么不是這樣呢?另外,阻塞型賦值語句,規定是,順序執行語句,每種狀態一個接一個執行,非阻塞型賦值語句,規定是,并行賦值語句,當執行語句時同事計算
2017-09-20 15:10:01
verilog 非阻塞賦值的綜合
剛學verilog,試了一下非阻塞賦值,代碼如下, 很簡單module test(clk,in,out);input clk;input in;output reg out;always @(posedge clk)out
2012-10-30 09:20:14
verilog中的阻塞和非阻塞
這個是非阻塞賦值,b的值為0,仿真結果也是0module TOP(input clk,input rst,output reg b );reg a,c;always@(posedge clk or negedge rst)beginif(~rst)begina
2015-09-13 15:55:05
評論