私は Verilog を初めて使用し、取り組むべき興味深い演習をいくつか見つけましたが、私が立ち往生している演習が 1 つあります。誰か助けてもらえますか ???
エクササイズ:
入力にいくつかの値が与えられると、その方程式の解が得られる算術方程式システムを実装します。システムの擬似コードは次のようになります。
t1 := in1 * in2
t2 := 3 + in3
t3 := 3 + in4
t4 := t1 - t2
out1 := in2 * t3
out2 := in1 * t4
このシステムで使用できる ALU には 2 つのタイプがあります。最初のタイプは、加算および減算 (+/-) 演算を実行できます。選択信号を使用して、ALU に実行させたい操作を選択できます。2 番目のタイプの ALU は、乗算演算 (*) のみを実行します。3 つの加算器/減算器 ALU と 2 つの乗算器 ALU しかありません。
実装:
システムを実装する前に、次の手順に従ってシステムの設計図を作成する必要があります。
1) システムのすべての入力を
特定する 2) 必要なすべてのレジスタとその入力を
特定する 3) 必要なすべての機能ユニットとその入力を特定する.
4) 機能ユニットの入力にマルチプレクサが必要かどうかを
判断します。 5) 設計に必要なすべての制御信号を決定します。
6) これらの信号を制御するために必要な有限ステート マシンを設計
します。 7) システムに必要なすべてのワイヤを決定します。
Verilog の実装:
このセクションでは、次の手順に従って、Verilog を使用して 4 ビットの算術方程式システムを構築する必要があります
。1) デザインに必要なすべての 4 ビット コンポーネントを個別のモジュール (ALU、MUX、REG) に実装します。
2) 疑似コードで指定された目的の動作を通じてデータパスをガイドする FSM ベースのコントローラーを作成します。
3) FSM をシミュレートして、必要なパターンの制御信号を出力していることを確認し
ます。 4) クロック ボタン入力とリセット ボタン入力を備えたシステム モジュールを作成します。このモジュールは、算術方程式ソルバーの設計を実装し、それを制御する FSM のインスタンスを含みます。
5) デザインをコンパイルし、すべてのエラーをデバッグします。
6) 入力のさまざまな値に対して設計をシミュレートし、設計が適切に機能していることを確認します。
コード:
module ALU(in1,in2,select,out);
input [3:0] in1,in2;
input select;
output[3:0] out;
reg [3:0] out;
always @ (in1,in2,select)
begin
if(select==0) out=in1+in2;
else out=in1-in2;
end
endmodule;
module ALU(in1,in2,out);
input [3:0] in1,in2;
output [3:0] out;
reg [3:0] out;
always @ (in1,in2)
begin
out=in1*in2;
end
endmodule;
module Register(in,clock,out);
input [3:0] in;
reg [3:0] out;
input clock;
output[3:0] out;
always@(posedge clock)
begin
out=in;
end
endmodule;
module MUX(in1,in2,select,out);
input select;
output[3:0] out :
input [3:0] in1,in2;
always @(in1,in2,select)
begin
case(select)
0:out=in1;
1:out=in2;
end
endmodule;
そして、ここで私は何をすべきかわかりません:
module FSM(clk, reset, select, out1, out2,in1,in2,in3,in4);
input clk,reset,in1,in2,in3,in4;
output select, out1, out2;
reg select, out1,out2;
reg [1:0] state;
reg [1:0] nextstate;
parameter S0 = 0;
parameter S1 = 1;
parameter S2 = 2;
parameter S3 = 3;
// State Register
always @(negedge clk or negedge reset)
if (reset == 0) state <= S0;
else state <= nextstate;
// Next State Logic
always @(state)
case (state)
S0:
begin
//?!
MUX m1(in3,in4,1,out);
ALU a1(3,out,0);
nextstate <= S1;
end
S1:
begin
end
S2:
begin
nextstate <= S3;
end
S3:
begin
nextstate <=S0;
end
default: nextstate <= S0;
endcase
endmodule;
PS: 私の設計では、乗算演算を実行する 1 つの ALU と、加算および減算演算を実行する別の ALU しか使用できませんでした。デザインを提供する必要がありますか?