[FPGA] Discrete Delay not computing correctly?

Go to solution Solved by hooovahh,

Recommended Posts

Question:

How is 9*512 Discrete delays equal to ~410us?

Context:

We have found a solution to an offset problem between 2 sine waves, however we are unable to explain the delay calculations...

(Someone else did the work a long time ago, now we need to explain the fix).

There's 6us delay between the input Sinewave and the generated Sinewave from that input. Sinewave period is 416us (Figure 1).

The Code works with 9 blocks of 512 Discrete Delays. 9*512*(1/80MHz) = 57.6us, but why is this working?

Cannot Modify the code:

The project is set and no code can be modified.

Project Settings:

The FPGA derived is at 80MHz, but the project Top-Level Clock seems to specify 40 MHz.

The system automatically detects if there is an error greater than 5 degrees phase shift.

Problematic:

Code:

Thanks

• Solution

Sure but a crosspost helps give some context to those unfamiliar with the history of the issue.

And it sure it an interesting thread if you care about things like absolute timing on FPGA.

Thanks for the crosspost hooovahh I don't browse ni.com nearly as much as I used to.

You are still debating it. As far as I can see, everyone else is happy with the answers given.

Hi,

The short answer is I don't think your loop is running as fast as you think.

On a standard LabVIEW while loop on the block diagram the loop time is the execution time of the code inside the loop.

On a single cycle timed loop is where the loop time is equal to the clock rate, this would give you the calculations you expect.

To try and work it through, I'm unsure the execution time of the delay blocks off the top of my head but it seems possible it could run in one cycle.

Remembering that these are shift registers effective means:

1) They are not part of the calculation

2) The longest path is only one side of these

This makes the longest path (the U16 to I16 conversion should be free) 5 ticks (3 if not).

5 * 25ns = 100ns period.

100ns * 9 * 512 = 460.8uS, we are getting close.

Anyway the short version is that using standard while loops for specific timing is tricky because as soon as you change the code, you change the timing. I would do some reading around single cycle timed loops, they give you reliable timing and I think are closer to the behaviour you expect, but beware there are few gotchas in some unsupported functions and if you try and do to much the compilation will fail.

thanks

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
• Similar Content

• Hi guys. This semester I'm starting a course system development for control and automation engineering, witch will be based on LabView. Therefore, my University doesn't have a NI hardware, even a MyRIO for us to test our VI and the teacher said that we should test our projects with our own Arduino...
So, I have a little experience in Arduino and I know the basics for LabView. Now I'm in a point that I know that with Arduino I'll not take the best from LabView. I cannot even deploy a code to it.
So, there is where my question comes in...
I'm looking for a new board better then Arduino to use in the classes. I would buy a MyRIO card if I had the money but in Brazil this board is too expensive for me
Witch one should I get that is closest to myRIO and less expensive than that? I would like to try de deployment of a VI and FPGA..... Is this possible?
Thanks a lot for the help!
Regards
• By grjgrj
Hello. I need change some code for SbRIO-9626 with LabVIEW 2018. I have code from LabVIEW 2015. Right now I have only LabVIEW 2018. And I worked with it for SbRIO-9627.
LabVIEW FPGA, LabVIEW Real-Time, NICRIO1800 driver istalled.
And I install Xilinx ISE 11.5 Compilation Tool too.
When I start compilation FPGA VI I got error about problem with compilation too (see attachment picture).
Could you tell me how I can solve this problem?
It is very important.

• Hi,

I am trying to use image convolution inside FPGA. My Image size is around 6kx2k. The convolution is applied properly until 2600 pixels in x resolution. After that, the values seem to miss previous row data.

In Detail: As convolution is matrix operation, image data needs to be stored for the operation. But it seems there is an inadvertent error storing only 2600 pixels per row inside FPGA. And hence the filtered output is calculated assuming these pixels to be 0.

I have tried with different image sizes, different convolution kernels, and also in different targets (cRIO 9030 and IC 3173). All results are same.

I have attached a screenshot of FPGA VI and an example image.

The example image shows an input image of 4000x2500 of same pixel value 16.The kernel is 3x3 of values 1 with divider=1. The RT image is processed using IMAQ convolute inside RT controller and has value 144 [(9*16)/1] for all pixels. But the FPGA processed image (zoomed in) has 144 until 2597 pixels and then 112 (7*16- showing 1 column of 2 rows missing) at 2598, 80 (5*16- showing 2 columns of 2 rows missing) at 2599 and 48 after that (missing 3 columns of 2 rows- current row is always present). This shows the data is missing from the previous rows after 2600 index.

Is there some mistake in the code or any workaround available?

• By tdavid
Hi,
If I generate an FPGA IP core from my LabVIEW code, can I use it somehow in traditional FPGA development environments, such as Vivado?
Thanks,
David
• By Nala
Hello everybody,

I'm about to write an application that can create a complete new FPGA-Project for the cRIO-system automatically without any user Input.

Before I ask my question directly, I will give you a few Information about the system and how it works at the moment.
I'm working with a cRIO-system that can have different modules in different slots (max 8). That system should be universally usable which means I can replace one module with another one at the start up and create a complete new project with a different name.

Most of the project works (I can find out in which slots which module is placed and load the right VI's correctly) but there is one point which I really dislike: the user always has to give some input Information at the beginning of the creation and mostly that is the same like "Which type of project it should be" or "Which IP address should be used to find the system and the modules for each slot".

The goal is that I can write down some specific arguments so the program is created automatically?
Or - if there is no way to do this - a way that a second window is shown on screen to help the user through the creation process (for example that tells the user that the system need to be turned on that the project can find every single module)?

English isn't my mother tongue, so please apologize if there are any mistakes in my spelling.
Thank you very much for your help
×
×
• Create New...