Saturday, September 7, 2019

[SoC][Design vending machine] Thiết kế máy bán hàng tự động (Vending machine) với ngôn ngữ verilog


I. Mục tiêu.

Thiết kế máy bán nước ngọt tự động (vending machine) tuân thủ các nguyên tắc sau: 

  • Nước ngọt (Soda) giá 9000, nước suối (Water) giá 7000. 
  • Máy nhận xu: 1000, 2000 và 5000 (N, D, Q). 
  • Số tiền trả lại sao cho số xu ít nhất (Give change in the smallest # coins possible). 
  • Nếu số tiền bỏ vào lớn hơn 9000 máy sẽ tự trả lại tiền vừa bỏ vào sau. 
  • Máy có nút Coin Return (CR) dùng để trả lại hết tiền vừa bỏ vào.
  • Nếu không có nút nào được ấn thì máy trạng thái giữ nguyên trạng thái cũ. 

Các ngõ ra: 

  • Coin Return out (trả hết tiền khi CR được bấm). 
  • Water out (WO) (mua nước suối). 
  • Soda out (SO) (mua nước ngọt). 
  • Change (CO) (trả tiền thừa).





Hình 1.2 Một máy vending machine điển hình.

II. Tóm tắt các bước tiến hành. 

Trong bài lab này mình thiết kế máy bán hàng tự động dựa vào FSM (Finite state machine) Máy trạng thái hữu hạn. 

Gồm có 4 trạng thái như sau: 

  • Trạng thái nghĩ (IDLE state): Máy không làm gì cả. 
  • Trạng thái nhận tiền (RECEIVE state): Khi có tiền được đưa vào, máy chuyển sang trạng thái nhận tiền. 
  • Trạng thái trả ra nước (RETURN state): Khi nút chọn được nhấn máy sẽ trả ra loại nước được chọn. 
  • Trạng thái hoàn tiền lại (CHANGE state): Hoàn lại tiền còn dư.








III. Lý thuyết hoạt động của mạch. 

Máy vending machine của chúng ta có các input như sau: 

  • clk : Cấp clock cho module 
  • rst_n: Điều khiển trạng thái (reset/active cho module) 
  • in_cost: 2 bits dữ liệu gồm 

          00: Không có tiền được nhận vào 
          01: Nhận 1.000 VND vào 
          10: Nhận 2.000 VND vào 
          11: Nhận 5.000 VND vào 


  • R_M (Return money): 1 bit dữ liệu khi muốn trả lại tiền được thối tín hiệu này có giá trị là 1. 
  • SI (Soft drink input): 1 bit dữ liệu Máy sẽ trả ra nước ngọt khi nút này bật lên 1 
  • WI (Water input): 1 bit dữ liệu, máy sẽ rả ra nước lọc khi nút này bật lên 1 


Chúng ta có 5 output đầu ra như bên dưới:


  • SO (soft drink out): 1 bit dữ liệu, Trả ra nước ngọt khi bằng 1 ngược lại là 0. 
  • WO (water out): 1 bit dữ liệu, Trả ra nước lọc khi bằng 1 ngược lại là 0. 
  • R_1 (Return 1.000): Trả ra tiền thối mệnh giá 1.000k (Cách tính: nếu R_1 = 1 thì mệnh giá ra là 1x1.000 = 1.000 VND, nếu R_1 = 5 tiền trả ra là 5 tờ mệnh giá 1.000 VND tổng là 5x1.000 = 5.000 VND). 
  • R_2 (Return 2.000): Trả lại tiền thối mệnh giá 2.000 VND, Cách tính như trên. 
  • R_5 (Return 5.000): Trả lại tiền thối mệnh giá 5.000 VND, Cách tính như trên. Tiền nhận vào là lần lượt còn tiền thói lại sẽ được thói một lần, điều này tương tự như máy ATM. Người mua hàng không thể một lần cho vào nhiều số tiền được mà phải đưa vào lần lượt. Tuy nhiên khi nhận tiền thói thì sẽ nhận một lần.




Mô tả chi tiết từng trạng thái. 

IDLE_STATE: Đây là trạng thái ban đầu của máy vending machine. Khi không được sử dụng hay nói đúng hơn là không có tiền được đưa vào máy sẽ giữ trạng thái IDLE. 

RECEIVE_STATE: Máy sẽ chuyển từ trạng thái IDLE_STATE sang trạng thái RECEIVE_STATE khi có tiền được đưa vào. Tiền đưa vào bao gồm các mệnh giá : 1.000 VND, 2.000 VND, 5.000 VND. Tại đây có một biến sum dùng để tính toán tổng số tiền được đưa vào. Từ trạng thái này máy sẽ chuyển sang trạng thái CHANGE_STATE khi nút nhấn R_M được nhấn (Mang giá trị là 1). Từ trạng thái này máy sẽ chuyển sang trạng thái RETURN_STATE khi người dùng ngừng bỏ tiền vào và nhấn nút chọn sản phẩm. 

  • WI : Chọn nước lọc. 
  • SI: Chọn nước ngọt. 

Nếu các điều kiện trên đều không được đáp ứng máy sẽ giữ trạng thái RECEIVE_STATE.


RETURN_STATE: Trạng thái này sẽ trả ra nước ngọt hoặc nước lọc tuỳ vào người dùng chọn. Tuy nhiên, Phải có điều kiện. Giả sử người dùng bỏ tổng số tiền vào là 5.000 VND và chọn mua nước ngọt giá 9.000 VND. Điều này là không thể. Ta sẽ thêm điều kiện cho biến sum như bên dưới: 

  • Nếu chọn nước ngọt (SI = 1) thì sum >= 9000 VND. 
  • Nếu chọn nước lọc (WI = 1) thì sum >= 7000 VND. 

Nếu không thoả điều kiện máy sẽ quay lại trạng thái RECEIVE_STATE. Nếu thoã điều kiện có 2 trường hợp xảy ra (Biến sum sẽ bị trừ đi giá trị tương ứng với loại nước ngọt) 

  • Trường hợp 1: Người dùng không muốn nhận tiền thói và tiếp tục mua hàng khi đó ( sẽ có tiền bỏ vào và giá trị R_M = 0) lúc này chúng ta chuyển từ trạng thái hiện tại sang trạng thái RECEIVE_STATE. 
  • Trường hợp 2: Người dùng nhận lại tiền thói (R_M = 1) và không mua nữa (Không có tiền bỏ vào) lúc này máy chuyển sang trạng thái CHANGE_STATE. CHANGE_STATE: Trạng thái này sẽ trả lại tiền được thói một lần. Có 3 biến


             R_1: Trả lại tiền mệnh giá 1.000 VND. Số lượng đồng một ngàn phụ thuộc vào giá trị R_1. Ví dụ R_1 = 1 => có 1 đồng mang giá trị 1.000 VND. Nếu R_1 = 4 => có 4 đồng mang giá trị 1.000 VND. 
             R_2: Trả lại tiền mệnh giá 2.000 VND. 
             R_5: Trả lại tiền mệnh giá 5.000 VND. 

Sau khi thói lại tiền nếu không có tiền đưa vào tại chu kì kế tiếp máy sẽ chuyển sang trạng thái IDLE_STATE. Nếu có tiền đưa vào chu kì kế tiếp máy sẽ chuyển sang trạng thái RECEIVE_STATE.






Thuật toán tính toán giá trị thói lại. 


Ở đây ta dùng thuật toán chia lấy phần dư và chia lấy nguyên. Ta có biến sum bằng tổng số tiền sau khi mua và cần được thói lại. Như vậy số mệnh giá 5.000 được tính theo code Verilog như bên dưới:

always @(……. 
   R_5 = sum/5; 
   R_2 = (sum%5)/2; 
   R_1 = (sum%5)%2; 
end



  • R_5: Lấy tổng tiền chia 5 lấy phần nguyên ví dụ 18.000 VND chia cho 5 lấy nguyên ta có 3 đồng mệnh giá 5000 VND. 
  • R_2: Lấy phần dư khi chia sum cho 5 chia lấy nguyên cho 2. Ví dụ ta có 18.000 VND chia cho 5 dư 3. Lấy 3 chia cho 2 lấy phần nguyên là 1. 
  • R_1: Cái này tương đối đơn giản lấy phần dư khi chia cho 5 lấy chia cho 2 và tiếp tục lấy phần dư của nó (xoắn nảo, hehe) ta được R_1.



IV. Verilog code và test bench, môi trường uvm.

Sẽ update trong bài tiếp theo....


Kết luận 

Bài thực hiện mô phỏng máy bán hàng tự động (Vending machine) hoàn thành tốt đẹp. Tuy còn 1 vài hản chế đã được trình bài trong phần 3. Em sẽ cố gắn khắc phục yếu tố này trong tương lai gần.

11 comments:

  1. Replies
    1. cho mình xin file verilog với testbench với ad

      Delete
  2. Bạn cho mình xin file code với ạ ! Email: cholacha01@gmail.com

    ReplyDelete
  3. Bạn cho mình xin file code và file testbench với ạ. cảm ơn bạn rất nhiều khaiminh2310@gmail.com

    ReplyDelete
  4. ban cho minh xin code voi anh.dv2000@gmil.com.
    thanks b !

    ReplyDelete
  5. bạn cho mình xin code với ạ email binhpham0802@gmail.com

    ReplyDelete
  6. bạn cho mình xin code với ạ email binhpham0802@gmail.com

    ReplyDelete
  7. Bạn ơi cho mình xin code với :((( đây là email mình legendary11368@gmail.com
    Mình chân thành cám ơnnnnnn

    ReplyDelete
  8. cho mình xin file code với
    email mình hungnguyenbk481@gmail.com

    ReplyDelete
  9. ad cho mình xin code với ạ
    email : chaubobolq@gmail.com
    mình xin cảm ơn

    ReplyDelete
  10. Chào Ad,
    Cho minh xin code file code và file testbench với nhé. Cảm ơn bạn
    Email: bathang.pham@gmail.com

    ReplyDelete

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...