0

質問をうまく説明していなかったことに気付いたので、今、質問を詳しく説明しています。

Verilog初心者です。言語を学ぶために、いくつかのサンプル アプリケーションを作成しています。現在、 Floyd-Steinbergアルゴリズム
を使用して 8 ビット BMP イメージをハーフトーン BMP イメージに変換する Verilog コードを作成しています。基本的に、上記のアルゴリズムを使用して、8ビットのピクセルを1ビットに変換しています。

このアルゴリズムのサンプル コードは、『Advanced Digital Design with the Verilog HDL - Michael D. Ciletti』の 555 ページに掲載されています。ModelSim でデザインのシミュレーションに成功しました。

問題は、サイズが 6 x 8 の画像の例が示されていることですが、学習と練習のために、このコードをさまざまな形式とサイズに変換しようとしています。最初の目標として、サイズ 1000 x 1000 の画像で動作するように、このコード (既によく理解しています) を変更しようとしています。この例は 48 ピクセル (6 x 8) のみのためだったので、命令を書く方が簡単でした。以下のコードに示すように、モジュール内で手動で。しかし、10,00000 ピクセル (1000 x 1000) の場合、コードを変更するにはどうすればよいですか。私はそのような方程式を書くことができません:

  PPDU a0(err_1,htpv_1[1],8'b00,8'b00,8'b00,8'b00,pixel_1);

手動で 10,00000 (以下のコードを参照してください)。

この仕事を自動化する方法が必要だと思います。

CI では、多くのこと自動化するために for ループを使用できます。しかし、Verilog の初心者なので先に進むことができません。誰かが私に役立つリンクを教えてくれれば、本当に感謝します。

// pixel processor datapath unit//
module PPDU(err_0,htpv,err_1,err_2,err_3,err_4,pv);
output [7:0]err_0;
output htpv;
input [7:0]err_1,err_2,err_3,err_4,pv;
wire [9:0]cpv,cpv_round,e_av;
parameter w1=2,w2=8,w3=4,w4=2;
parameter threshold =128;
assign e_av=(w1*err_1+w2*err_2+w3*err_3+w4*err_4)>>4;
assign cpv=pv+e_av;
assign cpv_round=(cpv<threshold)?0:255;
assign htpv=(cpv_round==0)?0:1;
assign err_0=cpv-cpv_round;
endmodule

module image_converter (pixel_1,pixel_2,pixel_3,pixel_4,pixel_5,pixel_6,pixel_7,pixel_8,pixel_9,
   pixel_10,pixel_11,pixel_12,pixel_13,pixel_14,pixel_15,pixel_16,pixel_17,
   pixel_18,pixel_19,pixel_20,pixel_21,pixel_22,pixel_23,pixel_24,pixel_25,
   pixel_26,pixel_27,pixel_28,pixel_29,pixel_30,pixel_31,pixel_32,pixel_33,
   pixel_34,pixel_35,pixel_36,pixel_37,pixel_38,pixel_39,pixel_40,pixel_41,
   pixel_42,pixel_43,pixel_44,pixel_45,pixel_46,pixel_47,pixel_48,htpv_1,
      htpv_2,htpv_3,htpv_4,htpv_5,htpv_6
      );
 input [7:0]pixel_1,pixel_2,…..,pixel_47,pixel_48;
 output [1:8]htpv_1,htpv_2,htpv_3,htpv_4,htpv_5,htpv_6;
 wire [7:0]err_1,err_2,……., err_47,err_48;
 PPDU a0(err_1,htpv_1[1],8'b00,8'b00,8'b00,8'b00,pixel_1);
 ...
 PPDU a7(err_8,htpv_1[8],err_7,8'b00,8'b00,8'b00,pixel_8);                       
 PPDU b1(err_9,htpv_2[1],8'b00,8'b00,err_1,err_2,pixel_9);
 ...     PPDU b8(err_16,htpv_2[8],err_15,err_7,err_8,8'b00,pixel_16);
 PPDU c1(err_17,htpv_3[1],8'b00,8'b00,err_9,err_2,pixel_17);
 ….
 PPDU c8(err_24,htpv_3[8],err_23,err_15,err_16,8'b00,pixel_24);
 PPDU d1(err_25,htpv_4[1],8'b00,8'b00,err_17,err_18,pixel_25);
 ….
 PPDU d8(err_32,htpv_4[8],err_31,err_23,err_24,8'b00,pixel_32);
 PPDU e1(err_33,htpv_5[1],8'b00,8'b00,err_25,err_26,pixel_33);
 ….
 PPDU e8(err_40,htpv_5[8],err_39,err_31,err_32,8'b00,pixel_40);
 PPDU fi(err_41,htpv_6[1],8'b00,8'b00,err_33,err_34,pixel_41);
 ….
 PPDU f8(err_48,htpv_6[8],err_47,err_39,err_40,8'b00,pixel_40);  
 end
 endmodule
4

2 に答える 2

0

ピクセルごとにモジュールをインスタンス化しているようです。これで問題ありませんが、1000x1000 の画像には多くのハードウェアを使用することになります。これは、各モジュールが多数のゲートとフリップフロップであるためです。これにより、イメージ全体を「一度に」変換することになります。これは、非常に多くのピンであるこのハードウェアにイメージ全体を「一度に」取得する必要があることも意味します。

おそらくやりたいことは次のいずれかです。

  • イメージをメモリに保存し、ステート マシンを書き込んでメモリの関連部分を読み取り、ディザリングを実行して書き戻す
  • ディザリングを実行するのに十分な前のピクセルの知識を保持するロジックを介して画像をストリーミングします。私は FS ディザリングについてはあまり詳しくありませんが、おそらく、処理されている行よりも 1 つまたは 2 つ上の行についての知識が必要なだけです。
于 2013-01-16T10:59:24.197 に答える
0

2つの考え:

  1. ステートメントを一種のループとして使用して、generate入力するには多すぎるモジュールをインスタンス化できます。私はこの構造にあまり詳しくありませんが、おそらくこのキーワードをグーグルで検索すると正しい方向に導かれるでしょう。

  2. verilog はハードウェアの記述言語ですが、実際にファイルを手動で書き出す必要はありません。Verilog ファイルの生成には、好きなプログラミング言語を自由に使用できます (Perl が私のお気に入りです)。何らかのアルゴリズムに従って 100 万個のモジュールを生成する必要がある場合、100 万行の verilog ファイルを出力する簡単なスクリプトを作成できます。手動で記述する必要はありません。

于 2013-01-16T07:18:58.630 に答える