Jump to content

    

походу нашел глюк Quartus 64bit 13.0.1 SP1+ Cyclone II EP2C8Q208C8

походу нашел странный глюк

использую связку Quartus 64bit 13.0.1 SP1+  Cyclone II  EP2C8Q208C8

код - cделал вырезку, в ней глюк сохранятся

//
// переключение режимов 
reg 	[31:0] div10;   
reg 	CLK10; 			
always @ (posedge CLK) 
begin    	
    if (div10 == 2400000)  
	   begin
			CLK10 <= 1;
			div10 <= 0;			
	   end		
	 else		
	   begin
	   div10 <= div10+1;				
		CLK10 <= 0;		
	   end	 
end
//


reg	[3:0]			work_mode;				// режимы работы комплекса

// реакция на кнопки
reg [3:0] step_key;
always @ (posedge CLK10 )  
begin   			
		if (~KEY[1])	// режимы
			begin
				if (step_key ==0)				
					begin 
					work_mode <= work_mode +1;
					
					CT [39:36]<= work_mode[3:0];					
					step_key <=1;
					end
				else
				   begin
					step_key <=step_key+1;
					end
			end
			

			if (work_mode==0)
			begin
				DOTPOZ <=1;		
			end 	
			else
			begin
				DOTPOZ <=6;			
			end
			//CT [39:36]	 <= work_mode[3:0];
		   //CT [15:0]  <= RD_CHECK[15:0]; 		
			//CT [35:16] <= addrramreadstream [19:0];
			
end  



// индикатор
reg 		[3:0] 	DOTPOZ; // позиция точки 1234567890
reg  		[39:0]  	CT ;  
din40	  dinamicind ( .CLK(CLK),	
							.DIG(DIG),	
							.SEG(SEG),	
							.CT(CT),
							.POZ(DOTPOZ)
							);
							

проблема связана с переменной work_mode

в данном коде, при старте она равна 0, однако, все проверки "if (work_mode==0)"  считают что она равна 1 - те любой if обнаруживает значение больше на 1 чем там есть реально. на индикатор значение выводится верно.

собака зарыта в месте присвоения

CT [39:36]<= work_mode[3:0];	

те если это в блоке  вверху, то см эффект выше

если перенести (раскоментировать/закоментировать) в  блок внизу - 0 становится нолем итд итп

блок динамического индикатора нужен для проявления глюка - те если его выключить, глюк пропадает. соответственно приложил код динамического индикатора. что там такого неправильного ?

 

 

с чем связан данный глюк ? (на самом деле я ловил другой глюк и нашел этот случайно)

как избежать подобного ? может что-то я делаю не так ?

 

 

 

 

 

din40.v

Share this post


Link to post
Share on other sites
16 hours ago, Nagisa said:

в данном коде, при старте она равна 0,

Из вашего кода этого абсолютно не следует. И предвосхищая ваш следующий вопрос, напомню, что вы не программируете, а описываете схему. И значение любых регистров, может быть в любом состоянии, если в описании нет логики четкого задания начального состояния. 

 

Share this post


Link to post
Share on other sites
2 hours ago, des00 said:

Из вашего кода этого абсолютно не следует. И предвосхищая ваш следующий вопрос, напомню, что вы не программируете, а описываете схему. И значение любых регистров, может быть в любом состоянии, если в описании нет логики четкого задания начального состояния. 

 

я понимаю, однако есть кнопка с помощью которой я могу изменять значение

 

		if (~KEY[1])	// режимы
			begin
				if (step_key ==0)				
					begin 
					work_mode <= work_mode +1;
					
					CT [39:36]<= work_mode[3:0];					
					step_key <=1;
					end
				else
				   begin
					step_key <=step_key+1;
					end
			end

соответственно я проверил, что все проверки "if (work_mode== ' срабатываю как будто там значение на единицу больше

условие "if (work_mode==0)" срабатывает при фактическом значении work_mode=4'hF 

да, если есть возможность дать рекомендацию по литературе, где описано как правильно делать была бы в тему.

 

Share this post


Link to post
Share on other sites
25 минут назад, Nagisa сказал:

я понимаю, однако есть кнопка с помощью которой я могу изменять значение

А кнопка с дребезгом?

Share this post


Link to post
Share on other sites
9 minutes ago, iosifk said:

А кнопка с дребезгом?

Кажется там без разницы... Т.к... 

34 minutes ago, Nagisa said:

я понимаю, однако есть кнопка с помощью которой я могу изменять значение

Из кода вообще следует что срабатывает по уровню. Много-много раз за 1 нажатие 

Edited by Strob

Share this post


Link to post
Share on other sites
6 minutes ago, iosifk said:

А кнопка с дребезгом?

см выше есть код. дребезг устранен. значение work_mode  выведено на индикатор.

похоже я понял, что именно происходит - вырезка из кода

initial
begin
work_mode <=4'h0;
step_key  <=0;
end

// реакция на кнопки
reg [3:0] step_key;
always @ (posedge CLK10 )  
begin               
    
        if (~KEY[1])    // режимы
            begin
                if (step_key ==4'hF)                
                    begin                     
                    work_mode <= work_mode +1;
                    CT [39:36]<= work_mode[3:0];                    
                    step_key <=0;
                    end
                else
                   begin
                    step_key <=step_key+1;
                    end
            end

в этой реализации при старте на индикаторе 1

и при этом согласно if-a в work_mode=0          

получается, что участок

					work_mode <= work_mode +1;
					CT [39:36]<= work_mode[3:0];	

имеет собственное значение work_mode=1, что в принципе логично.

 

 

иначе говоря work_mode  существует одновременно в двух ипостасях - одна с work_mode в чистом виде  и другая work_mode+1

вопросу куда будет "прицплен" узел сравнения определяет логика которая в исходном коде у меня была нарушена

те чистый work_mode оказался внутри

а тот что work_mode+1  - снаружи и поступал на узлы сравнения (if-ы), как следствие и странный результат

введение initial - переключило эту логику на правильную

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now