Hello everyone!I am working with a Stratix III EP3SE260F1152C3 FPGA doing my PFC (final career project) I need to generate a shift register using MLAB memory but Quartus II MegaWizard Plug-in Manager only allows to use 8LUT. How can I obtain my aim?:confused: Thank you very much!
The reason why I want that aim is that I need a component like Xilinx SRL16. It is a reconfigurable LUT that I can use like a 16 shift register.:(That is why I want to use Altera shift register implemented with MLAB memory instead of 8 LUTs. Thank you very much for your help!
Quartus synthesis will automatically infer large shift-registers into memories. You can also manually create altshift_taps megafunctions. Note that this is not the same thing as the SRL16. Most importantly, it can't dynamically change the tap length, so if you use the SRL16 with dynamically change shift lengths, it's not equivalent. The altshift_taps is literally a memory with a continuously running read and write pointers(the pointers are made out of logic). So if you're doing a small, narrow shift register, then logic is better. But as soon as they get wide and/or somewhat deep, altshift_taps works better.
Thank you very much, Rysc!I have tested altshift_taps but this option consumes greater memory (one lut but a lot of memory and registers) than synthesizing a shift register with several stages of pipeline. I need to use a LUT like a 16 shift register like Xilinx SRL16 does. Any solution?
What width/depth of shift register are you building? What device? For wider/deeper(say 8 bits wide, 8 bits deep), the altshift_taps consumes less resources than Xilinx. Cyclone devices may not be as much of an advantage since they don't have small memories. But really, you're storing a lot of data, so registers or memories are the two ways to get this done. I just want to make sure your analysis is correct, since I've seen designs being converted from X where they complain about this, but when it's all done it works out.
Forget my comment about 8x8 being the approximate size where altshift_taps is better. Still, for that size, the number altshift_taps is definitely what you want. I think it's still going to be bigger than an SRL16 implementation, but hopefully not too bad(and significantly smaller than making it out of registers).
--- Quote Start --- Thank you very much, Rysc! I have tested altshift_taps but this option consumes greater memory (one lut but a lot of memory and registers) than synthesizing a shift register with several stages of pipeline. I need to use a LUT like a 16 shift register like Xilinx SRL16 does. Any solution? --- Quote End --- There is none. I'm doing the same thing. For example, making a 16-bit shift register out of MLAB's consumes more resources than just using 16 flip-flops. Altshift_Taps is somewhat of a solution. The problem with Alt****_Taps is that it must be clocked by 3x you regular clock. That is, if you want a shift register clocked at 100 MHz then AltShift_Taps must be clocked at 300 MHz to get the correct results. That introduces another high frequency clock domain which may be undesirable for one's application. Seems Altera did not do a good job as to how a MLAB could be used. Further, it appears that every signal entering the MLAB is registered whether you like it or not. If I use MegaWizard to get memory there's an option to register the READ address or not. If you select NO, Quartus 13.0 goes wild and comes back saying out of memory. Generally, you have to reset your PC. A real pain.
--- Quote Start --- The problem with Alt****_Taps is that it must be clocked by 3x you regular clock --- Quote End --- I have mistakes using alt_***_taps, why do they have to be clocked by 3x ? I don't find this information elsewhere.
I think it's a kind of misunderstanding. Some posters wanted a shift register with variable tap position and granularity of one. As altshift_taps is restricted to tap distances >= 3, using a threefold clock is an option to implement the function with altshift_taps though. A way of putting the cart before the horse.Instead you'd ask, what's a suitable FPGA hardware the function can be mapped to, how can it be effectively coded? altshift_taps apparently isn't in this case.
99% of altshift_taps are used as a single shift-register with only one tap point. I would also say 90-95% of altshift_taps are just inferred by synthesis, i.e. if you create a shift-register in your code you'll see altshift_taps inferred if you look through the synthesis reports(actually, the best place is the Fitter Report -> Resource Utilization -> RAM Summary, copy all the names to a text file and search on "altshift").
Thanks for answer. You saved my time.In fact my problem was in the clock enable. Now it works as expected. I use this as a single shift register like 99% ;-) I have to use the megawizard and instantiate this altshift_taps. Quartus synthesis doesn't recognize my VHDL piece of code as a shift register : 21 * (256 sample * 24 bit wide), even if I forget the asynchronous clear, registerd my inpout and ouput signals, force Quartus to enable "logic to ram" and RAM associated options. In this case, Quartus takes half an hour to synthesis and takes many many many DFF.