-1

私は 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 しか使用できませんでした。デザインを提供する必要がありますか?

4

1 に答える 1

0

複数の入力を持つモジュールを使用することと、複数のモジュールをインスタンス化することの違いについて混乱しているようです。

まず、case ステートメント内でモジュールをインスタンス化することはできません。

S0: 
     begin
     //?!
                        MUX m1(in3,in4,1,out);  //WRONG
                        ALU a1(3,out,0);        //WRONG
                        nextstate <= S1;
     end
S1:

ALU をどこかに 1 つしか持てない場合は、その ALU を手続き型ブロックの外でインスタンス化します。次に、case ステートメントで、モジュールへの入力を必要な入力に割り当てます。次のようになります。

module FSM;
...
MUX m1(mux_in_a, mux_in_b, mux_sel, mux_out);
ALU a1(alu_in_a, alu_in_b, alu_out); 

// Next State Logic
always @(state)
case (state)
S0: 
     begin
         mux_in_a = in3;
         mux_in_b = in4;
         mux_sel = 1;

         alu_in_a = 3;
         alu_in_b = mux_out;

         nextstate = S1; //don't use nonblocking in combinatorial logic
     end
S1:

したがって、ALU と MUX が 1 つしかない場合でも、状態に基づいてそれらのモジュールに駆動される入力を選択します。

于 2014-05-28T20:55:55.557 に答える