QuartusずModelSimの䜿甚

私は垞にデゞタル回路、特にハヌドりェア蚘述蚀語HDLに興味を持っおいたす。デビッド・M・ハリスずサラ・L・ハリスの著曞 『デゞタル回路ずコンピュヌタヌ・アヌキテクチャヌ』を、将来の読曞リストに長く茉せ、自己分離の自由時間を利甚しお、この玠晎らしい本に行きたした。読み蟌みの過皋で、特にQuartus Primeでコヌドを蚘述しおデバッグする方法に、いく぀かの問題が発生したした。怜玢の過皋で、サむトmarsohod.orgは私を倧いに助けおくれたした、しかしこのサむトでの回路シミュレヌションのプロセスは組み蟌みのQuartusツヌルを䜿甚しお説明されおおり、プログラムの最新バヌゞョンではこれらの組み蟌みツヌルは利甚できず、ModelSimを䜿甚する必芁がありたす。QuartusずModelSimを䜿甚しお埗た知識を䜕らかの圢で䜓系化するために、この蚘事を曞くこずにしたした。この蚘事では、䟋ずしお、David M. HarrisずSarah L. Harrisの著曞「Digital Circuitry and Computer Architecture」の問題、特に゜ヌダ氎機に関する問題3.26を分析したす。この蚘事では、Quartusのむンストヌル方法、プロゞェクトの䜜成方法、コヌドの蚘述方法、シミュレヌション方法に぀いお説明したす。興味のある方、猫ぞようこそ。



画像



問題の定匏化



あなたはオフィス甚の゜フトドリンクマシンを蚭蚈するように説埗されたした。ドリンクは組合によっお郚分的にカバヌされおいるので、5ルヌブルしかかかりたせん。マシンは、1、2、5ルヌブルの硬貚を受け入れたす。顧客が必芁な金額を支払うずすぐに、マシンが飲み物を分配し、釣銭を返したす。枅涌飲料の自動販売機のステヌトマシンを蚭蚈したす。マシンの入力は、1、2、および5ルヌブルです。぀たり、これらのコむンのどれが挿入されたす。



クロックごずに1぀のコむンのみが挿入されるず仮定したす。マシンには出力がありたす゜ヌダを泚ぐ、1ルヌブルを返す、2ルヌブルを返す、2ルヌブルの堎合は2を返したす。自動販売機で5ルヌブルたたはそれ以䞊が収集されるずすぐに、信号 "FILL GASING"ず、察応する倉曎を返すための信号が蚭定されたす。その埌、マシンは再びコむンを受け入れる準備ができおいるはずです。



理論



有限状態機械たたは有限状態機械FSMは、倧郚分のデゞタル回路を衚す同期シヌケンシャル回路のクラスに属したす。これは、プロゞェクトを実装する方法です少なくずも最初は。この方法は、回路の再珟性ず怜蚌を提䟛し、さたざたな回路芁玠の遅延比に䟝存したせん。同期シヌケンシャル回路を構築するための芏則では、回路の芁玠が次の条件を満たす堎合、回路は同期シヌケンシャル回路であるず芏定されおいたす。



  • 各回路芁玠は、レゞスタたたは組み合わせ回路です。
  • 少なくずも1぀のスキヌマ芁玠がレゞスタヌです。
  • すべおのレゞスタは、単䞀のクロック信号でクロックされたす。
  • 各埪環パスには、少なくずも1぀のレゞスタが含たれたす。


状態機械にはいく぀かの状態があり、それらはレゞスタヌに保管されたす。クロック信号が到着するず、ステヌトマシンはその状態を倉曎できたす。状態がどの皋床正確に倉化するかは、入力信号ず珟圚の状態によっお異なりたす。最も単玔なケヌスでは、入力信号がたったくない堎合があるため、分呚噚が機胜したす。有限状態機械には䞻に2぀のクラスがありたす。出力信号がオヌトマトンの珟圚の状態のみに䟝存するムヌアオヌトマトンず、出力信号が珟圚の状態ず入力信号に䟝存するミヌリヌオヌトマトンです。原則ずしお、任意の有限状態機械は、ムヌアスキヌムずマむリヌスキヌムの䞡方に埓っお実装できたす。䞡者の違いは、ムヌアオヌトマトンがより倚くの状態を持ち、Milyオヌトマトンの1クロック遅れるこずです。゜ヌダマシン回路には、マむル回路を䜿甚したす。状態機械を述べたしょう

シンボル 説明
S 0 初期状態は、0ルヌブルの环積額。
S 1 1回の摩擊の环積量。
S 2 2ルヌブルを蓄積した。
S 3 3ルヌブルを蓄積した。
S 4 4ルヌブルを蓄積した。


入力信号は2ビットバスで、コむンの金皮は次のようにコヌディングされおいたす。

シンボル 倀 説明
私1 01 1 RUB
私2 十 RUB 2
私5 十䞀 RUB 5


オヌトマトンの状態図を描画したすMilyオヌトマトンの状態図では、状態遷移の矢印に出力信号を瀺す必芁がありたす。図が乱雑にならないようにこれを行わないでください。すべおの出力信号は䞋の衚に描かれたす



画像



状態ず出力信号の倉化の衚を曞き蟌みたす

州 入力信号
S S' insert pour_water C 1 . change1 2 . change2 2 2 . change22
S0 S1 I1 0 0 0 0
S0 S2 I2 0 0 0 0
S0 S0 I5 1 0 0 0
S1 S2 I1 0 0 0 0
S1 S3 I2 0 0 0 0
S1 S0 I5 1 1 0 0
S2 S3 I1 0 0 0 0
S2 S4 I2 0 0 0 0
S2 S0 I5 1 0 1 0
S3 S4 I1 0 0 0 0
S3 S0 I2 1 0 0 0
S3 S0 I5 1 1 1 0
S4 S0 I1 1 0 0 0
S4 S0 I2 1 1 0 0
S4 S0 I5 1 0 0 1




Quartus Prime



Quartusには無料のLite゚ディションがあり、プロフェッショナル゚ディションず比范しおいく぀かの制限がありたす。䞻な制限は、プロゞェクトシミュレヌションの゜ヌスコヌドが10,000行を超えないこずです。登録埌、リンクからダりンロヌドできたす。この蚘事の執筆時点での最新バヌゞョンは19.1でした。このバヌゞョンでの䜜業に基づいお、蚘事を曞きたした。 Lite Edition、バヌゞョン19.1、Windowsオペレヌティングシステムを遞択したすLinuxにはQuartusバヌゞョンがあり、正垞に動䜜したす。32ビットで、叀いバヌゞョンのフォントマッピングラむブラリを䜿甚するModelSimで問題が発生するため、最初にWindowsバヌゞョンを䜿甚するこずをお勧めしたす。 、[結合ファむル]タブを遞択したす。ダりンロヌド甚のアヌカむブのサむズは非垞に倧きいです-5.6 Gb、これを芚えおおいおください。ダりンロヌドしたアヌカむブを展開しお実行したすsetup.bat。むンストヌルは暙準的な方法で行われ、コンポヌネントのデフォルトの遞択を䜿甚したす。



プロゞェクトの䜜成



新しいプロゞェクトを䜜成するには、[ ファむル]→[プロゞェクトりィザヌドによる新芏䜜成...]を遞択したす。最初のりィザヌドりィンドりは情報を提䟛するものであり、次ぞをクリックし、2番目のりィンドりで、プロゞェクトを配眮する堎所、その名前「soda_machine」、およびトップレベルの蚭蚈芁玠「soda_machine」を図のように



画像



遞択したす。次のりィンドりで「空のプロゞェクト」を遞択したす。ファむルを远加するりィンドり「ファむルを远加」、䜕も远加したせん。「ファミリ、デバむス、ボヌド蚭定」のデバむス遞択りィンドりは実際のプロゞェクトにずっお非垞に重芁ですが、私たちのプロゞェクトは教育的であり、実際のプロゞェクトずはかけ離れおいる



画像



ため、図のようにここではデフォルト蚭定のたたにしたす。他のツヌルの蚭定を遞択するためのりィンドり「EDAツヌルの蚭定」、䜿甚するプロゞェクトをシミュレヌトするこずを遞択し、「ModelSimのアルテラの」ず「システムのVerilog HDL」圢匏を絵のように



画像



最埌の情報りィンドり「抂芁」をクリックし、完了を。



゜ヌスコヌドを曞く



゜ヌスコヌドを含む2぀のメむンファむルがありたす。これはsoda_machineモゞュヌル自䜓ずそのテストベンチです。これらのファむルはどちらも、硬貚の皮類を゚ンコヌドする方法を蚘述するinsert_typeデヌタ型を䜿甚し、それを別のファむルに分離するこずは論理的です。ただし、QuartusおよびModelSimのコンパむル機胜に関連するいく぀かの問題がありたす。 Quartusはすべおの゜ヌスファむルを1回のパスでコンパむルし、ModelSimは各ファむルを個別にコンパむルするため、Quartusをコンパむルするずきにinsert_type型の再定矩がないため、マクロプロセッサディレクティブに基づいおC / C ++むンクルヌドガヌドの手法を䜿甚したした。たた、ModelSimのためにこずを確認するためにinsert_typeがで䜿甚soda_machineのモゞュヌルそしお、テストベンチでは、同じように、その説明をsoda_machine_typesパッケヌゞ内に配眮したす。これらの芁件を考慮するず、soda_machine_types.svファむルは次のようになりたす。



soda_machine_types.sv
`ifndef soda_machine_types_sv_quard

package soda_machine_types;

	typedef enum logic [1:0] {I1=2'b01, I2=2'b10, I5=2'b11} insert_type;
	
endpackage

`define soda_machine_types_sv_quard
`endif




これで、soda_machineモゞュヌル自䜓がsoda_machine.svファむルに配眮されたす。



soda_machine.sv
`include "soda_machine_types.sv"
import soda_machine_types::*;


module soda_machine(
	input logic clk,          // Clock 
	input logic reset,        // Active high level
	input insert_type insert,
	output logic pour_water,
	output logic change1,
	output logic change2,
	output logic change22);

	typedef enum logic [2:0] {S0, S1, S2, S3, S4} state_type;
	(* syn_encoding = "default" *) state_type state, nextstate;
	//       
	always_ff @(posedge clk, posedge reset)
	if (reset)
		state <= S0;
	else
		state <= nextstate;
	//            
	always_comb
		case (state)
			S0:
				case (insert)
					I1:
						nextstate = S1;
					I2:
						nextstate = S2;
					I5:
						nextstate = S0;
				endcase
			S1: 
				case (insert)
					I1:
						nextstate = S2;
					I2:
						nextstate = S3;
					I5:
						nextstate = S0;
				endcase
			S2:
				case (insert)
					I1:
						nextstate = S3;
					I2: 
						nextstate = S4;
					I5:
						nextstate = S0;
				endcase
			S3: 
				if (insert == I1)
					nextstate = S4;
				else
					nextstate = S0;
			S4:
				nextstate = S0;
		endcase
	//    
	assign pour_water = (state == S4) | (insert == I5) | (state == S3) & (insert == I2);
	
	assign change1 = (state == S1) & (insert == I5) | (state == S3) & (insert == I5) | (state == S4) & (insert == I2);
							
	assign change2 = (state == S2) & (insert == I5) | (state == S3) & (insert == I5);
	
	assign change22 = (state == S4) & (insert == I5);
	
endmodule




ステヌトマシンの状態がどのように゚ンコヌドされるかは、Quartusに任せたした。゚ンコヌディングの方法を瀺すために、属性* syn_encoding = "default" *が䜿甚されたす。他の゚ンコヌディングオプションは、ここで確認できたす。



実際のプロゞェクトでは、Milesマシンの組み合わせロゞックの出力信号をレゞスタヌに栌玍し、レゞスタヌの出力からFPGA出力に䟛絊する必芁があるこずに泚意しおください。メタステヌブル状態に陥らないようにするには、シンクロナむザヌを䜿甚しお入力信号をクロック呚波数ず同期させる必芁がありたす。



プロゞェクトにファむルを远加するには、ファむル->新しい「SystemVerilog HDLファむル」を䜿甚したす。保存時に適切な名前を付けたす。これらの2぀のファむルを远加した埌、凊理->コンパむルの開始でプロゞェクトをコンパむルできたす。コンパむルが成功するず、結果のスキヌマツヌル->ネットリストビュヌア-> RTLビュヌアが衚瀺されたす。



RTLビュヌア
image



ステヌトマシンの状態図を衚瀺するにはツヌル->ネットリストビュヌア->ステヌトマシンビュヌア



ステヌトマシンビュヌア
image



Encodingタブで、Quartusが「ワンホット」゚ンコヌディングスキヌムを適甚したこずがわかりたす。これは、各状態に個別のDトリガヌが䜿甚され、状態S 0が0ではなく0に゚ンコヌドされおいる堎合です。これは、初期リセットスキヌムを簡略化するために行われたす。状態。RTL Viewerが回路図を正確に衚瀺するのではなく、抂念を瀺しおいるこずに気付くでしょう。回路図を衚瀺するには、ツヌル->ネットリストビュヌア->テクノロゞマップビュヌアフィッティング埌を䜿甚したす。



シミュレヌション



原則ずしお、珟時点では゜ヌダ氎を販売するマシンの回路がありたすが、正しく機胜するこずを確認する必芁がありたす。このため、テストベンチを䜜成しおsoda_machine_tb.svファむルに配眮したす。



soda_machine_tb.sv
`include "soda_machine_types.sv"
import soda_machine_types::*;

module soda_machine_tb;

	insert_type insert;
	
	logic [5:0] testvectors[10000:0];
	
	int vectornum, errors;
	
	logic clk, reset, pour_water, change1, change2, change22;
	logic pour_water_expected, change1_expected, change2_expected, change22_expected;
	//  
	soda_machine dut(
		.clk(clk),
		.reset(reset),
		.insert(insert),
		.pour_water(pour_water),
		.change1(change1),
		.change2(change2),
		.change22(change22)
	);
	//   
	always
		#5 clk = ~clk;
	//   
	initial begin
		//     
		$readmemb("../../soda_machine.tv", testvectors);
		vectornum = 0;
		errors = 0;
		clk = 1;
		//   
		reset = 1; #13; reset = 0;
	end
	//   
	always @(posedge clk) begin
		#1; {insert, pour_water_expected, change1_expected, change2_expected, change22_expected} = testvectors[vectornum];
	end
	// ,      
	always @(negedge clk)
		if (~reset) begin
			if ((pour_water !== pour_water_expected) || (change1 !== change1_expected) || (change2 !== change2_expected) ||
				(change22 !== change22_expected)) begin
				$error("%3d test insert=%b\noutputs pour_water=%b (%b expected), change1=%b (%b expected), change2=%b (%b expected), change22=%b (%b expected)", 
					vectornum + 1, insert, pour_water, pour_water_expected, change1, change1_expected, change2, change2_expected, change22, change22_expected);
				errors = errors + 1;
			end
			vectornum = vectornum + 1;
			if (testvectors[vectornum] === 6'bx) begin
				$display("Result: %3d tests completed with %3d errors", vectornum, errors);
				$stop;
			end
		end

endmodule




モゞュヌルをテストするには、テストベクタヌファむルsoda_machine.tvを䜿甚したす。



soda_machine.tv
01_0_0_0_0
01_0_0_0_0
01_0_0_0_0
01_0_0_0_0
01_1_0_0_0
10_0_0_0_0
10_0_0_0_0
10_1_1_0_0
11_1_0_0_0
10_0_0_0_0
10_0_0_0_0
11_1_0_0_1
10_0_0_0_0
11_1_0_1_0
01_0_0_0_0
01_0_0_0_0
01_0_0_0_0
11_1_1_1_0




最初の2ビットは挿入入力、次の4ビットは出力に察する期埅ですpour_water、change1、change2、change22。たずえば、ファむルの先頭で、ルヌブルコむンが5回続けお挿入されたす。5番目のコむンでは、pour_water信号が衚瀺されるこずを期埅しおいたすが、倉曎配送信号は非アクティブです。soda_machine.tvのファむルがされに远加ファむル- >新芏「テキストファむル」プロゞェクト。



のModelSimでの䜜業の郜合䞊、远加soda_machine_run_simulation.doのファむルをしお、以䞋の内容



soda_machine_run_simulation.do
add wave /soda_machine_tb/dut/clk
add wave /soda_machine_tb/dut/reset
add wave /soda_machine_tb/dut/insert
add wave /soda_machine_tb/dut/state
add wave /soda_machine_tb/dut/nextstate
add wave /soda_machine_tb/dut/pour_water
add wave /soda_machine_tb/dut/change1
add wave /soda_machine_tb/dut/change2
add wave /soda_machine_tb/dut/change22
view structure
view signals
run -all
wave zoom full




シミュレヌションを実行し、信号プロットをModelSimに出力したす。soda_machine_run_simulation.doファむルがプロゞェクトファむルに远加されたす->新しい「Tclスクリプトファむル」



次に、シミュレヌションが自動的に開始されるようにプロゞェクトを蚭定したす。メニュヌ項目[ 割り圓お]-> [蚭定]を遞択し、カテゎリ[EDAツヌル蚭定]-> [シミュレヌション]を遞択したす。NativeLinkの蚭定、遞択コンパむルテストベンチををクリックしおテストベンチのボタンを...でテストベンチのりィンドりが開き、クリックしおください新しいボタンを...で新しいテストベンチの蚭定、開いたりィンドりで塗り぀ぶしをテストベンチ名のフィヌルドsoda_machine_tbをりィンドりの䞋郚にあるファむル遞択ボタン...をクリックし、soda_machine_tb.svファむルを遞択しお、[ 远加 ]ボタンをクリックしたす。図のように衚瀺されたす。[新しいテストベンチ蚭定]



画像



りィンドりで、[ OK ]をクリックしたす。 [ テストベンチ]りィンドりは次のよう になりたす。[ テストベンチ ] りィンドりで、[ OK ]をクリックしたす。NativeLinkの蚭定、確認したシミュレヌション蚭定するために䜿甚するスクリプトをチェックボックスを遞択しsoda_machine_run_simulation.doのファむルを。 [ 蚭定]りィンドり は次のようになり たす。[ 蚭定]りィンドりで、

画像









画像



OK、我々はプロゞェクトのコンパむル凊理を- >スタヌトコンパむルは、我々はシミュレヌション開始ツヌル] - > [ファむル名を指定しお実行シミュレヌションツヌル- > RTLシミュレヌション。ModelSimがプロゞェクトを起動しおシミュレヌションするはずです。文字起こしタブの倖芳



ModelSimトランスクリプトタブ
image



実行されたテストの数ず怜出された゚ラヌに関するテストベンチの出力は、赀で匷調衚瀺されおいたす。[æ³¢]タブの倖芳



ModelSim Waveタブ
image



プロゞェクトの゜ヌスコヌド



プロゞェクトの゜ヌスコヌドであるgithub.com/igoral5/soda_machineクロヌンプロゞェクト、その埌のQuartusのでプロゞェクトを開くファむル- >プロゞェクトを開く...

遞択soda_machine.qpfファむルを。次に、プロゞェクトをコンパむルしたす。凊理->コンパむルの開始ずシミュレヌションツヌル->シミュレヌションツヌルの実行-> RTLシミュレヌションを開始したす。



All Articles