0
    module fa(a,b,cin,cout,sum);
        input a;
        input b;
        wire bxor;
        input cin;
        output cout;
        output sum;

        assign  bxor = b ^ cin;
        assign  sum  = ((a^bxor)^(cin));
        assign  cout = ((a&bxor)|((a^bxor)&cin));
endmodule

module rca(a,b,cin,cout,sum);
        input cin;
        output cout;
        output [7:0] sum;
        input [7:0] a, b;
        wire c[6:0];     

        fa first(a[0],b[0],cin,c[0],sum[0]);
        fa second(a[1],b[1],c[0],c[1],sum[1]);
        fa third(a[2],b[2],c[1],c[2],sum[2]);
        fa fourth(a[3],b[3],c[2],c[3],sum[3]);
        fa fifth(a[4],b[4],c[3],c[4],sum[4]);
        fa sixth(a[5],b[5],c[4],c[5],sum[5]);
        fa seventh(a[6],b[6],c[5],c[6],sum[6]);
        fa eighth(a[7],b[7],c[6],cout,sum[7]);
endmodule

module alu_op(a,b,op,out);
        input [7:0] a, b;
        input [2:0] op;
        output [7:0] out;
        output reg out1;

        always @ (op or a or b)
                case (op)
                        3'b000 : out1 = fa(a, b, op[0], op[0], out);
                        3'b001 : out1 = fa(a,b,op[0], op[0], out);
                        //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
                        3'b011 : out1 = a ^ b;
                        3'b100 : out1 = a | b;
                        3'b101 : out1 = a & b;
                endcase
endmodule

caseステートメントで関数を呼び出すことができないためだと思います。私はこれにまったく慣れておらず、何をすべきかわかりません。私は基本的に alu を作成しており、最初の 2 つのケースは add と sub を行うことになっています。

コンパイルすると、次のようになります。

alutester.vl:66: error: No function fa in this context (alu.utt).
alutester.vl:67: error: No function rca in this context (alu.utt).

理由がわかりません。誰かが私を助けてくれますか?

4

2 に答える 2

2

という関数がなく、というモジュールfa作成しました(それらは同じものではありません)。また、手続き型ブロック内でモジュールをインスタンス化することはできません。fa

また、これらのモジュールで何をしようとしているのかも明確ではありません。これが何を意味するのかわかりません

out1 = fa(a, b, op[0], op[0], out);

まず第一に、あなたは op[0] を cin と cout の両方に結び付けていますが、これは間違っているようで、どの値out1を取るべきかが明確ではありません。加算器の合計出力を取得することになっていますか? fa の出力から out1 を取り出したい場合は、それを always ブロックの外でインスタンス化し、必要に応じて out1 をモジュールからのワイヤと等しく設定します。

于 2013-11-26T16:09:57.080 に答える
1

見てみましょう... 8 ビットの加算器であるrcaモジュールを作成しました。

後で、入力オペランドとしてaandを取り、実行する操作に応じて割り当てるALU のように見えるものがあります。bout1

plusの合計を利用できるようにするために、モジュールでrcaモジュールをインスタンス化します...alu_opab

module alu_op(a,b,op,out);
        input [7:0] a, b;
        input [2:0] op;
        output [7:0] out;
        output reg out1;

        wire [7:0] sum;
        rca my_adder(.a(a),.b(b),.cin(1'b0),.sum(sum))

        always @ (op or a or b)
                case (op)
                        3'b000 : out1 = sum;
                        //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
                        3'b011 : out1 = a ^ b;
                        3'b100 : out1 = a | b;
                        3'b101 : out1 = a & b;
                endcase
endmodule

または (確かに良いでしょう)、+演算子を使用して、コンパイラに加算器を構築する方法を理解させます。

module alu_op(a,b,op,out);
        input [7:0] a, b;
        input [2:0] op;
        output [7:0] out;
        output reg out1;

        always @ (op or a or b)
                case (op)
                        3'b000 : out1 = a + b;
                        //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
                        3'b011 : out1 = a ^ b;
                        3'b100 : out1 = a | b;
                        3'b101 : out1 = a & b;
                endcase
endmodule

ところで: ビット シフトも有効な Verilog オペランドです。また、減算 (操作 001 の場合) が必要であると確信しているため、マイナス-演算子も使用できます。足し算、ビットシッティング、引き算も合成可能です。

于 2013-11-26T16:42:46.737 に答える