2017-02-16 18 views
-1

私は16×16モンゴメリ乗算器を設計しました。このコードでは、16×16の乗算器を使用して3回の乗算を行います。乗算は同じ乗算器を使用して順次実行され、各乗算の結果はレジスタに記憶される。単一の16×16乗算器は約1550MHzの周波数で動作するが、3回の乗算を直列に実行すると、モンゴメリ乗算器(単一の16×16乗算器を3回使用する)の周波数はほぼ500MHzに低下する。私は周波数の低下を避けたいと思うし、単一乗数の周波数でそれを操作したい。これで助けが必要です。モンゴメリ乗算の頻度

コードと共に提供される。(唯一の乗算は、この場合に設けられている。追加、シフトを簡単にするために除外されている)

`define m 11 
`define mbar 245 
module test_mul(a,b,clk,reg2,reset); 

input [15:0] a,b; 
input clk,reset; 
output reg [31:0] reg2; 


reg [15:0] x,y; 

reg [31:0] reg0,reg1; 
reg [5:0] count; 

wire [31:0]p; 


test_mul16 a1 (x,y,clk, p); 


always @ (posedge clk) 
begin 
if (reset) 
begin x <= a; y <= b; count= 6'd0 end 

else begin 

if (count == 11) 
reg2 <= p; 
if (count == 12) 
begin x <= reg0[15:0]; y <=`mbar; end 
if (count == 27) 
reg1 <= p; 
else if (count == 28) 
begin 
x <= reg1[15:0]; 
y <= `m; 
end 
else if (count == 39) 
begin 
reg2 <= p; 
end 

count = count+1; 

end 
end 

endmodule 

module test_mul16(a,b,clk,reg2); 

input [15:0] a,b; 
input clk; 
output reg [31:0] reg2; 

reg [31:0] reg0, reg1; 
always @ (posedge clk) 
begin 
reg0<= a*b; 
reg1<=reg0; 
reg2<=reg1; 
end 
endmodule 
+0

http://electronics.stackexchange.com/ – toolic

+1

に適している可能性があります。FPGAツールは、異なるタイプの乗算器が構成に最適であると判断している場合があります。制約を使用してツールの自由度を制限する必要があります。しかし、率直に言って、あなたがしようとしていることを理解するのは難しいです。これらの見かけ上ランダムなカウンタ値は何ですか?なぜ出力を遅らせるためにtest_mul16が乗算をレジスタに渡すのですか?また、reg0は使用前に値に設定されません。 – Hida

+0

問題を確認するためにいくつかの質問があります。これはタイミング問題ですか?あなたは、シリアル乗算器が実行されるとき、単一の乗算器を実行するときに1.55Ghzのクロック周波数に設計されたが、500Mhzに時間がかかると言っていますか?状態変数(count)がありますが、何もサイクルを何もしないように見えるので、これはバックエンドのタイミング問題ですが、確かに確認したいと確信しています。 –

答えて

0

がOKので、ひだは、これがあると言うコメントに基づいてタイミングの問題、私はここにいくつかのことが起こっていると思う。私はあなたがタイミングを改善するのを助けることができますが、私は1.5Ghzに達することができるとは確信していません。使用しているベンダーもお知らせください。

ifがリセットされていますが、すべての変数をリセットするわけではありません。初期化されていないものがないことが分かっている限り、これは大丈夫です。しかし、ここの本当のところは、多くの新しいFPGAテクノロジが必要な場合にリセットを使用したくないということです。私はあなたが入力aとbを使ってxとyをリセットしていることに気付きます。これをする必要がありますか? xとyをそれぞれaとbにリセットする必要がない場合、それらをリセットから削除することができ、タイミングが改善されます。

あなたの状態機械は、(可変状態を使用して)熱いものではありません。あなたは1つのホットを使用してコーディングを見ることができます、そしてそれはあなたに少しブーストを与えるでしょう。

これを行うには、40ビットレジスタをカウントし、40'h00001にリセットしてからクロックに割り当てます。< = {count [38:0]、count [39]}; その後、個々のビットを使用してロジックをトリガします。

次に、あなたの場合は、あなたは一回限りの束を持っています。場合によっては、同じ変数を割り当てる複数のifがあります。これはおそらく大丈夫ですが、シンセサイザーはおそらくいくつかのことを実行する必要があり、異なる方法でコードを記述すると効率的ではないかもしれません。 case文を使用してみてください。いくつかのもの エンド 40'd12を行う を開始:あなたはこの 場合のようになりますあなたのケース文の上にワンホット提案に従っている場合 40'd11(カウント) は、いくつかの他のもの エンド などを行い始めます。.. 。 エンドケース

最後に、あなたのIFの中にも、ifとelseが続いています。あなたは基本的に割り当て27,28,39の優先度を優先しているので、上記のこのステートメントにマッサージされたものを入手してください。一つの変数については、値の間に優先順位がありません。値は27,28、または39などのいずれかであり、論理は決して1つの状態を別の状態よりも選択することはありません。

これらの変更を行った場合、スピードが上がるはずです。あなたが1.5Ghzをヒットしたと言っているベンダーを本当に知りたいですか?