iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Software Development

超簡單的 Verilog 入門講解系列 第 10

[Day 10] Verilog E-1 難度丁 P1王點的消血2 - always@(事件1 or ....) 2. 阻隔指定(=)與非阻隔指定(<=)

  • 分享至 

  • xImage
  •  

阻隔指定
就是指 具有順序性的信號改變立即更新

輸出信號 = 輸入信號邏輯組合


非阻隔指定
就是指 具有同時性的關係

輸出信號 <= 輸入信號邏輯組合

舉個例子



module Test2_always1(reset,A,B,Out1,Out2);

input A , B ,reset ;
output Out1 , Out2;
reg Out1 , Out2;
reg In1 , In2 ;
 
always@( A )
begin
    if (reset)
    begin
        In1 = 0;
        In2 = 0;
        Out1 = 0;
        Out2 = 0;
    end
    else
    begin
        In1 = ~ B;
        Out1 = In1;
        
        In2 <= ~ B;
        Out2 <= In2;
     end
   
end

endmodule

程式中的 Reset 為什麼這樣寫 我們之後再講

我們主要看這裡


    begin
        In1 = ~ B;
        Out1 = In1;
        
        In2 <= ~ B;
        Out2 <= In2;
     end

In1 會等於 ~B 然後 Out1 在等於 In1 ,中間是用 "=" 所以有順序性
In1 數值就是 ~B
Out1 數值就是 ~B

In2 會等於 ~B 同一時間 Out1 等於 In1 ,中間是用 "<="
In1 數值就是 ~B
Out1 數值就是 In1還沒變成 ~B 前的數字
他們兩個同時發生

來測試一下 tb


module tb1();

reg A_in , B_in ,reset;
wire out_o1  ;
wire out_o2;

Test2_always1 test(
.reset(reset),
.A(A_in),
.B(B_in),
.Out1(out_o1),
.Out2(out_o2)
);

initial 

begin

reset = 1 ;
A_in = 0 ;
B_in = 0 ;

# 70;
reset = 0 ;

A_in = 0 ;
B_in = 0 ;
# 100;


A_in = 1;
B_in = 0 ;
# 100;

A_in = 0 ;
B_in = 1 ;
# 100;

A_in = 1 ;
B_in = 1 ;
# 100;


end



endmodule




看一下結果
https://ithelp.ithome.com.tw/upload/images/20220923/20135862GUmhLuSfAl.png

Out1 是 B 的相反
https://ithelp.ithome.com.tw/upload/images/20220923/20135862X3OAxbgHfq.png

而 Out2 是 B前一個的相反
https://ithelp.ithome.com.tw/upload/images/20220923/20135862YVPcfTsTtF.png


上一篇
[Day 09] Verilog E-1 難度丁 P1王點的消血1 - always@(事件1 or ....) 1. 簡單的說明
下一篇
[Day 11] Verilog E-1 難度丁 P1王點的消血2.5 - always@(事件1 or ....) 3. RESET (非阻隔指定)
系列文
超簡單的 Verilog 入門講解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言