ผลต่างระหว่างรุ่นของ "Com sys lab/testing ALU"
Jittat (คุย | มีส่วนร่วม) (→Latch) |
Jittat (คุย | มีส่วนร่วม) |
||
| (ไม่แสดง 5 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
| แถว 10: | แถว 10: | ||
* sc_in_clk clk; | * 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 ไปต่อกับ ALU เพื่อทดสอบการทำงาน โดยมีแผนภาพการเชื่อมต่อดังนี้ (ด้านล่างเป็นตัวอย่างการทดสอบ op = 0 (add) ) | ||
| แถว 31: | แถว 33: | ||
[[Image:Systemc-alu-latch.png]] | [[Image:Systemc-alu-latch.png]] | ||
| − | '''อ่านเพิ่มเติม''': [http://www.asic-world.com/systemc/ports_signals6.html การใช้งาน clock] | + | '''อ่านเพิ่มเติม''': |
| + | |||
| + | * [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 ด้วย
อ่านเพิ่มเติม:
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
