And/Or Gates
Mơ hình Mức Cổng
Các cổng này được sự thể hiện để xây dựng mạch logic trong verilog.xem ví dụ dứoi đây:
Wire OUT, IN1, IN2;
// sự khai báo cổng cơ bản and a1( OUT,IN1,IN2 ); nand na1( OUT,IN1,IN2 ) ; or or1( OUT, IN1,IN2 ); nor nor1( OUT, IN1,IN2 ); xnor nx1( OUT, IN1,IN2 );
Mơ hình Mức Cổng
Buf/Not Gates
Các cổng này thực thi lệnh và đảo theo thứ tự có sẵn,chúng có một ngõ vào và 2 hoặc nhiều ngõ ra
Mơ hình Mức Cổng
Ví dụ
Mạch ghép kênh 4 sang 1 với 2 tín hiệu điều khiển. chúng ta có thể liên kết 2 hay nhiều sources đến 1 ngõ ra. Chúng ta cũng có thể dùng để thực thi hàm bool
Mơ hình Mức Cổng
Già sử tín hiệu s1 và s0 khơng lấy giá trị x và z. Thì chúng ta được bảng sự thật trên. Sơ đồ logic cho mạch ghép kênh trên
Mơ hình Mức Cổng
Sự kích thích có thể kiểm tra mỗi kết hợp của việc chọn tín hiệu kết nối thích hợp từ đầu vào đến đầu ra. Tín hiệu OUTPUT được hiển thị
trong 1 đơn vị thời gian sau khi nó thay đổi. khi đó ta sử dụng task để dùng cho việc hiển thị này
and( y0,i0,s1n,s0n ); and( y1,i1,s1n,s0 ); and( y2,i2,s1,s0n ); and( y3,i3,s1,s0 );
// 4 input or sự khai báo cổng Or( out,,y0,y1,y2,y3 );
Mơ hình Mức Cổng
// định nghĩa kích thích- module( no ports ) Module stimulus;
// khai báo biến kết nối reg IN0,IN1,IN2,IN3; reg S1,S0;
// khai báo wire ra Wire OUTPUT;
// sự thể hiện mạch dồn kênh 4 to 1
Mux4_to_1 mymux( PUTPUT,IN0,IN1,IN3,S1,S0 ); Initial
Begin
// khoi tao đầu ra
IN0 = 1; IN1 = 0; IN2 = 1; IN3 = 0;
#1 $display( “IN0 = %B,IN1 = %B,IN2 = %b,IN3 = % \N,IN0,IN1,IN2,IN3 ); // chọn IN0
Mơ hình Mức Cổng
Sự hiển thị mô phỏng :
IN0 = 1,IN1 = 0,IN2 = 1,IN3 = 0S1 = 0, s0 = 0,OUTPUT = 1 S1 = 0, s0 = 0,OUTPUT = 1 S1 = 0, s0 = 1,OUTPUT = 0 S1 = 1, s0 = 0,OUTPUT = 1 S1 = 1, s0 = 1,OUTPUT = 0
Mơ hình Mức Cổng
Mạch cộng tồn phần 4 bit
Trong ví dụ này,chúng ta thiết kế mạch cộng toàn phần 4 bit, chúng ta dùng cổng logic cơ bản, và chúng ta ứng dung kích thích đối với mạch cộng tồn phần 4 bit để kiểm tra kết
quả. Khối xây dựng cơ bản là mạch cộng 1 bit. Biểu thức toán mạch cộng 1 bit:
Sum = ( a + b + cin)
Mơ hình Mức Cổng
Mơ hình Mức Cổng
Chúng ta chuyển thành code verilog: // đinh nghia mach cong 1 bit
Module add( sum,c_out,a,b,c_in ); Input a,b,c_in; Output a,b,c_in; Wire s1,c1,c2; xor( s1,a,b ); and( c2,c1,c_in ); or( c_out,c2,c1 ); endmodule
Mơ hình Mức Cổng
Khi đó mạch cộng 4 bit có thể được xây dựng từ 4 mạch cộng 1 bit:
Các tên port dùng trong 1 bit và trong 4 bit là giống nhau tuy nhiên
chúng dùng trong các module khác nhau nên không sao. output sum trong module 1 bit là đại lương vơ hướng cịn sum trong 4 bit là
Mơ hình Mức Cổng
// định nghĩa mạch cộng 4 bit
Module fulladd4( sum,c_out,a,b,c_in ); // khai báo I/O port
output [3:0] sum; output [3:0] c_out; input c_in;
// net
Wire c1,c2,c3;
// khai báo sự thể hiện các module thấp hơn Fulladd fa0( sum[0],c1,a[0],b[0],c_in );
Fulladd fa1( sum[1],c2,a[1],b[1],c1 ); Fulladd fa2( sum[2],c3,a[2],b[2],c2 ); Fulladd fa3( sum[3],c_out,a[3],b[3],c3 ); endmodule
Mơ hình Mức Cổng
Cuối cùng ta kiểm tra thiết kế trên bằng code sau: Module stimulus;
reg [3:0] A,B; reg C_IN; wire [3:0] SUM; wire C_OUT;
Fulladd4 FAL_4( SUM,C_OUT,A,B,C_IN ); initial
Begin
$monitor( $time,” A = %b ”,B = %b,C_IN = %b,---C_OUT = %b,SUM = %b \n, A,B,C_IN,C_PUT,SUM ); end // mô phỏng input Initial begin A = 4’d0;B = 4’d0; C_IN = 1’b0; #5 A = 4’d3; B = 4’d4; #5 A = 4’d2; B = 4’d5; #5 A = 4’d9;B = 4’d9; #5 A = 4’d10; B = 4’d15; #5 A = 4’d10 ; B = 4’d5; C_IN = 1’b1; End endmodule
Mơ hình Mức Cổng
Kết quả sẽ là :
0 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 00005 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 0111 5 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 0111 10 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 0111 15 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 0010 20 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 1001 25 A = 0000, B = 0000,C_IN = 0, --- C_OUT = 0,SUM = 0000
Mơ hình Mức Cổng
Gate Delays – sự trì hỗn cổng
Lúc này,chúng ta mơ tả mạch với khơng có sự trì hỗn. Trong mạch thực, cổng logic đều có sự trì hỗn, Gate Delay cho phép nguời dùng định rõ sự trì hỗn thơng qua mạch logic. Có 3 kiểu trì hỗn:
+Trì hỗn tăng
+Trì hỗn giảm
Mơ hình Mức Cổng
+Trì hỗn tăng
trì hỗn tăng được hiểu là chuyển đổi giá trị đến một từ một số giá trị khác như là 0,x hoặc z.
t_rise 0, x, z
Mơ hình Mức Cổng
+Trì hỗn giảm
Mơ hình Mức Cổng
+ Trì hỗn tắt
Thay đổi trạng thái đến giá trị z-tổng trở cao từ giá trị khác.
Nếu giá trị thay đổi đến x thì giá trị nhỏ nhất của 3 trì hỗn trên được xem xét. Đặc tả trì hỗn cả 3 loại trên đều được phép. Nếu chỉ có một trì hỗn được chỉ ra, giá trị này được sử dụng cho mọi
chuyển trạng thái.Nếu cả hai, ta tham chiếu
t_rise v t_fall, trì hỗn tắt-turn_off lấy giá trị nhỏ nhất của 2 giá trị trên. Nếu trì hỗn khơng rõ
Mơ hình Mức Cổng
// trì hỗn của delay_time cho tất cả chuyển trạng thái
and #( delay_time ) a1( out,i1,i2 ); // đặc tả trì hỗn tăng và giảm
and #( rise_val,fall_val ) a2( out,i1,i2 );
// đặc tả trì hỗn tăng,giảm, và trì hỗn tắt
Mơ hình Mức Cổng
Ví dụ về sự trì hỗn :
and #(5) a1( out,i1,i2 ); // trì hỗn là 5 cho tất cả chuyển trạng thái
and #(4,6 ) a2( out,i1,i2 ); // trì hỗn tăng là 4 và trì hỗn giảm là 5
bufif0 #( 3,4,5 ) b1( out,in,control ); // trì hoan tang la 3, giam la 4 và tat la 5
Mơ hình Mức Cổng
Min/Typ/Max Values
Verilog cung cấp cho chúng ta một mức điểu khiển cho mỗi trì hỗn đề cập ở trên. Cho mỗi kiểu delay_rise,fall, và turn-off Mỗi loại đều có 3 giá trị được chỉ ra: min, max, typ( typical ). Một số giá trị có thể được chọn tại lúc bắt đầu mơ phỏng. Các giá trị min/max/typ được sử dụng để mô hình linh kiện trong đó sự trì hỗn của linh kiện này thay đổi trong tầm
min và max do sự thay đổi quá trình sản xuất vi mạch
Giá min,typ,max có thể được chọn tại thời điểm verilog chạy. Phương pháp của việc chọn 1 giá trị min,typ,max có thể thay đổi tuỳ vào sự mơ phỏng khác nhau và hệ điều hành. Trong version thưong mại của verilog, giá trị được chọn bởi sự chỉ rõ các tuỳ chọn +maxdelays,typdelays,
+mindelays tại thời điểm chạy. điều này cho phép ngừoi thiết kế dễ
dàng chuyển đổi 3 giá trị trì hỗn. Người thiết kế có thể thử nghiệm với giá trị trì hỗn với việc khơng có bổ sung chỉnh sữa việc thiết kế
Mơ hình Mức Cổng
// one delay
// nếu +mindelays ,delay = 4 // nếu +typdelays ,delay = 5 // nếu là +maxdelays ,delay là 6 and #( 4:5:6 ) a1(out,i1,i2); //two delays
// nếu +mindelays, rise = 3,fall = 5, turn-off = min(3,5); // nếu +typdelays ,rise = 4,fall = 6, turn_off = min(4,6); // nếu +maxdelays ,rise = 5,fall = 7,turn_off = min( 5,7 ); and #( 3:4:5,5:6:7 );
// 3 delay
// nếu +mindelays, rise = 2,fall = 3, turn-off = 4; // nếu +typdelays ,rise = 3,fall = 4, turn_off = 5; // nếu +maxdelays ,rise = 4,fall = 5,turn_off = 6; and #( 2:3:4, 3:4:5, 4:5:6 ) a3( out,i1,i2 );
Mơ hình Mức Cổng
Một số ví dụ về việc gọi sự mơ phỏng với việc dịng lệnh dứơi đây. Giả sử module với sự delay được khai báo trong file test.v:
// gọi sự mô phỏng với +maxdelays >verilog test.v +maxdelays
// gọi sự mô phỏng với +mindelays >verilog test.v +mindelays
// goi sự mô phỏng với +typdelays >verilog test.v +typdelays
Mơ hình Mức Cổng
Ví dụ delay
Chúng ta xem xét một ví dụ đơn giản để minh hoạ việc sự trì hỗn cổng để mơ hình định thời trong mạch logic. Một module đơn giản thực hiện biểu thức logic:
Mơ hình Mức Cổng
Mơ tả theo code: // định nghĩa module D
Module D( out,a,b,c ); // khai báo I/O port output out;
input a,b,c; //net
Wire e;
// sự thể hiện cổng để xây dựng mạch
And #(5) a1( e,a,b ); // trì hỗn 5 time unit của cổng a1 Or #(4) o1( out,e,c ); // trì hỗn 4 time unit của cổng o1
Mơ hình Mức Cổng
Code kiểm tra:
// Stimulus – khối mức đỉnh Module stimulus;
// khai báo biến reg A,B,C;
wire OUT;
// sự thể hiện module D D d1( OUT,A,B,C );
// kích thích đầu ra. Hồn thành sự mơ phỏng trong 40 time unit Intital Begin A = 1’b0; B = 1’b0; C = 1’b0; #10 A = 1’b1,B = 1’b0; C = 1’b0; #20 $finish; End
Mơ hình Mức Cổng
Và sau đây là dạng sóng ra cho sự mơ phỏng để minh hoạ tác động của delay trên cổng:
Mơ hình Mức Cổng
Nhận xét :biểu đồ này:
1.đầu ra E và OUT không biết trước
2. tại thời gian 20,B và C chuyển trạng thái đến 0. E thay đổi giá trị từ đến 0 sau mỗi 5 time units, và OUT thay đổi