ผลต่างระหว่างรุ่นของ "Com sys lab/testing ALU"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 11 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 4: แถว 4:
  
 
== Latch ==
 
== Latch ==
 +
สร้าง module <tt>latch4</tt> ที่มี port ดังนี้:
 +
 +
* sc_in<sc_uint<4> > a;
 +
* sc_out<sc_uint<4> > b;
 +
* sc_in_clk clk;
 +
 +
โดย latch จะเปลี่ยนค่า output b ให้เท่ากับ input a เมื่อ clk เปลี่ยนค่าจาก 0 -> 1 (positive edge triggered)  นอกจากนี้ใน module ให้เพิ่ม method get และ set สำหรับอ่านและเขียนค่า b โดยตรงด้วย (เพื่อเป็นการตั้งค่าเริ่มต้น)
 +
 +
'''Hint:''' ในการเลือก positive edge trigger นั้น ตอนใส่ clk ใน sensitive ให้ใส่ clk.pos() แทน
 +
 +
'''หมายเหตุ:''' ที่ลงท้ายว่า 4 เพราะจะเป็น latch 4 บิต (ในงานถัด ๆ ไปจะต้องทำ latch 8 บิตด้วย สำหรับ program counter)
 +
 +
จากนั้นให้นำ latch ไปต่อกับ ALU เพื่อทดสอบการทำงาน โดยมีแผนภาพการเชื่อมต่อดังนี้ (ด้านล่างเป็นตัวอย่างการทดสอบ op = 0 (add) )
 +
 +
<pre>
 +
    +-------+        +-------+
 +
+->| LATCH |------->|a    c|------+
 +
|  |      |        |  ALU  |      |
 +
|  +-------+    1-->|b  op |      |
 +
|    |            +-------+      |
 +
|    clk                  |        |
 +
|                        0        |
 +
+----------------------------------+
 +
</pre>
 +
 +
ด้านล่างเป็นตัวอย่าง signal ที่ควรเห็น (y=1 เอาหนึ่งไปบวกตลอด; ผลลัพธ์อยู่ที่ z)  ควรเพิ่ม signal ของ zero flag ด้วย
 +
 +
[[Image:Systemc-alu-latch.png‎]]
 +
 +
'''อ่านเพิ่มเติม''':
 +
 +
* [http://www.asic-world.com/systemc/process1.html การตั้ง edge และ level sensitive]
 +
* [http://www.asic-world.com/systemc/ports_signals6.html การใช้งาน clock]
  
 
== Register file ==
 
== Register file ==
 +
เราได้เตรียม module register_file ไว้แล้ว (อยู่ตอนท้าย) ภายในจะเก็บ register ขนาด 4 บิต จำนวน 8 ตัว (หมายเลข 0 - 7) โดยมี port ดังนี้
 +
 +
<pre>
 +
        +-------------------+
 +
      -|reg0          data0|-
 +
      -|reg1          data1|-
 +
        |                  |
 +
      -|regw0              |
 +
      -|dataw0            |
 +
      -|write_enabled      |
 +
        |        clk      |
 +
        +-------------------+
 +
                  |
 +
</pre>
 +
 +
การทำงาน
 +
 +
* reg0 และ reg1 จะระบุหมายเลข register ที่ต้องการอ่าน ค่าของ register จะส่งออกมาที่ data0 และ data 1  ส่วนนี้เป็น level sensitive
 +
* ในการเขียน จะเป็น positive edge triggered (ด้วย clk) โดยถ้า write_enabled = 1 แล้ว จะเขียนค่า dataw0 ลงไปยัง register หมายเลข regw0  (เขียนเสร็จ ถ้ามีการอ่านค่า register นั้นอยู่ ก็จะมีการอัพเดททันที)
 +
 +
'''งานของคุณ''' นำ register file ไปใช้แทน latch ให้เขียนและอ่านกับ register หมายเลข 0
 +
 +
=== ไฟล์ registers.h ===
 +
<syntaxhighlight lang="cpp">
 +
#ifndef REGISTERS_H_INCLUDED
 +
#define REGISTERS_H_INCLUDED
 +
 +
#include "systemc.h"
 +
 +
SC_MODULE(register_file) {
 +
  sc_in_clk clk;
 +
 +
  sc_in<sc_uint<3> > reg0;
 +
  sc_in<sc_uint<3> > reg1;
 +
 +
  sc_out<sc_uint<4> > data0;
 +
  sc_out<sc_uint<4> > data1;
 +
 +
  sc_in<sc_uint<3> > regw0;
 +
  sc_in<sc_uint<4> > dataw0;
 +
  sc_in<bool> write_enabled;
 +
 +
  sc_uint<4> registers[8];
 +
 +
  void load(sc_int<4> data[8]) {
 +
    for(int i=0; i<8; i++)
 +
      registers[i] = data[0];
 +
    process_read();
 +
  }
 +
 +
  sc_uint<4> get(int r) {
 +
    return registers[r];
 +
  }
 +
 +
  sc_uint<4> set(int r, sc_uint<4> val) {
 +
    registers[r] = val;
 +
  }
 +
 +
  void process_read() {
 +
    data0.write(registers[reg0.read()]);
 +
    data1.write(registers[reg1.read()]);
 +
  }
 +
 +
  void process() {
 +
    if(clk.posedge()) {
 +
      if(write_enabled.read()) {
 +
        registers[regw0.read()] = dataw0.read();
 +
      }
 +
    }
 +
    process_read();
 +
  }
 +
 
 +
  SC_CTOR(register_file) {
 +
    SC_METHOD(process);
 +
    sensitive << clk.pos();
 +
    sensitive << reg0 << reg1;
 +
  }
 +
};
 +
#endif
 +
</syntaxhighlight>

รุ่นแก้ไขปัจจุบันเมื่อ 00:57, 24 มิถุนายน 2559

จากวิชา com sys lab

ในส่วนนี้เราจะหัดใช้ latch เพื่อทดสอบ ALU จากนั้นเราจะลองนำ ALU มาต่อกับ register file (มีให้) เพื่อทดลองส่งสัญญาณควบคุมการทำงานของระบบ

Latch

สร้าง module latch4 ที่มี port ดังนี้:

  • sc_in<sc_uint<4> > a;
  • sc_out<sc_uint<4> > b;
  • sc_in_clk clk;

โดย latch จะเปลี่ยนค่า output b ให้เท่ากับ input a เมื่อ clk เปลี่ยนค่าจาก 0 -> 1 (positive edge triggered) นอกจากนี้ใน module ให้เพิ่ม method get และ set สำหรับอ่านและเขียนค่า b โดยตรงด้วย (เพื่อเป็นการตั้งค่าเริ่มต้น)

Hint: ในการเลือก positive edge trigger นั้น ตอนใส่ clk ใน sensitive ให้ใส่ clk.pos() แทน

หมายเหตุ: ที่ลงท้ายว่า 4 เพราะจะเป็น latch 4 บิต (ในงานถัด ๆ ไปจะต้องทำ latch 8 บิตด้วย สำหรับ program counter)

จากนั้นให้นำ latch ไปต่อกับ ALU เพื่อทดสอบการทำงาน โดยมีแผนภาพการเชื่อมต่อดังนี้ (ด้านล่างเป็นตัวอย่างการทดสอบ op = 0 (add) )

    +-------+        +-------+
 +->| LATCH |------->|a     c|------+
 |  |       |        |  ALU  |      |
 |  +-------+    1-->|b   op |      |
 |     |             +-------+      |
 |    clk                  |        |
 |                         0        |
 +----------------------------------+

ด้านล่างเป็นตัวอย่าง signal ที่ควรเห็น (y=1 เอาหนึ่งไปบวกตลอด; ผลลัพธ์อยู่ที่ z) ควรเพิ่ม signal ของ zero flag ด้วย

Systemc-alu-latch.png

อ่านเพิ่มเติม:

Register file

เราได้เตรียม module register_file ไว้แล้ว (อยู่ตอนท้าย) ภายในจะเก็บ register ขนาด 4 บิต จำนวน 8 ตัว (หมายเลข 0 - 7) โดยมี port ดังนี้

        +-------------------+
       -|reg0          data0|-
       -|reg1          data1|-
        |                   |
       -|regw0              |
       -|dataw0             |
       -|write_enabled      |
        |         clk       |
        +-------------------+
                   |

การทำงาน

  • reg0 และ reg1 จะระบุหมายเลข register ที่ต้องการอ่าน ค่าของ register จะส่งออกมาที่ data0 และ data 1 ส่วนนี้เป็น level sensitive
  • ในการเขียน จะเป็น positive edge triggered (ด้วย clk) โดยถ้า write_enabled = 1 แล้ว จะเขียนค่า dataw0 ลงไปยัง register หมายเลข regw0 (เขียนเสร็จ ถ้ามีการอ่านค่า register นั้นอยู่ ก็จะมีการอัพเดททันที)

งานของคุณ นำ register file ไปใช้แทน latch ให้เขียนและอ่านกับ register หมายเลข 0

ไฟล์ registers.h

#ifndef REGISTERS_H_INCLUDED
#define REGISTERS_H_INCLUDED

#include "systemc.h"

SC_MODULE(register_file) {
  sc_in_clk clk;

  sc_in<sc_uint<3> > reg0;
  sc_in<sc_uint<3> > reg1;

  sc_out<sc_uint<4> > data0;
  sc_out<sc_uint<4> > data1;

  sc_in<sc_uint<3> > regw0;
  sc_in<sc_uint<4> > dataw0;
  sc_in<bool> write_enabled;

  sc_uint<4> registers[8];

  void load(sc_int<4> data[8]) {
    for(int i=0; i<8; i++)
      registers[i] = data[0];
    process_read();
  }

  sc_uint<4> get(int r) {
    return registers[r];
  }

  sc_uint<4> set(int r, sc_uint<4> val) {
    registers[r] = val;
  }

  void process_read() {
    data0.write(registers[reg0.read()]);
    data1.write(registers[reg1.read()]);
  }

  void process() {
    if(clk.posedge()) {
      if(write_enabled.read()) {
        registers[regw0.read()] = dataw0.read();
      }
    }
    process_read();
  }
  
  SC_CTOR(register_file) {
    SC_METHOD(process);
    sensitive << clk.pos();
    sensitive << reg0 << reg1;
  }
};
#endif