Problem summary: I'm using a Zmod AWG 1411 with an Opal Kelly Brain-1 baseboard and experiencing problems with the reset logic on the Zmod AWG. Whenever I load the image via JTAG cable (Digilent JTAG-HS3), it always immediately gives clean sinusoidal outputs as expected. But often when the system boots off an SD card, it comes up in a state where the DAC outputs are scrambled with large discrete jumps instead of the expected sinusoidal outputs. If I manually generate a logical reset by pressing a user switch (more details in the next paragraph), it always recovers to clean sinusoidal outputs after a single reset - whether it was previously in a correct or incorrect state.
Design info: My FPGA code uses a clock wizard with a 200 MHz input to generate 100 MHz (used for throughout my design and for ZmodAWGController:SysClk100 & DAC_InIO_Clk) and 100 MHz/90 (ZmodAWGController:DAC_Clk)) deg phase shifted output clocks - safe clock startup mode is currently off. I have separate Xilinx DDS IP modules driving each of the two DAC channel signals, and a Xilinx Processor System Reset module (includes a clock wizard lock signal input) to reset the DDS and Zmod control IP modules using the peripheral_aresetn output. My project is based off the Opal Kelly Brain "Hello World" example, and consists only of PL code - no PS code. The Zmod controller is the second generation version dated 3/8/2023 (commit #3819e788427d0f70f8d7948c38bcd97b26925157) from the Digilent repository. I mapped Brain user pushbutton #S2 to the auxiliary reset input of the Processor System Reset module. I wanted to rule out that there was any hardware side-effect of the button press (such as loading a power supply), so I wrote some simple logic to generate a reset signal when the switch is depressed and then released.
Reset details: As far as I can tell, the DDS always resets correctly (outputs always look correct using the JTAG/ChipScope ILA). The Zmod controller is supposed to have an asynchronous active low reset that must be held low for >2 clock cycles, which should be satisfied by the Processor System Reset peripheral reset output. I don't know if the reset problems are coming from the Zmod controller FPGA module or from the underlying DAC chip. I've tried a variety of strategies to automatically generate a reset on startup that will act the same as manually pressing the reset button and ensure it always comes up in a correct state, but this has not been fully satisfactory. The most successful strategy so far (though it is highly unsatisfying to rely on an arbitrary empirically determined procedure like this) has been to wait a specified number of clocks after the clock wizard lock goes valid (e.g. 5 sec), then execute a number of periodic resets (e.g. 15x) every second. I trigger resets via a custom RTL module that connects to the Processor System Reset ext_reset_in input, and the peripheral_aresetn connects to the DDS aresetn and ZmodAWGController aRst_n inputs. When a reset takes effect properly, it causes a click sound due to the output enable relay on the AWG board. In some cases asserting a reset does not generate a click sound, so I may only hear 7 clicks out of the series of 15 attempts. Simpler ideas I tried like waiting a period a time and then only issuing 1 or 2 resets gave inconsistent performance. I want to make the system boot up deterministically so I have 100% confidence it will run correctly. It is hard for my FPGA code to tell if everything is OK, though it is easy to see visually from the scope output. I'm currently monitoring ZmodAWGController:sZmodDAC_EnOut and cDataAxisTvalid, and issuing another reset if either is deasserted.
Questions:
Why am I seeing different startup behavior when booting off the SD card compared to using the JTAG cable?
Supposedly the ZmodAWGController just needs an asynchronous inverted reset for >= 2 cycles. Is there some other important phase that is important, for example, perhaps one should avoid reseting in the middle of Zmod internal SPI commands, etc.? I could potentially check when Output Enable is first asserted as way to synchronize to the internal state if necessary. Or can there be a discrepancy between the ZmodAWGController and the underlying DAC chip?
Is there a way to steal a copy of the ZmodAWGController:dZmodDAC_Data[13:0] ODDR output signals without having to modify the ZmodAWGController code? If so, I could check for discontinuities in this data to recognize a bad state.
Thanks very much for any insights!
JColvin edit: confirmed the two google drive links are to .jpg images
Question
Todd-Kairos
Problem summary: I'm using a Zmod AWG 1411 with an Opal Kelly Brain-1 baseboard and experiencing problems with the reset logic on the Zmod AWG. Whenever I load the image via JTAG cable (Digilent JTAG-HS3), it always immediately gives clean sinusoidal outputs as expected. But often when the system boots off an SD card, it comes up in a state where the DAC outputs are scrambled with large discrete jumps instead of the expected sinusoidal outputs. If I manually generate a logical reset by pressing a user switch (more details in the next paragraph), it always recovers to clean sinusoidal outputs after a single reset - whether it was previously in a correct or incorrect state.
Design info: My FPGA code uses a clock wizard with a 200 MHz input to generate 100 MHz (used for throughout my design and for ZmodAWGController:SysClk100 & DAC_InIO_Clk) and 100 MHz/90 (ZmodAWGController:DAC_Clk)) deg phase shifted output clocks - safe clock startup mode is currently off. I have separate Xilinx DDS IP modules driving each of the two DAC channel signals, and a Xilinx Processor System Reset module (includes a clock wizard lock signal input) to reset the DDS and Zmod control IP modules using the peripheral_aresetn output. My project is based off the Opal Kelly Brain "Hello World" example, and consists only of PL code - no PS code. The Zmod controller is the second generation version dated 3/8/2023 (commit #3819e788427d0f70f8d7948c38bcd97b26925157) from the Digilent repository. I mapped Brain user pushbutton #S2 to the auxiliary reset input of the Processor System Reset module. I wanted to rule out that there was any hardware side-effect of the button press (such as loading a power supply), so I wrote some simple logic to generate a reset signal when the switch is depressed and then released.
Reset details: As far as I can tell, the DDS always resets correctly (outputs always look correct using the JTAG/ChipScope ILA). The Zmod controller is supposed to have an asynchronous active low reset that must be held low for >2 clock cycles, which should be satisfied by the Processor System Reset peripheral reset output. I don't know if the reset problems are coming from the Zmod controller FPGA module or from the underlying DAC chip. I've tried a variety of strategies to automatically generate a reset on startup that will act the same as manually pressing the reset button and ensure it always comes up in a correct state, but this has not been fully satisfactory. The most successful strategy so far (though it is highly unsatisfying to rely on an arbitrary empirically determined procedure like this) has been to wait a specified number of clocks after the clock wizard lock goes valid (e.g. 5 sec), then execute a number of periodic resets (e.g. 15x) every second. I trigger resets via a custom RTL module that connects to the Processor System Reset ext_reset_in input, and the peripheral_aresetn connects to the DDS aresetn and ZmodAWGController aRst_n inputs. When a reset takes effect properly, it causes a click sound due to the output enable relay on the AWG board. In some cases asserting a reset does not generate a click sound, so I may only hear 7 clicks out of the series of 15 attempts. Simpler ideas I tried like waiting a period a time and then only issuing 1 or 2 resets gave inconsistent performance. I want to make the system boot up deterministically so I have 100% confidence it will run correctly. It is hard for my FPGA code to tell if everything is OK, though it is easy to see visually from the scope output. I'm currently monitoring ZmodAWGController:sZmodDAC_EnOut and cDataAxisTvalid, and issuing another reset if either is deasserted.
Questions:
Thanks very much for any insights!
JColvin edit: confirmed the two google drive links are to .jpg images
Link to comment
Share on other sites
6 answers to this question
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now