Thông báo

Collapse
No announcement yet.

Digital design tutorial

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Digital design tutorial

    Hi các bác,

    Hôm nay mình chính thức mở tutorial về digital design. Hi vọng mọi người ủng hộ.

    Tutorial này mình sẽ dựa theo quyển "Digital design and computer architecture" của Davis Harris. Các bác có thể download quyển sách này ở đây:
    http://www.ebookee.com/Digital-Desig...re_161471.html
    http://forum.esoft.in/e-books-tutori...hitecture.html
    http://rapidshare.com/files/10016184...vid_Harris.rar

    Mình đánh giá đây là một quyển comprehensive, basic, and easy to understand. Quyển sách này trình bày từ những cổng logic cơ bản đến thiết kế hoàn chỉnh vi xử lý. Mình biết ở VN cũng có dạy một số kiến thức cơ bản về digital design nên những kiến thức cơ bản mình sẽ nói rất nhanh. Ngoài ra mình cũng không phải là một translator để dịch toàn bộ quyển sách. Thay vào đó, mình sẽ trình bày những ý quan trọng để người đọc có thể nắm bắt. Nếu các bác muốn tìm hiểu kỹ thêm, muốn các chứng minh, giải thích thì có thể tham khảo sách. Đương nhiên mình cũng rất vui lòng trả lời mọi người.

    Giữa quyển sách sẽ trình bày về VHDL, và Verilog. Về sau các bác cũng sẽ sử dụng 2 ngôn ngữ này để thiết kế vi xử lý. Mình sẽ đưa lên mạng phần mềm Questasim của Mentor Graphics. Questasim có thể coi là phần mở rộng của Modelsim vì ngoài khả năng chạy mô phỏng, nó còn cho phép thực hiện assertion verification. Ngày xưa mình cũng biết làm cái này nhưng bây giờ quên hết rồi. Một phần là khi làm việc trong công ty bị áp lực thời gian nên chỉ tập trung viết code cho nhanh, quên hết assertion. Thật sự mình thích NCsim của Cadence hơn nhưng Questasim chạy trên Win nên sẽ dễ dàng với nhiều bác ở đây. Mình sẽ hướng dẫn các bác cài đặt, và tạo license file.

    I. (Tham khảo trang 9 sách) Nói đến digital design đương nhiên phải nói đến số. Ở đây chip điện tử sử dụng số nhị phân là 0, và 1 để từ đó tạo nên nhiều số lớn hơn. Ta có thể chuyển đổi các số nhị phân sang số thập phân ví dụ 1101=1*2^3+1*2^2+0*2^1+1*2^0=13. Bit đứng đầu trong số là Most Significant Bit (MSB) và bit đứng cuối là Least Significant Bit (LSB). Các số nhị phân có thể cộng lại với nhau theo cách cộng số thông thường (chắc mọi người biết rồi). Để mã hóa số âm người ta sử dụng kiểu Complementary 2. Với số dương, người ta thêm bit 0 vào trước MSB. Với số âm người ta nghịch đảo giá trị của số dương và cộng thêm 1. Ví dụ 13="1101" khi chuyển sang loại complementary 2, 13="01101", và -13="10011".

    Khi sử dụng comlementary 2, ta có thể cộng 2 số âm dương theo cách cộng thông thường. Khi thực hiện phép trừ tức là ta cộng với giá trị âm của số thứ 2 nên thứ tự thực hiện cũng là chuyển số thứ 2 sang giá trị âm rồi cộng lại. Ví dụ 13-5="01101"-"00101"="01101"+"11011"="01000"=8

    II Cổng logic. (Sách trang 19, các bác xem symbol các cổng trong sách, mình không vẽ ở đây)
    Not, Buf, And, Or, Nand, Nor, Xor... Chắc mọi người cũng đã biết nên mình không nói nhiều. Một điểm lưu ý nhỏ, Buf không có chức năng logic nhưng nó cho phép làm mạnh tín hiệu để có thể nối đến nhiều cổng phía sau, hoặc làm driver cho những cổng lớn, hoặc để truyền tín hiệu đi xa.

    Để xác định giá trị 0, 1 người ta sử dụng mức điện áp, thông thường nguồn(VDD) là 1, và đất(0) là 0. Trong hình 1.25 trang 25, có vẽ transfer function của cổng NOT về lý thuyết và thực tế. Trong hình thực tế, khi điện áp đầu vào ở giá trị VIH, và VIL, đạo hàm của điện áp ra là -1, và giá trị của điện áp ra là VOL, và VOH. Người ta quy định mức điện áp từ 0 đến VIL là mức 0 (VIL bắt đầu xảy ra chuyển mạch), và mức điện áp từ VIH đến VDD là 1 (VIH bắt đầu xảy ra chuyển mạch). Noise margin được định nghĩa như sau: NML=VIL-VOL (tức là từ mức đầu ra là 0 cho đến ngưỡng vẫn được coi là 0), NMH=VOH-VIH. (Hình 23 trang 24). Trong phần tiếp theo sách giới thiệu về CMOS, transistor, và các cổng logic được thực hiện bằng transistor. Mình sẽ giới thiệu kỹ về phần này khi nói về VLSI. Để đơn giản các bác cứ coi transistor như một switch (hình 1.31 trang 30), và từ switch này người ta thiết kế một loạt gate logic như hình 32, 33, 35, 36. Nguyên tắc của loại này là các PMOS được nối lên nguồn, khi chuyển mạch sẽ nối nguồn với đầu ra và đưa ra giá trị 1, các NMOS được nối với đất, khi chuyển mạch sẽ nối đất với đầu ra và đưa ra giá trị 0. Phần này mình cũng sẽ nói rõ hơn khi làm về VLSI, nhưng các bác có thể tham khảo thêm sách.

    Các mạch logic tiêu thụ 2 loại công suất Dynamic power và Static power. Dynamic power tiêu thụ trong quá trình chuyển mạch. Giả sử đầu ra chuyển trạng thái từ 0 lên 1, đầu ra sẽ được kết nối với nguồn và tụ ký sinh đầu ra sẽ được nạp lên giá trị của nguồn. Tụ ký sinh này có thể là do đường kết nối, hay đầu vào của các logic gate khác. Khi mạch chuyển về 0, tụ này sẽ xả điện. Như vậy công suất tiêu thụ mô tả trong công thức 1.4 (trang 34). Ngoài ra còn có static power là công suất tiêu thụ do dòng điện cố định trong mạch ví dụ leakage current trong CMOS logic quiescent current trong CML logic. P=I*V (công thức 1.5 trang 34).

    Cheers.

  • #2
    Vẫn đợi phần tiếp theo của anh.

    Comment


    • #3
      Hi các bác,

      Cám ơn các bác đã ủng hộ. Xin lỗi vì đã để bác Soihoang phải chờ lâu. Mình sẽ cố gắng tổng hợp và post bài lên sớm. Mình đang viết 2 thread nên hơi bận. Sắp tới chắc mình nên tập trung cho thread tutorial này vì nó phù hợp với nhiều người ở VN hơn, sẽ giúp ích cho nhiều người hơn. Thread về innovative microprocessor architecture chỉ phù hợp với những người có kiến thức và kinh nghiệm sâu về computer architecture nên sẽ phục vụ ít người ở VN.

      Cheers.

      Comment


      • #4
        Hì hì, anh thông thả viết nhé, chất lượng là trên hết anh ạ.

        Comment


        • #5
          cho em tham gia với anh Intran ơi! em vẫn đang tìm cách để cài cái cadence với analog design nhưng do em học VHDL rồi nên em muốn tham gia!

          Comment


          • #6
            Hi các bác,

            Cám ơn tất cả các bác đã ủng hộ. Bác Robocon2011 có thể cho mình biết ở VN giảng dạy VHDL như thế nào được không. Từ các thông tin của bác mình có thể biết sẽ tập trung cho phần nào. VHDL và Verilog là ngôn ngữ mô tả phần cứng "Hardware Description Language", nhưng mình biết nhiều người viết VHDL hay verilog không khác viết ngôn ngữ lập trình như C++. Nhiều khi điều này không tạo nên sự khác biệt nhưng trong nhiều trường hợp tạo lên sự phân biệt rất lớn về nền tảng căn bản. Nếu các bác coi VHDL, hay verilog là ngôn ngữ mô tả phần cứng thì bác sẽ viết dưới con mắt của người thiết kế phần cứng. Bác mô tả một mạch là multiplexor nối đến một latch thì đó sẽ là một multiplexor nối đến một latch. Ngược lại nếu các bác viết dưới con mắt của người lập trình thì chương trình sẽ chạy đúng chức năng, nhưng không mô tả đúng phần cứng mà các bác mong đợi. Cách viết theo kiểu lập trình mình hết sức không recommend nhưng cũng có thể sử dụng trong nhưng trường hợp đơn giản, hoặc viết behavioral model cho verification.

            Viết dưới cái nhìn của người làm phần cứng trong nhiều trường hợp ảnh hưởng rất lớn đến hiệu suất hoạt động của mạch. Ví dụ như các bác muốn thiết kế pipeline và chèn flip-flop vào giữa stage. Các bác cần phải xác định chính xác vị trí cần chèn flip-flop mới có thể tăng tần số đồng hồ lên mức cao nhất. Hoặc giả sử như các bác có thể tránh sử dụng trạng thái high impedance ("Z"), vì việc sử dụng thiết kế logic kiểu này tiêu thụ công suất rất lớn. Các mạch logic sử dụng "Z" khi chuyển mạch nhiều lúc xảy ra short circuit vì các mạch chuyển không đồng thời, có thể xảy ra cùng lúc nhiều mạch ở mức 1, và 0.

            Mình đương nhiên rất vui nếu ở VN giảng dạy VHDL và verilog theo cách nhìn của người làm phần cứng. Nhưng nếu không mình cũng rất muốn biết để có thể đưa ra cho các bác nhưng bài viết hữu ích.

            Bây giờ mình viết tiếp chương 2. Trong phần này có một số điểm có thể không chính xác 100% nhưng đó chỉ là những trường hợp đặc biệt mình không muốn trình bày vì có thể làm nhiều bác rối loạn các kiến thức cơ bản. Để đơn giản các bác cứ hiểu cái kim tuy nhẹ nhưng vẫn chìm dưới nước, còn trường hợp cái kim nổi trên mặt nước là có thật nhưng mình không nói đến.

            Mạch điện có thể coi là một hộp đen gồm một số đầu vào và đầu ra. Các mạch điện được xác định bởi functional specification, tức là quan hệ giữa đầu vào và đầu ra của mạch, và timing specification tức là độ trễ giữa việc thay đổi giá trị đầu vào với việc thay đổi giá trị đầu ra. Các mạch điện được chia làm 2 loại combinational và sequential. Combinational là mạch điện không nhớ "memoryless" tức là giá trị đầu ra chỉ phụ thuộc vào giá trị đầu vào trong khi đó sequential logic là mạch nhớ tức là giá trị đầu ra phụ thuộc cả vào giá trị đầu vào lẫn các trạng thái trước đó của mạch. Trong phần này chúng ta chỉ phân tích về combinational logic.

            Các mạch logic thường được xây dựng nên từ nhưng hàm logic căn bản trong đó giá trị "true", và "false" tương ứng với 2 trạng thái 1, 0 của mạch logic. Các hàm logic căn bản có thể lấy ví dụ như NOT, AND, OR. Từ mạch logic căn bản này, người ta có thể xây dụng nên nhưng mạch lớn thức hiện các hàm logic phức tạp hơn, trong đó bất kì một hàm logic nào cũng có thể được biểu diễn dưới dạng tổng của tích (Sum of Product) hay tích của tổng (Product of Sum). (cái này ở VN dạy rất tốt nên mình không nói nhiều).

            Biểu diễn hàm logic dưới dạng tổng của tích hoặc tích của tổng thường không được tối giản. Để đơn giản hàm logic, ta có thể áp dụng một số quy tắc tính toán logic như bảng 2.1 (trang 57), bẳng 2.2 (trang 58), bẳng 2.3 (trang 59) trong đó có quy tắc De Morgan (cái này ở VN dạy cũng rất tốt mình không nói lại).

            Có nhiều cách để thực hiện cùng một hàm logic, và việc sử dụng tổng của tích, tích của tổng... chưa chắc đã đưa ra được kết quả tối ưu. Việc lưa chọn cách thực hiện hàm logic trong mạch tùy thuộc vào sự trade-off ví dụ như diện tích mạch, tốc độ tính toán, tiêu thụ công suất. Để làm được điều này mình có một số lời khuyên như sau:

            Với những mạch chuẩn ví dụ cộng, trừ, nhân, chia, FFT... các bác nên đọc thật nhiều các loại mạch mà mọi người đã thiết kế từ trước. Các mạch điện thông dụng thường đã được thiết kế từ trước rất nhiều, và người ta đã nghiên cứu kỹ ưu, nhược điểm của nhưng mạch này. Thay vì tự sáng tạo lại mạch điện mới, hãy dùng những cái đã được chuẩn hóa. Điều này chẳng những giúp các bác có được thiết kế chính xác mà còn rất tối ưu (tùy theo ứng dụng). Ví dụ như khi nghĩ đến thiết kế một mạch cộng cho vi xử lý hay DSP mình nghĩ ngay đến Han-Carlson adder, không phải mấy loại thông thường hay được nhắc đến như carry look ahead adder hay ripple carry adder. Vậy nên với những bác thiết kế mạch đặc biệt cho DSP, cần phải đọc thật nhiều những mạch điện thiết kế chuẩn.

            Với các mạch không có chuẩn, các bác có thể sử dụng Synthesis tool như design compiler để tạo ra. Các EDA tool tạo mạch rất tốt từ thư viện có sẵn và yêu cầu người dùng.

            Trong những trường hợp đặc biệt các bác hãy thiết kế bằng tay. Cái này mình không có lời khuyên cho các bác. Các thiết kế đặc biệt này quá chuyên biệt, nhiều khi không sử dụng CMOS logic này các kiểu logic thông thường. Nếu bác nào có kinh nghiệm trong việc này xin hãy chia sẻ với mọi người.

            Mặc dù mạch logic chỉ có 2 trạng thái 0, 1, nhưng người thiết kế sử dụng thêm 2 trạng thái nữa là X, và Z. X có thể là trạng thái không xác định của mạch, hoặc không biết hay không quan tâm đến trạng thái của mạch. Ví dụ như khi mạch chưa được reset, giá trị của flip-flop, hay register file không thể xác định. Trạng thái Z là trạng thái trở kháng cao hay còn gọi là floating value. Z state thường được dùng để thiết kế shared bus như hình 2.42 (trang 71). Nhưng như mình đã có nói ở trên, sử dụng Z state thường làm mạch tiêu thụ công suất lớn nên tốt nhất nên tránh, trừ những trường hợp không thể không sử dụng.

            Karnaugh maps (cái này ở VN đã dạy rất tốt nên mình không nói nhiều). Đây là một trong các phương pháp đơn giản để tối thiểu hóa hàm logic bằng tay. Thông thường các bác chỉ cần để EDA tools tự tổng hợp mạch là đủ nên cái này cũng không quá quan trọng, các bác có thể tự đọc thêm.

            Trong sách có giới thiệu một số mạch như multiplexor, và decoder. Các bác đọc thêm mấy mạch này như một số ví dụ cơ bản.

            Timing: Các mạch logic bao giờ cũng có một độ trễ và đây là một trong những chỉ tiêu quan trọng nhất của mạch. Thời gian từ lúc đầu vào thay đổi trạng thái đến khi đầu ra thay đổi trạng thái gọi là propagation delay (hình 2.66 trang 84). Thời gian trễ này phụ thuộc vào nhiều yếu tố như bản thân mạch điện, điện áp làm việc, nhiệt độ, tải đầu ra (output capacitance), và tốc độ thay đổi của tín hiệu đầu vào (rising and falling edge). Khi tín hiệu đầu vào thay đổi, nó sẽ làm tín hiệu của các cổng logic thay đổi thành một đường (path) (hình 2.68 trang 85), trong đó critical path là đường có độ trễ lớn nhất. Phần tích critical path là một trong những việc quan trọng nhất để có thể tăng tần số làm việc của mạch. Các thiết kế mạch tốc độ cao đều cố gắng giảm thiểu critical path (hình 2.69, trang 86).

            Glitches: đây là trường hợp khi đầu ra liên tục thay đổi trạng thái từ 0 sang 1 rồi lại 0, hay 1, sang 0 rồi lại 1. Ngày nay việc sử dụng tín hiệu đồng hồ để đồng bộ làm cho glitches không có ảnh hưởng nhiều đến hoạt động của mạch nhưng glitches cũng nên loại bỏ. glitches làm cho công suất tiêu thụ của mạch điện tăng cao một cách không cần thiết. Trong một số mạch mix signal tức là có cả digital và analog circuit, glitches có thể gây ra vấn đề. Ví dụ như khi thiết kế ADC hay DAC người ta sử dụng gray counter để tránh gây ra glitches. Để loại bỏ glitches ta cần cân bằng độ trễ trên các đường truyền tránh có nhiều critical path, và sử dụng redundant gate. Trong sách lấy ví dụ mạch multiplexor sử dụng Karnaugh maps để làm ví dụ cho việc sử dụng redundant gate các bác hãy xem thêm (trang 90, 91).

            Cheers.

            Comment


            • #7
              xin lỗi anh Intran nhé! hôm nay em mới vào mục này! em chi tự học thôi! nên em cũng không biết các trường đại học khác giảng dạy như thế nào ạ!

              Comment


              • #8
                anh Intran ơi sao lâu vậy rùi mà anh k viết tiếp ạ?em đợi mãi!

                Comment


                • #9
                  Hi Intran,
                  Bài viết của bạn rất bổ ích. Mong bạn tiếp tục loạt bài trên.
                  cảm ơn bạn.

                  Hiệp

                  Comment

                  Về tác giả

                  Collapse

                  lntran Tìm hiểu thêm về lntran

                  Bài viết mới nhất

                  Collapse

                  Đang tải...
                  X