|
|
(17 intermediate revisions by 3 users not shown) |
Line 9: |
Line 9: |
| }} | | }} |
|
| |
|
| Section 10.5 of PDK Reference Manual explains how to run the sample software application. It has been reproduced below in brief.
| | == Subversion == |
| | You can checkout the source for our projects using the subversion repository below. Use your ISU NetID as both your username and password: |
| | svn co http://svn.chaddington.com/cpre584 |
|
| |
|
| == Compiling the Project == | | == Updating the UserApp for Sobel == |
| The rev version installed on the Convey machine is from 2011-11-22; to copy the sample app's source code run:
| | [[Team Gryffindor - Sobel Source Code]] |
| cd ~
| |
| mkdir pdk_sample
| |
| cp -r /opt/convey/pdk/latest/hc-1/examples/* pdk_sample
| |
| | |
| To make the sample project, first make sure you have [[Convey environment setup|setup your environment variables]], then run:
| |
| | |
| cd ~/pdk_sample/cae_pers_vadd/SampleAppVadd/
| |
| make
| |
| | |
| This compiles both an emulator (CaeSimPers) and a C program that makes a coprocessor call to use the vector adder (UserApp.exe).
| |
| | |
| == Run the Project ==
| |
| Projects typically contain the following three executables:
| |
| # A software simulation of the FPGA design
| |
| # A hardware simulation (ModelSim) of the FPGA design
| |
| # The actual implementation (C code, Verilog code). The bitfiles are compiled, nicknamed, and added to a known file location.
| |
| | |
| === Actual Implementation ===
| |
| To run the software version of the app that makes a call to the coprocessor, use the command:
| |
| | |
| cd ~/pdk_sample/cae_pers_vadd/SampleAppVadd/
| |
| ./UserApp.exe
| |
| | |
| You should see the program run and output the following:
| |
| | |
| [[Image:Assignment1.software.PNG]]
| |
| | |
| You can also set the CNY_CALL_STATS environment variable; this variable gives back the number of times the coprocessor was called. I.E. for this application, the coprocessor is called once. Output from the terminal is reproduced in the following file:
| |
| | |
| [[Media:Assignment1 team2 fabric.txt|Console Output]]
| |
| | |
| === Running in the SW Model === | |
| To run the sample application on the Coprocessor simulator, you'll need to set some environmental variables:
| |
| | |
| # Use the Coprocessor Simulator
| |
| export CNY_SIM_THREAD=libcpSimLib2.so
| |
| # Point to the emulator
| |
| export CNY_CAE_EMULATOR=~/pdk_sample/cae_pers_vadd/CaeSimPers/CaeSimPers
| |
| | |
| After setting the environmental variables, rerun the app:
| |
| | |
| cd ~/pdk_sample/SampleAppVadd/
| |
| ./UserApp.exe
| |
| | |
| The program will pause at the following screen for a 10-20 seconds...
| |
| | |
| [[Image:Assignment1.simulator1.PNG]] | |
| | |
| ...and then finish running the program.
| |
| | |
| [[Image:Assignment1.simulator2.PNG]]
| |
| | |
| === Assignment #2 ===
| |
| [http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm Description of Sobel's Algorithm] - This is a great website teachs us how it works, and it also provide some examples, which help us to implement in C code.
| |
| | |
| Compiler:
| |
| | |
| gcc -O -lm sobel.c -o sobel
| |
| | |
| ./sobel
| |
| | |
| Sobel edge detection algorithm code with C (''Since the code is very long, I just show key part of algorithm''): | |
| | |
| int sobel(double threshold) {
| |
| unsigned int x, y, i, v, u; // for loop counter
| |
| unsigned char R, G, B; // color of R, G, B
| |
| double val[MASK_N] = {0.0};
| |
| int adjustX, adjustY, xBound, yBound;
| |
| double total;
| |
|
| |
| for(y = 0; y != height; ++y) {
| |
| for(x = 0; x != width; ++x) {
| |
| for(i = 0; i != MASK_N; ++i) {
| |
| adjustX = (MASK_X % 2) ? 1 : 0;
| |
| adjustY = (MASK_Y % 2) ? 1 : 0;
| |
| xBound = MASK_X / 2;
| |
| yBound = MASK_Y / 2;
| |
|
| |
| val[i] = 0.0;
| |
| for(v = -yBound; v != yBound + adjustY; ++v) {
| |
| for (u = -xBound; u != xBound + adjustX; ++u) {
| |
| if (x + u >= 0 && x + u < width && y + v >= 0 && y + v < height) {
| |
| R = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 2);
| |
| G = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 1);
| |
| B = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 0);
| |
|
| |
| val[i] += color_to_int(R, G, B) * mask[i][u + xBound][v + yBound];
| |
| }
| |
| }
| |
| }
| |
| }
| |
|
| |
| total = 0.0;
| |
| for (i = 0; i != MASK_N; ++i) {
| |
| total += val[i] * val[i];
| |
| }
| |
|
| |
| total = sqrt(total);
| |
|
| |
| if (total - threshold >= 0) {
| |
| // black
| |
| *(image_t + byte_per_pixel * (width * y + x) + 2) = BLACK;
| |
| *(image_t + byte_per_pixel * (width * y + x) + 1) = BLACK;
| |
| *(image_t + byte_per_pixel * (width * y + x) + 0) = BLACK;
| |
| }
| |
| else {
| |
| // white
| |
| *(image_t + byte_per_pixel * (width * y + x) + 2) = WHITE;
| |
| *(image_t + byte_per_pixel * (width * y + x) + 1) = WHITE;
| |
| *(image_t + byte_per_pixel * (width * y + x) + 0) = WHITE;
| |
| }
| |
| }
| |
| }
| |
|
| |
| return 0;
| |
| }
| |
| | |
| We use color lena with 24bit bmp file
| |
| [[Image:lena.jpg|200px|thumb|left|alt text]]
| |
| | |
| [[Image:Lena_sobel.jpg|200px|thumb|left|alt text]]
| |
| | |
| == Profiling Sobel edge detection algorithm ==
| |
| | |
| This command will generate a test file:
| |
|
| |
| gcc -lm -pg sobel.c
| |
| ./a.out
| |
| gprof a.out > test
| |
|
| |
| test file:
| |
| | |
| % cumulative self self total
| |
|
| |
| '''80.80''' 0.15 0.15 1 145.44 175.53 sobel
| |
| 16.72 0.18 0.03 4706312 0.00 0.00 color_to_int
| |
| 0.00 0.18 0.00 1 0.00 0.00 read_bmp
| |
| 0.00 0.18 0.00 1 0.00 0.00 write_bmp
| |
Subversion
You can checkout the source for our projects using the subversion repository below. Use your ISU NetID as both your username and password:
svn co http://svn.chaddington.com/cpre584
Updating the UserApp for Sobel
Team Gryffindor - Sobel Source Code