Monday, September 30, 2019

[Unity][Game 2D][Bài 2] Hướng dẫn tạo 1 game bắn súng 2D đơn giản với Unity

Tạo game mobile bắn súng 2D bằng phần mềm Unity.



Biên dịch và soạn thảo: TrongTran
Ngày: 30/09/2019

Giới thiệu.

Trong phần thứ hai của hướng dẫn này, chúng ta sẽ cùng nhau tìm hiểu cách:


  • Tạo ra các thiên thạch ngẫu nhiên (là các đối tượng mà tên lửa cần tiêu diệt).
  • Di chuyển các thiên thạch này bằng cách áp các lực.
  • Phá hủy những thiên thạch này khi bị đạn bắn trúng.


Tiêu diệt mục tiêu

Bây giờ tên lửa của chúng ta có thể bắn ra đạn, việc chúng ta cần làm tiếp theo đó là phá huỷ các vật thể va chạm với tên lửa hoặc va chạm với đạn được bắn từ tên lửa.

Mình sẽ tạo một đối tượng mới được sử dụng làm mục tiêu (Là các thiên thạch).

Từ cửa sổ Project, chọn (Create Sprites | Square)

Đổi tên mục tiêu sprite mới này.

Kéo và thả sprite này vào màn hình scene.




Điều này sẽ tạo ra một đối tượng mới trong cửa sổ scene; Chúng ta tiến hành đổi tên đối tượng mới này.

Thêm một BoxCollider2D vào đối tượng này (tức là, chọn Components | Physics2D | BoxCollider2D). 

Khi thêm thành phần vật lí cho đối tượng có nghĩa là hiện tại đối tượng của chúng ta có thể va chạm với những đối tượng khác.

Bây giờ chúng ta sẽ tạo một tag mới cho đối tượng này. Tag này sẽ giúp xác định từng đối tượng trong scene và để xem đối tượng mà viên đạn (hoặc tên lửa) đang va chạm.

Chọn đối tượng thiên thạch trong cửa sổ hierarchy.
Trong cửa sổ Inspector, nhấp vào menu thả xuống có tên Untagged như được mô tả trên hình tiếp theo.



Từ menu kéo xuống lựa chọn option “Add tag…”.



Trong cửa sổ mới, nhấp vào nút + nằm bên dưới nhãn “Tags/List is Empty”.



Đặt tên cho tag của bạn (tức là, mục tiêu), sử dụng trường ở bên phải của nhãn Tag 0.



Nhấn phím Enter/Return trên bàn phím để lưu tag mới của bạn.
Chọn lại mục tiêu đối tượng thiên thạch trong cửa sổ hierarchy, trong inspector , chọn tag mà bạn vừa tạo ra.



Cuối cùng nhưng không kém phần quan trọng, chúng ta sẽ tạo một prefab từ mục tiêu này bằng cách kéo và thả mục tiêu đối tượng vào cửa sổ Project.


Tiếp theo, chúng ta tạo một tập lệnh mới sẽ được liên kết với viên đạn (hoặc tên lửa), do đó, khi va chạm với mục tiêu, mục tiêu này sẽ bị phá hủy (dựa trên tag của nó).

Chúng ta tạo một tập lệnh mới có tên Bullet: từ cửa sổ Project, chọn Create | C # scripts.
Thêm đoạn code sau đây vào nó:

void OnCollisionEnter2D(Collision2D coll)

{
    if (coll.gameObject.tag == "target")
    {
        Destroy (coll.gameObject);
        Destroy (gameObject);
    }
}

Trong đoạn code bên trên ta thực hiện một số tác vụ như sau:


  • Phát hiện các vật thể va chạm với viên đạn.
  • Khi điều này xảy ra, kiểm tra xem đối tượng này có phải là mục tiêu không; nếu đây là mục tiêu, mục tiêu này sau đó bị phá hủy.
  • Viên đạn cũng bị phá hủy trong trường hợp này.


Chúng ta lưu tập lệnh có tên Bullet và kiểm tra xem nó có lỗi hay không.
Nếu không có lỗi, Tiến hành kéo và thả nó vào prefab có tên Bullet, trong cửa sổ Project.

Tiếp theo chúng ta sẽ cần thêm một sự va chạm vào prefab Bullet của mình, để nó thực sự va chạm với các đối tượng khác:

Chọn prefab “bullet”.



Từ menu trên cùng, chọn Components | Physics2D | BoxCollider2D.

Bây giờ bạn có thể kiểm tra trò chơi của mình:



Di chuyển đối tượng thiên thạch ngay phía trên tên lửa, như được minh họa trong hình tiếp theo.

Nhấn phím cách và kiểm tra xem, khi va chạm giữa viên đạn và mục tiêu, cả hai vật thể đều bị phá hủy.

Lưu ý rằng vì bạn sẽ bắn một số viên đạn, chúng ta có thể chọn phá hủy một viên đạn sau 10 giây (trước thời gian này nó sẽ phải bắn trúng mục tiêu nếu không viên đạn sẽ tự biến mất sau 10s), bằng cách sửa đổi tập lệnh Bullet như sau:

void Start ()
{
    Destroy (gameObject, 10);
}

Bạn có thể kiểm tra để thấy rằng sau 10 giây viên đạn có bị phá hủy hay không.

Trước khi tiếp tục,  các bạn lưu lại scene này lại. Bạn chọn (File  | Save Scene As) từ menu trên cùng và lưu lại với tên level1. Bạn cũng có thể lưu dự án của mình (File | Save project).


Tiếp theo, chúng ta sẽ chỉ rõ 2 loại mục tiêu khác nhau; đó là: một mục tiêu di chuyển sẽ di chuyển xuống dưới và người chơi sẽ phải tránh hoặc tiêu diệt.

 Trong cửa sổ project, Chúng ta tiến hành sao chép prefab “target” mà chúng ta vừa tạo (nghĩa là chọn prefab “target” và nhấn CTRL + D).
 Đổi tên prefab vừa tạo thành move_target.
Chọn prefab move_target trong cửa sổ hierarchy và thêm thành phần RigidBody2D vào nó (nghĩa là chọn Component | Phisics2D | RigidBody2D).



Trong cửa sổ Inspector, đặt thuộc tính Gravity Scale (cho thành phần Rigidbody2D) thành 0, như được minh họa trên hình tiếp theo. Điều này là để đối tượng không rơi vô thời hạn (vì nó là chế độ xem từ trên xuống)



Tiếp theo, chúng ta sẽ tạo một tập lệnh  C# để liên kết với move_target nhầm điều chỉnh vận tốc rơi xuống của move_target. Tạo tập lệnh C # mới có tên là MoveTarget.
 Thêm dòng code sau vào function “start” để điều chỉnh vận tốc ban đầu.
void Start ()
{
    GetComponent ().velocity = Vector2.down * 10;
}



Trong đoạn code trên, chúng ta truy cập vào thành phần Rigidbody2D của đối tượng được liên kết với tập lệnh này (đây sẽ là mục tiêu di động), sau đó đặt vận tốc rơi xuống của đối tượng.

Bây giờ bạn có thể lưu tập lệnh của mình, kiểm tra xem nó không có lỗi và kéo và thả tập lệnh vào prefab có tên là move_target.

Để chúng tôi có thể kiểm tra cảnh, vui lòng kéo và thả prefab move_target vào chế độ xem Cảnh và phát cảnh, bạn sẽ thấy mục tiêu cụ thể này di chuyển xuống dưới.



Thursday, September 19, 2019

[Unity][Game 2D][Bài 1] Hướng dẫn tạo 1 game bắn súng 2D đơn giản với Unity

Tạo game mobile bắn súng 2D bằng phần mềm Unity.



Biên dịch và soạn thảo: TrongTran


Giới thiệu

Trong bài này, mình sẽ hướng dẫn các bạn cách tạo một game bắn súng 2D bằng phần mềm Unity.

Dưới đây là một số kỹ năng mà bạn sẽ học được bao gồm:

  • Tạo các sprites
  • Khởi tạo các đối tượng.
  • Thêm và sử dụng các thành phần vật lý Rigidbody cho các đối tượng 2D.
  • Đặt một lực lên một đối tượng.



II. Tạo đối tượng tàu vũ trụ

Trong phần này, mình sẽ tạo 1 tàu vũ trụ đơn giản. Nó là một sprite mà chúng ta sẽ có thể di chuyển theo bốn hướng bằng các phím mũi tên trên bàn phím: trái, phải, lên và xuống.

Bắt đầu nào.


Đầu tiên bạn khởi chạy phần mềm Unity và tạo dự án mới như bên dưới nhé:





Trong cửa sổ tạo project, bạn có thể đặt tên dự án, vị trí lưu dự án, cũng như chế độ 2D (vì trò chơi này sẽ là 2D).



Sau đó, bạn nhấp vào nút “Create objects” (ở dưới cùng của cửa sổ) và Unity sẽ chuyển sang màn hình làm việc.



 Sau khi chuyển sang màn hình làm việc, bạn có thể kiểm tra xem chế độ 2D có được kích hoạt hay không, dựa trên logo 2D nằm ở góc trên cùng bên phải của “Scene”.

Tiếp theo mình sẽ tạo 1 sprite cho tàu vũ trụ. Trong ví dụ này mình làm đơn giản với 1 hình tam giác. Thường thì bạn sẽ dùng các phần mềm đồ hoạ nhưng trong bài này mình chỉ dùng hình tam giác cho nó nhanh.
Từ cửa sổ “Project”, Mình chọn [ Create | Sprites | Triangle] như trong hình bên dưới:



Với thao tác này, mình đã tạo ra 1 hình tam giác trong cửa số “Project”.

Bạn có thể kéo và thả sprite này (tức là, đối tượng màu trắng có hình tam giác) từ cửa sổ Project sang cửa sổ Scene; điều này sẽ tạo ra một đối tượng mới gọi là Triangle trong cửa sổ hierarchy.

               

Trong hình bên trên, bạn có thể nhận thấy các dòng trắng ở dưới cùng và bên trái màn hình; đây là những ranh giới xác định những gì sẽ hiển thị trên màn hình; vì vậy bằng cách thả đối tượng của bạn trong các dòng này, bạn đảm bảo rằng người chơi sẽ được nhìn thấy (hoặc bị tắt) bởi camera.

Để đổi tên đối tượng từ Triangle thành player, bạn có thể nhấp chuột phải vào nó trong cửa sổ Hierarchy, sau đó chọn rename để đổi tên đối tượng thành “player”.

Hiện tại, chúng ta có một player (tức là hình tam giác mà bạn xem như là tàu vũ trụ) và chúng ta sẽ cần di chuyển nó theo các phím được nhấn trên bàn phím; Để làm được điều này ta cần viết script cho đối tượng player.

 Chúng ta sẽ tiến hành code với ngôn ngữ C # bằng cách chọn [ Create | C # script] từ cửa sổ và đổi tên tập lệnh này thành MovePlayer.

 Sau đó, ta mở tập lệnh này và thêm đoạn mã sau vào trong function “update” (phần in đậm màu xanh là phần bạn cần thêm vào):


void Update ()
{
if (Input.GetKey (KeyCode.LeftArrow))
     {
          gameObject.transform.Translate (Vector3.left * 0.1f);
     }
     if (Input.GetKey (KeyCode.RightArrow))
     {
          gameObject.transform.Translate (Vector3.right * 0.1f);
     }
     if (Input.GetKey (KeyCode.UpArrow))
     {
          gameObject.transform.Translate (Vector3.up * 0.1f);
     }
     if (Input.GetKey (KeyCode.DownArrow))
     {
          gameObject.transform.Translate (Vector3.down * 0.1f);
     }
}


Mình sẽ giải thích một số chức năng của đoạn code bên trên như sau:


Mình sử dụng function “Update” để kiểm tra đầu vào từ bàn phím.

Nếu mũi tên bên trái được nhấn, đối tượng player (tức là tàu vũ trụ) sẽ dịch sang bên trái (tức là 0,1 mét sang bên trái).

Nếu mũi tên phải được nhấn, đối tượng player (tức là tàu vũ trụ) sẽ dịch sang phải (tức là 0,1 mét sang phải).

** Lưu ý rằng mình sử dụng chức năng GetKey để kiểm tra xem phím được nhấn; tuy nhiên, nếu bạn muốn kiểm tra xem một Key đã được phát hành hay chưa thì bạn có thể sử dụng chức năng GetKeyDown thay thế. **

Bây giờ bạn có thể lưu tập lệnh, kiểm tra xem có bất kỳ lỗi nào trong cửa sổ bảng điều khiển hay không. Sau đó liên kết tập lệnh (tức là kéo và thả tập lệnh) đến đối tượng player” (Hình tam giác) trong cửa sổ hierarchy. Một khi điều này được thực hiện, bạn có thể chạy mô phỏng và kiểm tra xem bạn có thể di chuyển player sang trái và phải hay không. Sau khi nhấn các phím mũi tên trên bàn phím, bạn sẽ thấy tàu vũ trụ di chuyển theo bốn hướng.

Lưu ý rằng để bật hoặc tắt mô phỏng, bạn có thể nhấn phím tắt CTRL + P hoặc sử dụng hình tam giác màu đen nằm ở đầu cửa sổ.

III. Tạo hiệu ứng tên lửa nhả đạn


Trong phần này, Mình sẽ hướng dẫn bạn cách làm cho tên lửa có thể bắn ra được đạn. Có nghĩa là mỗi khi bạn nhấn nút “Space” (Nút khoảng trắng) thì tên lửa sẽ bắn ra 1 viên đạn.
Chúng ta cần thực hiện các bước sau:
Tạo một đối tượng tên lửa.
Lưu đối tượng này dưới dạng prefab (tức là mẫu).
Phát hiện khi nút “Space” được nhấn.
Khởi động prefab tên lửa và thêm vận tốc cho nó để nó di chuyển lên khi bắn.

Đầu tiên, hãy tạo một đối tượng mới cho tên lửa:


Tại cửa sổ Project,
Mình sẽ tạo một sprite hình tròn (Create | Sprites | Circle) và đổi tên thành “bullet”.


Sau khi tạo một sp
rite hình tròn , mình sẽ kéo và thả vào cửa sổ hierarchy, điều này sẽ tạo ra một đối tượng mới gọi là “bullet”.



Sử dụng Scale, Mình scale bullet thành (0,1; 0,1; 0,1) nhằm giảm kích thước của viên đạnỞ đây mình không quan trọng vị trí của đối tượng. 

Thêm một thành phần Rigidbody2D vào đối tượng này (
Components | Physics2D | Rigidbody2D) từ menu trên cùng và đặt thuộc tính Gravity Scale của thành phần này (tức là Rigidbody2D) thành 0, như được minh họa trong hình tiếp theo.



Bằng cách thêm một thành phần Rigidbody2D vào đối tượng này, chúng ta sẽ đảm bảo rằng có thể áp dụng lực cho đối tượng hoặc sửa đổi vận tốc của đối tượng; điều này đang được nói, bởi vì chúng ta có chế độ xem từ trên xuống, chúng ta không muốn vật thể này bị ảnh hưởng bởi trọng lực (nếu không nó sẽ rơi xuống) và đây là lý do tại sao chúng ta đặt thuộc tính Gravity Scale thành 0 cho đối tượng này.

Bây giờ chúng ta có thể chuyển đổi viên đạn này thành một prefab bằng cách kéo và thả đối tượng này (tức là, viên đạn) vào Scene.



Sau đó, bạn có thể xóa đối tượng bullet khỏi cửa sổ hierarchy.

Cuối cùng nhưng không kém phần quan trọng, chúng ta cần code cho player để khởi tạo và đẩy viên đạn này nếu người chơi nhấn phím cách.

Mình tiếp tục mở script ban đầu tên MovePlayer.
Thêm mã sau vào đầu tập lệnh (mã mới in đậm).


public class MovePlayer : MonoBehaviour
{
public GameObject bullet;

thêm mã sau vào hàm “Update”:



if (Input.GetKeyDown (KeyCode.Space))
{
GameObject b = (GameObject)(Instantiate (bullet, transform.position + transform.up*1.5f, Quaternion.identity));
b.GetComponent<Rigidbody2D> ().AddForce (transform.up * 1000);
}

Trong đoạn code trên:
Mình đã tạo một GameObject mới. GameObject này được gọi là “bullet”. Nếu người chơi nhấn nút “Space”, viên đạn mới sẽ ngay lập tức xuất hiện phía trên tàu vũ trụ. Sau đó chúng tôi thêm một lực hướng lên vào viên đạn để nó bắt đầu di chuyển lên trên.
Bây giờ bạn có thể lưu tập lệnh của mình và kiểm tra xem nó có bị lỗi trong cửa sổ Console không.
Nếu bạn nhấp vào đối tượng “player” trong cửa sổ hierarchy và nếu bạn nhìn vào cửa sổ mô phỏng, bạn sẽ thấy rằng một trường mới gọi là Bullet đã xuất hiện cho thành phần MovePlayer.
Bây giờ bạn kéo và thả prefab được gọi là “bullet” vào trường này.




Khi điều này được thực hiện, bạn có thể bật mô phỏng và kiểm tra xem sau khi nhấn nút “Space”, “player” có thể bắn ra một viên đạn.




Wednesday, September 18, 2019

Hướng dẫn cách dịch một file định dạng pdf hoặc excel sang tiếng việt mà không làm thay đổi định dạng format của file


Tác giả: TrongTran
Ngày: 18/09/2019


Hẳn các bạn đã từng dùng google dịch rất nhiều tài liệu để học hỏi. Nếu bạn muốn hiểu sâu thì bạn nên đọc các tài liệu về tiếng anh và trong bài này mình sẽ hướng dẫn bạn cách dịch 1 tài liệu định dạng pdf hoặc excel mà không làm thay đổi định dạng của chúng.

Nghĩa là trước khi dịch tài liệu tiếng anh có format như thế nào thì sau khi dịch file tiếng việt sẽ có format như vậy.

Ngoài ra, chúng ta còn có thể dịch nhiều thứ tiếng khác nhau không chỉ đơn giản là từ tiếng anh sang tiếng việt. Chẳng hạn tiếng trung sang tiếng việt, Tiếng nhật sang tiếng anh,…

Mình lấy ví dụ:

Đây là file pdf chúng ta cần chuyển:




Đây là file pdf kết quả:


 Bắt đầu thui nào.

Các bạn truy cập trang








Tại trang này bạn có rất nhiều ứng dụng chẳng hạn:
  • Chuyển PDF sang WORD
  • Chia file PDF thành nhiều file nhỏ.
  • Dịch tài liệu.


Tại trang này bạn chọn Translator như hình vẽ:



 Cửa sổ mới hiện ra bạn chọn “Upload file” hoặc là kéo thả file cần dịch vào cửa sổ như hình dưới:


Sau khi cửa sổ mới hiện ra bạn chọn ngôn ngữ cần dịch và ngôn ngữ bạn muốn dịch sang trong ô màu đỏ và nhấn nút "Translate" trong ô màu xanh.




Bạn cần đợi 1 vài giây trước để quá trình hoàn tất. Ô màu đỏ thể hiện số từ trong file đã được dịch thành công.



Ô màu xanh là nơi bạn có thể download kết quả về máy.


Đây là kết quả với file pdf:





Dưới đây là video hướng dẫn bạn có thể tham khảo nhé:




Tuesday, September 17, 2019

[Design][Thiết kế CPU 32 bit] [Bài 3] Tìm hiểu datapath và cấu trúc của các câu lệnh nhóm R-format (ADD, SUB, OR, XOR,SLL…) trong thiết kế RISC-V

Tác giả: TrongTran
Ngày: 17/09/2019

Tài liệu tham khảo: www-inst.eecs.berkeley.edu/~cs61c/fa18/img/riscvcard.pdf và tài liệu học tập từ trường đại học Bách Khoa TP.HCM (Bộ môn Điện-Điện tử).


Đây là một bài nằm trong chuỗi bài hướng dẫn thiết kế 1 CPU RISC-V 32 bit.

Như các bạn đã biết, trong bài trước mình đã hướng dẫn chi tiết về tập lệnh assembly trong thiết kế RISC-V 32 bit (http://trongtranrvc.blogspot.com/2019/09/designthiet-ke-cpu-32-bit-bai-2-tim.html).


Trong bài này, Mình sẽ đi vào phân tích chi tiết cấu trúc cơ bản của 1 RISC-V 32 bit đơn chu kì.

Các bạn lưu ý cấu trúc trong bài này chỉ dành riêng cho các câu lệnh “add, sub, and, or ,xor, sll, srl, sra, slt”. 
Các câu lệnh khác mình sẽ nói trong bài tiếp theo.


Nhóm lệnh trên còn gọi là nhóm lệnh R-Format.

Vì chúng ta đang thiết kế RISC-V 32 bit nên một câu lệnh mã máy hoàn chỉnh sẽ có 32 bit.

Cú pháp nhóm câu lệnh R-format là:

                               instruction rd, rs1, rs2

Trong đó “instruction”: là các lệnh “add, or, xor….” trong bảng trên.
rd, rs1, rs2 : là các thanh ghi.

Với các câu lệnh trên, hệ thống của chúng ta sẽ thực hiện 2 tác vụ đó là:

  • Reg[rd] = Reg[rs1] xxx Reg[rs2]
  • PC = PC + 4

Trong đó xxx là một phép tính +/-/&/|/^/… tuỳ vào mã lệnh mà ta sẽ có phép tính thích hợp.

Như vậy ta có cấu trúc của 1 RISC-V cho nhóm câu lệnh R-format như bên dưới:




Đầu tiên mình sẽ giải thích cơ bản từng khối trong hình như sau:

Khối IMEM

IMEM là khối memory chứa đoạn mã máy cần thực thi (1 chương trình nào đó chẳng hạn).
Ví dụ:

100011….0  // PC = 0 với 8 bit data (8 bit 0/1 trên 1 hàng)
000111….0  // PC = 1 với 8 bit data
….
000111….1  // PC = n với 8 bit data

Như vậy khi ghép từ “PC = 0” đến “PC = 3”, Ta được 1 câu lệnh 32 bit hoàn chỉnh (Mỗi dòng PC có 8 bit data, 4 dòng là 8x4 = 32 bit data).

Câu lệnh tiếp theo là PC + 4, PC + 8….v..v.

Một định dạng khác của IMEM đó là:

000……1 // PC = 0 với 32 bit data (32 bit 0/1 trên 1 hàng)
100……0 // PC = 4 với 32 bit data

Điều này vẫn giống cách định nghĩa ở trên tuy nhiên mỗi dòng sẽ có 32 bit.

Nhiệm vụ chính của khối IMEM này đó là chứa đoạn lệnh cần thực thi.

Input của khối IMEM:

  • Giá trị của PC (0/4/8/12/…, tóm lại nên là bội của 4).


Output của khối IMEM là:

  • Đoạn mã máy 32 bit.


Đoạn mã này sẽ đi vào 2 khối đó là khối REG và khối CONTROL LOGIC.

Khối REG

Khối REG là khối chứa các giá trị của 32 thanh ghi từ R0 -> R31. 
Chức năng chính của khối này đó là:

  • Đọc giá trị của thanh ghi rs1/rs2 và output đến khối ALU.
  • Ghi giá trị vào thanh ghi rd.


Input: 

  • inst[11:7] tên thanh ghi rd.

Ví dụ inst[11:7] = 5’b10000 = 16. Nghĩa là ta đang truy cập vào thanh ghi x16 trong bộ 32 thanh ghi.

  • DataD[31:0] là giá trị cần ghi vào thanh ghi rd bên trên.

  • inst[19:15] tên thanh ghi rs1.
  • inst[24:20] tên thanh ghi rs2.


Output:

  • Có 2 output đó là giá trị chứa trong 2 thanh ghi rs1, rs2.


Khối REG sẽ output 2 tín hiệu đó là Reg[rs1] và Reg[rs2] là giá trị chứa trong 2 thanh ghi rs1 và rs2 vào bộ ALU.


Khối CONTROL LOGIC

Khối CONTROL LOGIC là khối điều khiển toàn bộ hệ thống. Dựa vào 1 lệnh mã máy để output các giá trị điều khiển cho các khối khác.

Input:

  • Là toàn bộ 32 bit từ khối IMEM vào.


Output:

  • Là các tín hiệu điều khiển các khối khác.


Bộ ALU


Khối ALU là bộ xử lí trung tâm thực hiện các phép toán. 

Input:

  • Reg[rs1] là giá trị chứa trong thanh ghi rs1.
  • Reg[rs2] là giá trị chứa trong thanh ghi rs2.
  • Tín hiệu điều khiển ALUSel : ALU nhận tín hiệu điều khiển từ khối CONTROL LOGIC để thực hiện các phép toán như add/sub/or/xor ..v..v.


Output:

  • Giá trị kết quả ngõ ra của khối ALU.
  • Giá trị này sẽ được nối vào chân DataD của khối REG. Tại đây tín hiệu RegWEn sẽ bằng 1 nghĩa là DataD[31:0] sẽ được ghi vào thanh ghi rd.


Mình tóm lại như sau:


  • Lúc bắt đầu PC = 0 và gửi giá trị PC = 0 vào khối IMEM.
  • Khối IMEM sẽ output ra một lệnh mã máy 32 bit tại địa chỉ PC = 0.


  • Lệnh mã máy này sẽ được nối đến 2 khối:
  • Các bit từ [11:7] (thanh ghi rd) , [19:15] (thanh ghi rs1) , [24:20] (thanh ghi rs2) của câu lệnh  mã máy sẽ đi vào khối REG.



  • Đồng thời toàn bộ 32 bit này sẽ đi vào khối control logic. 
  • Các giá trị trong thanh ghi rs1 và rs2 được output từ khối REG sẽ đi vào khối ALU.



  • Tại đây khối ALU sẽ cộng/trừ/or/xor/.. 2 giá trị đó lại và gửi kết quả ngược lại khối REG để lưu vào thanh ghi rd.



  • Lúc này tín hiệu PC sẽ bằng PC + 4 và vòng ngược lại chân input của khối PC.


Như vậy, chúng ta đã tìm hiểu cấu trúc của RISC-V cho các câu lệnh nhóm R-Format.

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 ...