Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

So sánh Blocking và Non-Blocking assignments

E-mail Print PDF

Trong verilog, có 2 loại phép gán, đó là Blocking và Non-Blocking. Sau đây, bài viết sẽ tập trung so sánh về 2 phép gán này.

 

 

1. Định nghĩa:

1.1 Blocking assignment: Trong trường hợp có nhiều phép gán được thực hiện trong cùng 1 điều kiện, đây là phép gán mà các giá trị liên quan bên LHS sẽ được cập nhật trước khi phép gán tiếp theo được thực hiện. Nói cách khác, phép gán kế tiếp sẽ được thực hiện sau khi các giá trị, biến trong phép gán hiện tại được cập nhật.

1.2 Non-Blocking assignment: Trong trường hợp có nhiều phép gán được thực hiện trong cùng 1 điều kiện, các phép gán này được thực hiện đồng thời và không phụ thuộc vào các phép gán trước nó. Các giá trị bên LHS được sử dụng là các giá trị trước khi các phép gán xảy ra.

 

2. Cách dùng:

Thông thường, các bạn sẽ có các loại logic cell như sau:

- Loại 1 - Combinational logic cells ( Mạch tổ hợp ): AND, OR, NOT, XOR....

- Loại 2 - Latch: Loại này là phần tử tuần tự, tích cực theo cổng enable để đóng mở dữ liệu. Có thể xem về nó tại đây.

- Loại 3 - FlipFlop: Loại này là phần tử tuần tự, tích cực bằng cạnh clock. Có thể xem nó tại đây.

 

Quy tắc khi coding các loại trên như sau:

- Mạch Tổ Hợp:

     + Dùng assign kết hợp với Blocking assignment ( = ). Khi đó, LHS được khai báo dạng wire như biến c bên dưới.

wire a;
wire b;
wire c;

assign c = a & b;

     + Dùng always block, các nhánh điều kiện đầy đủ, với Blocking assignment(=). Khi đó, LHS được khai báo dạng reg như bên dưới.

wire a;
wire b;
reg c;

always @ ( a or b ) begin
    c = a & b;
end

- Latch:

     + Dùng always block, các nhánh điều kiện không đầy đủ, với Blocking assignment(=). Khi đó, c được khai báo dạng reg do đang nằm trong vòng always . Do câu lệnh rẽ nhánh chỉ có if mà không có else, do đó, khi trường hợp nhánh if không được thỏa mãn, thì c sẽ phải giữ giá trị cũ. Do đó, lúc này c sẽ tương đương với một cell Latch.

wire a;
wire b;
reg [1:0] c;

always @ ( a or b ) begin
    if ( a == 1'b1 ) begin 
         c = a + b;
    end
end

- FlipFlop:

     + Dùng always block, các nhánh điều kiện đầy đủ, với Non-Blocking assignment( <=)

reg   [7:0] data;   
wire [7:0] new_data; 

always @ ( posedge clock or negedge reset_n ) begin

    if ( ! reset_n ) begin 

        data <= 8'h00;

    end

    else begin

        data <= new_data;

    end

end

Các cách coding này được giới thiệu kỹ trong post khác. Các bạn có thể theo dõi thêm tại đây.

Nguồn: degic.freeforums

 

    Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

    Mong Muốn Có Thêm Cơ Hội Trong Công Việc

     Và Trở Thành Một Người Có Giá Trị Hơn

    Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng

    Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON  

      

    Hotline: 0972.800.931 - 0938.838.404 (Mr Long)

 

 

 

Last Updated ( Tuesday, 18 June 2019 18:37 )  

Related Articles

Chat Zalo