*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ó.
![]()
- 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 đếnthứ 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
4,Một số ví dụ khác
