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!
  • Đăng ký
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

mô hình luồng dữ liệu trong verilog.

Email In PDF.
1, Giới thiệu:
verilog-hdl-28-638.jpg
- Đối với các thiết kế nhỏ, các phương pháp mô hình gate-level (mức cổng) làm việc rất tốt vì số lượng các cổng là hạn chế. Chúng ta có thể thiết kế nhanh chóng và kết nối mỗi cổng riêng biệt lại với nhau dễ dàng. Ngoài ra, mô hình gate-level là rất trực quan để giúp chúng ta có một kiến thức cơ bản của thiết kế logic số. Tuy nhiên, trong các thiết kế phức tạp thì số lượng cổng là rất lớn. Chúng ta không thể sử dụng mức cổng, thay vào đó chúng ta có thể thiết kế một cách hiệu quả hơn nếu tập trung vào triển khai các chức năng ở một mức độ trừu tượng cao hơn so với mức cổng. Mô hình Data Flow cung cấp một cách hiệu quả để triển khai một thiết kế phức tạp như trên. Verilog cho phép một mạch được thiết kế theo thuật ngữ của data flow giữa các thanh ghi và làm sao có một thiết kế xử lý dữ liệu chứ không phải là trừu tượng như gate-level.
- Mô hình dataflow đã trở thành một phương pháp thiết kế phổ biến như những công cụ tổng hợp logic. Phương pháp này cho phép các nhà thiết kế tập trung vào việc tối ưu hóa các mạch trong mô hình data flow. Để sự linh hoạt tối đa trong quá trình thiết kế, các nhà thiết kế thường sử dụng bản mô tả style Verilog kết hợp các khái niệm về gate-level, dataflow, và thiết kế hành vi. Trong cộng đồng thiết kế kỹ thuật số, các thuật ngữ thiết kế RTL (Register Transfer Level) thường được sử dụng cho một sự kết hợp của mô hình data flow và mô hình behavioral.

2,Câu lệnh gán liên tục
- Một phép gán liên tục là những câu lệnh cơ bản nhất trong mô hình dataflow, được dung để điều khiển một giá trị vào một Net. Một phép gán liên tục thay thế cổng trong mô tả của mạch và mô tả các mạch ở một mức độ trừu tượng cao hơn. Một câu lệnh gán liên tục bắt đầu với từ khóa assign. Chúng đại diện cho kết nối cấu trúc.
Chú ý:
- Câu lệnh được sử dụng để mô hình hóa bộ đệm Tri-State.
- Câu lệnh có thể được sử dụng để mô hình hóa logic tổ hợp.
- Câu lệnh nằm bên ngoài các khối thủ tục (always và initial blocks).
- Phép gán liên tục sẽ ghi đè mọi phép gán thủ tục.
- Phía bên trái của một phép gán liên tục phải là kiểu dữ liệu Net.

Câu lệnh: ( cái này ở bài trước đã viết rất kỹ nên mình không nhắc lại nữa)

assign (strength, strength)#(delay)net = expression;

Một số ví dụ:
MÃ:
assign out = in0 + in1; // in0 + in1 is evaluated and then assign out[3:0] = in0[3:0] & in1[3:0]; assign {o3, o2, o1, o0} = in0[3:0] | {in1[2:0],in2}; // Use of concatenation. // Phép gán được ẩn trong khai báo: wire out = in0 ^ in1;
3, DELAY(TRỄ)
- Trễ giá trị kiểm soát thời gian giữa sự thay đổi bên phải toán hạng và khi giá trị mới được gán cho bên trái.
- Có ba loại trễ kết hợp với mô hình dataflow. Đó là:
· Regular assignment delay.
· Implicit continuous assignment delay.
· Net declaration delay. 

a.Regular assignment delay
- Cách đầu tiên là phải gán một giá trị chậm trễ trong câu lệnh gán liên tục. Các giá trị trễ được quy định sau từ khóa assign.
Ví dụ:
MÃ:
module regular_delay (out, in1, in2); output out; input in1, in2; assign #10 out = in1 & in2; endmodule
b. Implicit continuous assignment delay.
- Gía trị trễ được quy định sau Net của phép gán liên tục ẩn trong khai báo.
Ví dụ:
MÃ:
module implicit_delay (out, in1, in2); output out; input in1, in2; wire #10 out = in1 & in2; endmodule
c. Net declaration delay.
- Gía trị trễ được quy định tại khai báo Net.
Ví dụ:
wire #10 out;
assign out = in;


4, Toán tử
[​IMG]
[​IMG]

5,Một số ví dụ:
1. Implementation of a 2x4 decoder.
MÃ:
module decoder_2x4 (out, in0, in1); output out[0:3]; input in0, in1; // Data flow modeling uses logic operators. assign out[0:3] = { ~in0 & ~in1, in0 & ~in1, ~in0 & in1, in0 & in1 }; endmodule
2. Implementation of a 4x1 multiplexer.
MÃ:
module mux_4x1 (out, in0, in1, in2, in3, s0, s1); output out; input in0, in1, in2, in3; input s0, s1; assign out = (~s0 & ~s1 & in0)|(s0 & ~s1 & in1)| (~s0 & s1 & in2)|(s0 & s1 & in0); endmodule 
3. Implementation of a 8x1 multiplexer using 4x1 multiplexers.
MÃ:
module mux_8x1 (out, in, sel); output out; input [7:0] in; input [2:0] sel; wire m1, m2; // Instances of 4x1 multiplexers. mux_4x1 mux_1 (m1, in[0], in[1], in[2], in[3], sel[0], sel[1]); mux_4x1 mux_2 (m2, in[4], in[5], in[6], in[7], sel[0], sel[1]); assign out = (~sel[2] & m1)|(sel[2] & m2); endmodule
4. Implementation of a Full adder.
MÃ:
module full_adder (sum, c_out, in0, in1, c_in); output sum, c_out; input in0, in1, c_in; assign { c_out, sum } = in0 + in1 + c_in; endmodule
Lần cập nhật cuối ( Thứ năm, 11 Tháng 6 2015 14:47 )  

Related Articles

Chat Zalo