ผลต่างระหว่างรุ่นของ "Com sys lab/testing ALU"
Jittat (คุย | มีส่วนร่วม) (หน้าที่ถูกสร้างด้วย ': ''จากวิชา com sys lab'' ในส่วนนี้เราจะหัดใช้ latch เพื่อทด...') |
Jittat (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 12 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 2: | แถว 2: | ||
ในส่วนนี้เราจะหัดใช้ latch เพื่อทดสอบ ALU จากนั้นเราจะลองนำ ALU มาต่อกับ register file (มีให้) เพื่อทดลองส่งสัญญาณควบคุมการทำงานของระบบ | ในส่วนนี้เราจะหัดใช้ latch เพื่อทดสอบ ALU จากนั้นเราจะลองนำ ALU มาต่อกับ register file (มีให้) เพื่อทดลองส่งสัญญาณควบคุมการทำงานของระบบ | ||
+ | |||
+ | == 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 == | ||
+ | เราได้เตรียม 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 ด้วย
อ่านเพิ่มเติม:
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