Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.
14957 Discussions

Bit memorisation in if statement

Altera_Forum
Honored Contributor I
830 Views

Hi everyone, 

 

First i'm sorry because i'm french, so my english may be bad. 

 

My project consists to control many servo-motors via the DE0 Nano Board via UART. 

In order to do that, i send serial data via a terminal like "100,120,80,200". There are 4 servos, 4 commands which are separated by commas, a character which is recognized like a separator to attribute the right value (pulse width) to the right servo via a counter incrementation. 

 

For this separator, i've made a "block state" to not attribute the value of the "," character on my servo and wait the next value in my RX buffer. 

 

My code will talks better than me : 

 

sel_servo: process (reset_n, rx_buffer(d_width DOWNTO 1), clk, compteur) begin if (reset_n = '0' OR compteur > 3) then compteur <= 0; elsif (clk'EVENT AND clk = '1') then if((rx_buffer(d_width DOWNTO 1) = "00101100") and block_state = '1') then compteur <= compteur + 1; block_state <= '0'; else compteur <= compteur; block_state <= block_state; blockstate <= block_state; -- just watch the bit on LEDs end if; case compteur is when 0 => if block_state = '0' and (rx_buffer(d_width DOWNTO 1) /= "00101100") then -- "00101100" is the binary value for comma character block_state <= '1'; posiS0 <= rx_buffer(d_width DOWNTO 1); pwmiS0 <= unsigned('0' & posiS0 ) + 64; end if; when 1 => if block_state = '0' and (rx_buffer(d_width DOWNTO 1) /= "00101100") then -- the "compteur" value represents the servo block_state <= '1'; posiS1 <= rx_buffer(d_width DOWNTO 1); pwmiS1 <= unsigned('0' & posiS1 ) + 64; end if; when 2 => if block_state = '0' and (rx_buffer(d_width DOWNTO 1) /= "00101100") then block_state <= '1'; posiS2 <= rx_buffer(d_width DOWNTO 1); pwmiS2 <= unsigned('0' & posiS2 ) + 64; end if; when 3 => if block_state = '0' and (rx_buffer(d_width DOWNTO 1) /= "00101100") then block_state <= '1'; posiS3 <= rx_buffer(d_width DOWNTO 1); pwmiS3 <= unsigned('0' & posiS3 ) + 64; end if; when 4 => compteur <= 0; end case; end if; end process;  

 

This code compiles successfully. 

My problem is that the "block_state" bit seems falls when i send a comma, but rises after immediatly. It didn't memorised his state, and i try a lot of different way but i didn't find any issues. 

 

I hope i was clear in this description of my problem. 

 

Thanks you !
0 Kudos
6 Replies
Altera_Forum
Honored Contributor I
78 Views

Have you written a test bench? have you simulated the design?

Altera_Forum
Honored Contributor I
78 Views

No, I usually use GTKWave but it's not the easiest way to simulate... So I visualize all my signal with oscilloscope. Have you seen any problem in my code?

Altera_Forum
Honored Contributor I
78 Views

Looking at other people's code is never very easy without the whole code and a testbench and some time. But then its usually much easier to debug it yourself. Altera provide modelsim for free. Have you tried using that? 

 

Notes on your code: 

 

if((rx_buffer(d_width DOWNTO 1) = "00101100") and block_state = '1') then compteur <= compteur + 1; block_state <= '0'; else  

 

If d_width is NOT 8, then this statement will always be FALSE. Comparing two vectors of different lengths always returns false without any warnings. The same with the /= comparisons. If DWIDTH /= 8 then all of the /= compares will always be TRUE.
Altera_Forum
Honored Contributor I
78 Views

Of course I understand that it's not easy to debug it for you. I will try to simulate this tomorrow, I also tried modelsim, but it doesn't work because of some bugs, that's why I use GTKWave. 

 

D_width value is 8, and the value of "compteur" is incremented like expected (I've also checked that with some leds in the board).
Altera_Forum
Honored Contributor I
78 Views

What bugs? in your code? why not fix them?

Altera_Forum
Honored Contributor I
78 Views

Not in my code, in modelsim, I have tried it a few months ago when I've begun Fpga development, but it didn't work. It's a bug which seems come from my OS system, but don't worry about that. I will be back with the simulation and test bench tomorrow (in France, it's already 11 p.m !). 

 

Thanks you for your answers.
Reply