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

Verilog căn bản: Bài 7: Các loại phép gán trong verilog

E-mail Print PDF
[​IMG]

*Trong Verilog có hai loại phép gán cơ bản đó là: phép gán liên tục và phép gán thủ tục.Hôm nay mình sẽ giới thiệu phép gán liên tục trước bài sau mình sẽ nói về phép gán thủ tục.

 1,Phép gán liên tục

-Phép gán liên tục là phép gán cơ bản nhất trong Verilog.Phép gán liên tục dùng trong cách mạch tổ hợp logic. Phép gán liên tục được dùng để gán các giá trị cho wire của module, hay là cập nhật giá trị của các port(wire). Nó được đặt bên ngoài khối always@ hoặc initial. Lưu ý rằng câu lệnh phép gán liên tục xảy ra đồng thời và liên tục được thực hiện trong suốt quá trình mô phỏng.Thứ tự các lệnh gán không quan trọng.Bất kì thay đổi nào của bên phải phép gán sẽ làm cho giá trị bên trái thay đổi ngay lập tức.

**Cú pháp
net_data_type [ delay ] [ size ]= expression(biểu thức); // khai báo kiểu dữ liệu cho biến.

assign [ #( delay ) ] net_name = expression; // explicit

-- Giải thích cú pháp:
- Net_data_type : kiểu dữ liệu của đầu vào hoặc đầu ra như: wire, reg
- Delay: khoảng thời gian trễ trong các phép gán.
- Size: độ rộng bit của các biến trong phép gán.
- Expression: biểu thức hoặc một biến nào đó.

-- Phép gán liên tục sẽ ngầm khai báo kiểu dữ liệu net cho từng câu lệnh. Một phép gán liên tục đầy đủ thường sử dụng một trong 2 cách: một là khai báo kiểu net, hai là câu lệnh gán liên tục assign.
-- Phép gán assign: phía bên trái của phép gán là một biến còn phía bên phải là một biểu thức. Kiểu dữ liệu bên trái bắt buộc phải là net và bên phải có thể là kiểu net, reg... Phía bên trái tách biệt với phía bên phải bằng kí tự “=”. Gía trị của phía bên trái thay đổi khi giá trị biểu thức bên phải thay đổi.

Example:
Mã:
wire Out; assign Out = A & B; assign {COut, Sum} = A + B + CIn; wire #50 Out = A & B; 
 , Giới thiệu.
**Phép gán thủ tục
- Trong Verilog có 2 phép gán cơ bản là: phép gán liên tục và phép gán thủ tục.
Phần trước mình đã giới thiệu phép gán lien tục. 
Và bài này mình  sẽ tiếp tục giới thiệu phép gán còn lại trong Verilog đó là phép gán  thủ tục.
Phép gán thủ tục được chia làm 2 phép gán là: Blocking và  Non-blocking.Chúng ta bắt đầu tìm hiểu nào.

2, Phép gán Blocking.
- Phép gán Blocking thực hiện các câu lệnh một cách tuần tự.
Điều này có  nghĩa là khi mà giá trị,biến bên trái của phép gán được gán bởi biểu một  biểu thức bên 
phải thì phép gán sau nó mới được thực hiện.
 Gía trị bên  trái của phép gán thay đổi khi giá trị bên phải thay đổi và giá trị câu  lệnh sau đó cũng 
thay đổi ngay lập tức. 
Hay nói cách khác giá trị câu  lệnh đứng sau phụ thuộc vào giá trị câu lệnh đứng trước nó.
[​IMG]
- Nếu có một độ trễ trong câu lệnh tiếp theo thì câu lệnh đó sẽ không được thực hiện khi chưa hết
thời gian trễ. 
Ví dụ #10 a=b; chương trình sẽ thực delay 10 đơn vị thời gian rồi mới thực hiện câu lệnh a=b.

- Toán tử để thực hiện phép gán blocking là “=”.
Giá trị của biểu thức bên phải phép gán sẽ được gán vào bên trái phép gán. 
Phép gán blocking thường dùng cho các mạch tổ hợp.

^_^Ví dụ:
always @(posedge clk)
begin
A = 1; // gán giá trị A = 1
B = A + 1; // B= 1 + 1, giá trị 1 lấy từ câu lệnh trên
end
 3, Phép gán Non-Blocking
- Khác với phép gán Blocking, Non-blocking thực hiện các câu lệnh một cách song song.
Như vậy, trong phép gán Non-blocking, câu lệnh sau không  còn phụ thuộc vào câu lệnh đứng trước nó nữa. 
Thay vào đó, giá trị câu  lệnh đứng sau sẽ được cập nhật bằng giá trị trước đó
(giá trị trước đó  được lưu trong một bộ nhớ đệm). 
Nói cách khác, tất cả các phép gán  Non-Blocking sẽ được gán đồng thời ngay tại một thời điểm 
mà không cần  quan tâm đến  
thứ tự cũng như sự phụ thuộc vào các phép gán trước đó.
 - Toán tử của phép gán Non-Blocking là “<=”. 
Phép gán Non-Blocking thường sử dụng trong các mạch tuần tự 

^_^Ví dụ
Mã:
module nonblocking (clk,a,c); input clk; input a; output c; wire clk; wire a; reg c; reg b; 
// gia tri dau tien  always@ (posedge clk ) begin    b <= a;  
//gan b bang a    c <= b;  
// gan c bang b o gia tri dau tien. end endmodule
Giải thích : ví dụ thời điểm ban đầu a = 10, b = 5. Sau một chu kì b = 10 và c = 5.

4,Một số ví dụ khác
5.png
[​IMG] 
 
Last Updated ( Saturday, 13 June 2015 22:03 )  

Related Articles

Chat Zalo