Bài giới thiệu về blocking and nonblocking assignment (Verilog)

Print

Verilog hỗ trợ coding với hai phép gán trong khố always, tùy theo mục đích sữ dụng khác nhau.non-blocking assignment, ký hiệu là “<=”, sẽ dụng để tạo mạch tuần tự (sequential logic – Flip Flop)blocking assignment, ký hiệu là “=”, sư dụng để tạo mạch tổ hợp (combination logic, AND, OR, ..)


Do đó, cần phải hiểu và sử dụng hai phép gán này đúng mục đích để tạo ra mạch mong muốn.

Xem xét các ví dụ sau:

Ví dụ 1 (Non-blocking assignment): Ví dụ coding đúng

always @ (posedge clk) begin

q1 <= in;

q2 <= q1;

out <= q2;

end

Tại thời điểm cạnh lên của clk, các hoạt động sau diễn ra đồng thời

giá trị in sẽ được đưa vào q1.

giá trị q1 sẽ được đưa vào q2

giá trị q2 sẽ được dưa vào out

–> Điều này đồng nghĩa với việc tại sự kiện cạnh lên của clk, giá trị CŨ của in, q1 và q2 sẽ được gán vào q1, q2 và out. Mạch hoạt động như một shift register với LSB là in và MSB là out

Mạch khi được tổng hợp sẽ có hình dạng sau:

 

 

Mạch mô tả đúng theo hoạt động tuần  tự của phần cứng.

Kết luận:

Sữ dụng nonblocking assignment “<=” cho mạch tuần tự với always

Ví dụ 2 (Blocking assignment): Ví dụ coding sai

always @ (posedge clk) begin

q1 = in;

q2 = q1;

out = q2;

end

Tại thời điểm cạnh lên của clock, các hoạt động sẽ diễn ra như sau:

in sẽ được đưa vào q1 (q1 = in), sau đó,

q1 sẽ được đưa vào q2 (q2 = q1 = in), và cuối cùng

q2 sẽ được đưa vào out (out = q2 = q1 = in)

–> Vậy kết quả cuối cùng sau sự kiện cạnh lên của clk là out = q2 = q1 = in

Mạch khi được tổng hợp sẽ có hình dạng sau:

 

 

Cách viết này là sai về mặt nguyên tắc do mạch không thể hiện đúng được việc chuyển trạng thái của in, q1, q2 và out.  Cách viết sau được sử dụng cho blocking assignment

Ví dụ 3: (blocking for combination logic): Ví dụ coding đúng

always @ (a or b or c) begin

x = a & b;

y = x | c;

end

Kết quả sau quá trình tổng hợp:

 

 

Do đó, để viết mạch tổ hợp, sử dụng blocking assignment trong khối always.

Ghi nhớ:

- non-blocking assignment, ký hiệu là “<=”, sẽ dụng để tạo mạch tuần tự (sequential logic – Flip Flop)

- blocking assignment, ký hiệu là “=”, sư dụng để tạo mạch tổ hợp (combination logic, AND, OR, ..)

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 ( Saturday, 20 July 2019 17:51 )