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

Ví dụ về FSM

E-mail Print PDF

1. Yêu cầu:

Thiết kế logic có khả năng tính toán cho biểu thức sau: result = 2^n + m;

Đầu vào là n 4 bits, số lũy thừa 2. m 8 bits là toán tử cộng. start là nút bấm bắt đầu tính sau khi đã setup xong n với m.

Đầu ra là kết quả result 17 bits. Tín hiệu báo kết thúc done.

 

2. Phân tích:

Để làm được biểu thức như thế trước hết, chúng phải làm như sau:

    + Tính toán lũy thừa cơ số 2 trước.

    + Cộng kết quả của 2^n với m. Rồi gán kết quả cho result. Đồng thời bật tín hiệu done.

Do số n là số 4 bits nhị phân, giá trị nó tối đa là 15. Vậy số 2^n có thể tối đa là 2^15 = 32768.

Số m là 8 bits. Do đó, tối đa của m là 255.

Như vậy, giá trị tối đa của biểu thức trên là result(max) = 32768 + 255 = 33023.

Để biểu diễn giá trị Max này dưới dạng nhị phân thì ta cần 16 bits. Do đó, đầu ra result là 1 tín hiệu có 16bits.

Lũy thừa của 2 là cấp số nhân 2, n lần. Do n có thể thay đổi từ 0-> 15, do đó, ta sẽ cho phép nhân lặp lại n lần, rồi sau đó cộng kết quả với m.

Dùng 1 state machine để giải quyết vấn đề trên như sau:

    1. Khi mạch chưa tính toán, start chưa tích cực: State ở IDLE state. resutl = 1.

    2. Khi có start đưa vào, mạch phát hiện cạnh sẽ cho ra tín hiệu start_pulse = 1, State chuyển sang MUL state.

        Và trong State này, giá trị của result sẽ được nhân cho 2 sau mỗi chu kỳ clock. Cho đến khi số lần nhân bằng với n. Ở đây ta dùng biến i là biến đếm trung gian.

    3. Sau khi hoàn thành n lần nhân với 2, state sẽ chuyển sang ADD. result sẽ bằng result + m.

    4. Vì lệnh cộng chỉ cần thực hiện trong 1 chu kỳ clock, nên sau state sẽ chuyển sang trạng thái DONE sau 1 chu kỳ.

    5. Ở trạng thái DONE, có các đầu ra thông báo việc tính toán đã hoàn tất. Thông thường cũng chỉ cần 1 chu kỳ.

    6. Sau đó, state trở về trạng thái ban đầu IDLE.

Lưu đồ chuyển trạng thái của State như sau:

 

* Chú thích:

* Dòng text màu đỏ là điều kiện để chuyển state.

* Dòng text màu xanh: các phép gán được thực hiện trong state hiện tại.

(Lưu ý, đây chỉ là 1 trong rất nhiều cách thiết kế để giải quyết bài toán tính biểu thức nói trên. Các bạn có thể tự thiết kế, thay đổi, biến đổi sao cho phù hợp với tư duy và ý tưởng của mình.)

3. Coding:

// next state

always @ (*) begin

    case ( state )

        `IDLE:  if (start_pulse == 1'b1 )       next_state = `MUL;

                    else                                         next_state = `IDLE;

        `MUL:  if (i == 4'd0 )                         next_state = `PLUS;

                    else                                         next_state = `MUL;

        `PLUS:                                                next_state = `DONE;

        default:                                               next_state = `IDLE;

    endcase

end

Các bạn có thể tham khảo code mẫu tại đây.

4. Simulation:

Về phần simulation, các bạn có thể tạo testbench và kiểm tra code của mình. Vấn đề này không khó lắm.

Waveform cho trường hợp n = 10, m = 195.

 

Chúc các bạn tìm hiểu và thực hành thành công về State Machine !!

 Nguồn: degic.freeforums

Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

Mong Muốn Có Thêm Cơ Hội Trong Công Việc

    Và Trở Thành Một Người Có Giá Trị Hơn

Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng

Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON  

 

Hotline: 0972.800.931 - 0938.838.404 (Mr Long)

 

Last Updated ( Monday, 22 July 2019 19:08 )  

Related Articles

Chat Zalo