FPGA ベースのデジタル クロック Verilog 開発

目次

1. 理論的根拠

2. 事件の背景

1. 問題の説明

2.思考プロセス

3、verilog コア シミュレーション

第四に、シミュレーション結論分析

5.参考文献


1. 理論的根拠

プログラム全体は、次の 3 つの部分に分かれています。

·時計制御部分、調整分、秒機能、秒リセット機能に分かれています。

一時停止機能、クロックカウント停止機能;

4桁のデジタル管表示機能;

システムボタンは、クイック調整ボタン、リセット、セカンドリセットボタン、システム一時停止ボタン(作業と一時停止の2つの機能が利用可能) 

したがって、4 つのボタンが必要です。

2. 事件の背景

1. 問題の説明

システム全体の基本ブロック図を以下に示します。

2.思考プロセス

    ·キーのデバウンスは主に遅延の機能によって実現され、ボードの実際のロードを遅らせるには長い時間がかかることが多いため、コードは 2 つのバージョンのコードを提供します。1 つのバージョンはシミュレーション バージョンで、Jitter をキャンセルしません。 、1つのバージョンはデバウンス機能を備えたハードウェアバージョンです。

      ・シミュレーション版は主にシステムの機能を考慮しているため、クロック系を直接制御しているが、ハードウェア版では1秒分のクロックを得るためにシステムクロックの周波数を分周する必要がある。

3、verilog コア シミュレーション

トッププログラムは次のとおりです。

module time_module(
                  i_clk,     //系统时钟
                  
                  //这里假设按键的初始状态为0,按下后为1                  
                  i_rst,     //系统复位
                  i_min_fast,//调整分
                  i_sec_fast,//调整秒
                  i_stop_run,//暂停或者继续工作

                  
                  o_min,     //显示分
                  o_sec      //显示秒
                  );
input      i_clk;
input      i_rst;
input      i_min_fast;
input      i_sec_fast;  
input      i_stop_run;                


output[7:0]o_min;
output[7:0]o_sec;

reg[7:0]o_min = 8'd0;
reg[7:0]o_sec = 8'd0;

always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
     begin
     o_min <= 8'd0;//59
     o_sec <= 8'd0;//59
     end
else begin
          if(i_stop_run == 0)//不按下时为0,时钟正常工作
          begin
                       //正常计时间
					   if(o_sec[3:0] == 4'd9)
					   begin
					       o_sec[3:0] <= 4'd0;
					            if(o_sec[7:4] == 4'd5)
					            begin
					            o_sec[7:4] <= 4'd0;
					            
					                   //分计数
									   if(o_min[3:0] == 4'd9)
									   begin
										   o_min[3:0] <= 4'd0;
												if(o_min[7:4] == 4'd5)
												begin
												o_min[7:4] <= 4'd0;
												end
										   else begin       
												o_min[7:4] <= o_min[7:4] + 4'd1;
												end
									   end
								  else begin
									   o_min[3:0] <= o_min[3:0] + 4'd1;
									   end 					            
					            end
					       else begin       
					            o_sec[7:4] <= o_sec[7:4] + 4'd1;
					            end
					    end
				   else begin
				        o_sec[3:0] <= o_sec[3:0] + 4'd1;
					    end   
					    
				   //调整时间    
				   if(i_min_fast == 1'b1)
				   begin
									   
					       if(o_min[3:0] == 4'd9)
					       begin
						   o_min[3:0] <= 4'd0;
								if(o_min[7:4] == 4'd5)
								begin
								o_min[7:4] <= 4'd0;
								end
						   else begin       
								o_min[7:4] <= o_min[7:4] + 4'd1;
								end
					       end
				      else begin
					       o_min[3:0] <= o_min[3:0] + 4'd1;
					       end 
                   end
 
                     
				   if(i_sec_fast == 1'b1)
				   begin
                   o_sec <= 8'd0;
                   end
				    
					       
          end
          
     else begin//按下时为1,时钟停止
          o_min <= o_min;
          o_sec <= o_sec;          
          end     
     end
end


endmodule

 

第四に、シミュレーション結論分析

シミュレーション結果は次のとおりです。

通常の操作:

上の図でわかるように、秒のカウントが 59 に達すると、0 になり、その後分数が 1 増加します。

調整:

ポイント調整:

分修正ボタンを押すと、実際の電子時計と同じように分が早くカウントされます。

2 番目の調整:

秒調整ボタンを押すと、秒が0に変わります。

一時停止:

一時停止を押すと歩行を停止します。

リセット:

リセット後、システムは 0 になります; A02-36

おすすめ

転載: blog.csdn.net/ccsss22/article/details/126395857
おすすめ