Summary: This exercise introduces the hardware and software used in the course. By the end of this module, you should be comfortable with the basics of testing a simple real-time DSP system with Code Composer Studio, the debugging environment we will be using throughout the semester. First you will connect the laboratory equipment and test a real-time DSP system with provided code to implement an eight-tap (eight coefficient) finite impulse response (FIR) filter. With a working system available, you will then begin to explore the debugging software used for downloading, modifying, and testing your code. Finally, you will create a filter in MATLAB and use test vectors to verify the DSP's output.
Example Hardware Setup![]() รูป 1 |
DOS promptบนวินโดว์และสร้างไดเรคทอรี่ใหม่เพื่อเก็บไฟล์ หลังจากนั้นให้ทำสำเนาไฟล์ filter.asm, coef1.asm, coef2.asm, core.asm, และ vectcore.asm ลงในไดเรคทอรี่นั้น
coef1.asm ให้เป็นชื่อ
"coef.asm" และรวบรวมโค้ดตัวกรองเข้าโดยการพิมพ์
asm filter บน DOS prompt.
ขั้นตอนแรกในการรวบรวมนั้นรวมสัมปสิทธิ์ (coefficients) ของวงจรกรองแบบที่มีผลตอบสนองอิมพัลส์จำกัด (ซึ่งเก็บไว้ที่ coef.asm) iเข้าไปใน ไฟล์ filter.asm, แล้วก็ทำการคอมไพล์ผลเพื่อสร้างไฟล์เอาท์พุทที่มี ไบนารี่โค้ดที่พร้อมปฏิบัติการได้ในรูปของไฟล์ชื่อ filter.out. Reset จากรายการ Debug ในแอพพลิเคชั่นของ Code Composer
CPU
Registers จากรายการ View แล้วเลือก CPU Register. การทำเช่นนี้เพื่อเป็นการเปิดหน้าต่างย่อยที่ด้านล่างของหน้าต่างแอพพลิเคชั่นของ Code Composer ที่แสดง DSP registers ต่างๆ ตรวจสอบที่ PMST register ว่ามีค่าฐารสิบหกเป็น FFE0 เพื่อให้ บอร์ดDSP ทำงานได้อย่างถูกต้อง ถ้าค่าไม่เป็นอย่างดังกล่าวนั้นให้เปลี่ยนค่า PMST
register โดยการคลิ้กสองครั้งบนค่าที่ตั้งไว้และเปลี่ยนเป็นค่าที่ถูกต้องในหน้าต่าง Edit Register
ที่แสดงขึ้นมา
Load Program จากรายการ
File ในท้ายสุดให้ติดตั้งค่า DSP ใหม่ และสั้งปฎิบัติการโค้ดโดยเลือกRun จากรายการ
Debug menu.
coef2.asm. ทำสำเนาของ
coef2.asm และเปลี่ยนชื่อเป็น coef.asm.
asm prompt และทำตามขั้นตอนซ้ำอีกครั้งโดยการประมวลผลด้วยโค้ดจากขั้นตอนที่4 Step 4.
freqz ใน MATLAB
coef.asm จะทำการเก็บสัมปสิทธิ์ของวงจรกรองแบบที่มีผลตอบสนองอิมพัลส์จำกัดนั้นซึ่งจะบันทึกในหน่วยความจำบน DSP
เริ่มจากตำแหน่ง (ฐานสิบหก) 0x1000และแต่ละตัวกรองที่ได้กระทำการแอสเซมบลีและประมวลผลแล้วจะมีสัมปสิทธิ์แปดตัว ในการดูสัมปสิทธิ์ของตัวกรองในรูปแบบของจำนวนเต็มที่มีเครื่องหมายนั้นให้เลือกรายการ Memory จากรายการ
View เพื่อเปิดรายการ Memory Window
Options หลังจากนั้นให้เปลี่ยนค่าที่อยู่ตัวแปลเป็น 0x1000 และเปลี่ยนค่าเป็น
16-Bit Signed Intคลิ้ก OK เพื่อเปิดหน้าต่างหน่วยความจำที่แสดงค่าที่อยู่ของความจำต่างๆซึ่งจะแสดงอยู่ด้านซ้ายมือ
0x1000 และตัวสัปสิทธิ์ตัวแรกซึ่งก็คือ
0x1007.
freqz ใน MATLAB เพื่อจะดูการตอบสนองของตัวกรอง ในการใช้คำสั่งนี้ผู้ใช้ต้องสร้างเวคเตอร์ของสัมปสิทธิ์ขึ้นใน MATLAB ตัวอย่างเช่นในกรณีวิเคราะห์ตัวกรองชนิด three-tap ที่มีค่าสัมปสิทธิ์ -10,20,-10 จะสามารถใช้คำสั่งทาง MATLAB ดังต่อไปนี้
h = [-10, 20, -10];plot(abs(freqz(h)))0x1000 ถึง
0x1007 ลงในค่าสัมปสิทธิ์
h = gen_filt; จากนั้นให้ทำการบันทึกค่าเวคเตอร์ของสัมปสิทธิ์ตัวกรองด้วยการพิมพ์คำสั่ง
save_coef('coef.asm',flipud(h));โดยอย่าลืมตรวจให้แน่ใจว่าไฟล์นั้นถูกบันทึกอยู่ที่ไดเรคทอรี่ของคุณ (script ที่กระทำฟังก์ชันดังกล่าวนั้นคือ gen_filt.m และsave_coef.m.)
coef.asm. โปรดระวังว่าค่าของเวคเตอร์สัมปสิทธิ์ที่ถูกบันทึกนั้นจะถูกกลับลำดับ นั่นคือ ค่าของสัมปสิทธิ์
0x1000
จนถึง 0x1007 นั้นลำดับจะถูกลับ
0x1000 ถึง
0x1007 นั้นมีการเปลี่ยนแปลง
0x1000 จนถึง 0x1007 เพื่อให้สอดคล้องกับตัวกรอง
sweep (available as sweep.m) ที่เคลื่อนที่ข้ามช่วงของความถี่ จากนั้นให้ใช้ฟังก์ชัน
save_test_vector (available as save_test_vector.m ให้ทำการบันทึกใส่ในไฟล์ที่จะนำไปใช้ต่อในส่วนของการทำ DSP
>> t=sweep(0.1*pi,0.9*pi,0.25,500); % Generate a frequency sweep
>> save_test_vector('testvect.asm',t); % Save the test vector
conv ของ MATLAB ในการจำลองผลของการทำ filter sweep ด้วย filter
gen_filt ก่อนหน้านี้ ให้สังเกตว่านี่เป็นขั้นตอนในการสร้างเวคเตอร์ที่มีขนาด 507 (โดยที่
>> out=conv(h,t) % Filter t with FIR filter h >> out=out(1:500) % Keep first 500 elements of out
filter.asm เพื่อที่จะใช้ “test_vector” จาก core file vectcore.asm. แทนที่จะรับข้อมูลจาก A/D converter แล้วส่งข้อมูลผลลัพธ์ไปให้ D/A Core file จะรับ input และบันทึก output ไปที่หน่วยความจำของ DSP โดยที่ test vector นั้นจะถูกเก็บอยู่ที่ evaluation board ของ DSP ซึ่งจะไม่ยุ่งเกี่ยวกับในส่วนของโปรแกรมและข้อมูลอื่น
.etext สามารถหาข้อมูลเพิ่มเติมในส่วนของการแบ่งหน่วยความจำของ DSP รวมทั้งการทำ memory mapping ได้จาก Core File: Introduction to Six-Channel
Board for TI EVM320C54 filter.asm. โดย assembly source นั้นเป็นเพียง text ไฟล์ ที่คุณสามารถทำการ edit ได้โดยใช้ editor ตามที่คุณต้องการ เช่น WordPad, Emacs, และ VI โดยทำการแก้ที่บรรทัดแรกของไฟล์จาก
.copy "core.asm"
.copy "testvect.asm" .copy "vectcore.asm"
.copy นั้นจะต้องใส่ directive
Halt ที่อยู่ภายใต้
Debug menu) จากนั้นให้ตรวจดูว่า DSP ได้หยุดทำงานที่ branch statement ที่ branch ไปที่ตัวของมันเอง จากหน้าจอ disassembly window บรรทัด: 0000:611F F073 B 611fh จะถูก highlight
0x8000 iในหน่วยความจำของโปรแกรม ทำได้โดยเลือก File->Data->Save... ที่อยู่ใน Code Composer Studio ให้ใส่ชื่อไฟล์เป็น
output.dat แล้วกด Enter
จากนั้นให้ใส่ค่า 0x8000 ในช่อง Address field ของ Dialog Box ที่แสดงขึ้น, ใส่ 3000 ในช่อง Length field ให้เลือก Program จาก drop-down menu ถัดไปที่ Page ทุกครั้งที่ทำการบันทึกผลลัพธ์ต้องตรวจดูว่าได้ใส่ length ที่ถูกต้อง ( 6 คูณด้วยขนาดของ test vector)
read_vector (available as read_vector.m) เป็นคำสั่งที่ใช้ในการอ่านผลลัพธ์ที่บันทึกอยู่ใน MATLAB สามารถทำได้โดยพิมพ์คำสั่งต่อไปนี้:
>> [ch1, ch2] = read_vector('output.dat');
ch1 จะเป็นค่า test_vector ที่ผ่านการ filter ของ test signal ที่คุณสร้างขึ้น ในขณะที่ ch2 นั้นควรจะใกล้เคียงหรือเหมือนกับ ch1 เป็นผลลัพธ์ที่ได้จาก DSP ch2 และ ch1ไม่เหมือนกันนั้นเป็นเพราะ quantization error ในการบันทึก test vector สำหรับ หน่วยความจำแบบ 16-bitout above) เพื่อทำการเปรียบเทียบผลกับ (in
ch1 from above). เรายังสามารถนำผลลัพธ์ที่ได้มาสร้างกราฟเพื่อดูเปรียบเทียบ ซึ่งสามารถทำได้ดังนี้:
>> plot(out,'r'); % Plot the expected curve in red >> hold on % Plot the next plot on top of this one >> plot(ch1,'g'); % Plot the expected curve in green >> hold off
>> plot(out-ch1); % Plot error signal
out=out(1:500)
above.
Comments, questions, feedback, criticisms?