タグ付けされた質問 「optimization」

12
開発およびデバッグ段階で最適化を無効にするのは本当に良い習慣ですか?
私はCでの16ビットPICマイクロコントローラーのプログラミングを読みました。 ただし、プロジェクトの開発およびデバッグ段階では、分析中のコードの構造を変更し、シングルステップやブレークポイントの配置に問題を引き起こす可能性があるため、すべての最適化を無効にすることをお勧めします。 私は少し混乱したと告白します。著者がC30評価期間のためにそれを言ったのか、それが本当に良い習慣であるのかを私は理解していませんでした。 このプラクティスを実際に使用しているかどうか、そしてその理由を知りたいのですが。

5
LTSpice Automation
バッテリー駆動のブーストコンバーターを使用しており、いくつかの種類のバッテリー(さまざまな電圧/電圧)に加えて、高電流(さまざまなデューティサイクル/周期)のさまざまな負荷条件で最大入力(バッテリー)電圧ドループを測定しようとしています内部抵抗)。私はそのような(比較的)長い操作時間をシミュレートしているので、シミュレーションファイルはかなり時間がかかりますが、もちろん時間がかかります。LTSpiceを自動化して、コンポーネントの値をプログラムで変更し、シミュレーションを再実行してデータ(電圧や電流などの値)をキャプチャできるようにします。そんなこと知ってる: WAVファイルは、プログラムからのデータの入出力に使用できます プログラムはコマンドラインから実行できます これまでのところ、私の最良のオプションは、目標を達成する方法で、これら2つのオプションと独自のコード/スクリプトを組み合わせて使用​​するようですが、すでにもっと良い方法があるのではないかと思います。 LTSpiceを自動化した人や、LTSpice向けに書かれた自動化APIが(メーカーまたはサードパーティによって)作成されたかどうかを知っている人はいますか? 理想的には、必要なパラメーターを与え、制約に対する「最適な」解決策が見つかるまでさまざまなコンポーネントの値を試すようなソルバーが必要です。

2
VHDLで「ドントケア」信号を指定するにはどうすればよいですか。
ロジックデザインコースでは、たとえば、カルノーマップまたはQuine–McCluskeyアルゴリズムを使用することにより、ロジック関数を最小化することが可能であることを学びました。また、それを学んだ「Do n't Care」値が最小化の可能性を高める。 たとえば、レジ​​スタファイルを取得します。するときの信号は本当に重要ではありません信号です。したがって、「Do n't Care」値を割り当てて、次のようなロジックでより最適化できるようにする必要があります。write_addresswrite_datawrite_enable'0'これらの信号を駆動(レジスタファイル自体ではない)でます。 合成ツールで可能な最適化の余地を増やすために、VHDLでこのような「Do n't Care」値を指定する正しい方法は何ですか? これまでのところ、次のような適切なものを見つけました。しかし、私はそれぞれのアプローチの長所と短所が何であるか本当にわかりません: 単に信号を割り当てない。これはうまくいくようです。ただしrecord、レコード定数を完全に指定する必要があるため(少なくともModelsimでそう指示されているため)、何らかのタイプの「何もしない定数」を定義する場合は機能しないことがわかりました。 std_logic_1164パッケージには、値定義'-' -- Don't careのためにstd_ulogic。これは、明示的な「ドントケア」に対する意味的に正しい選択のように見えますが、どこでも使用されたことはありません(無関係なVHDL-2008 case?コンストラクトを除く)。 Modelsimはこの値'X'を使用して未定義の信号を表示します。しかし、合成ツールが明示的なものを理解しているかどうかはわかりません'X'割り当てを「ドントケア」としてません。 わかりやすくするために過度に簡略化したコードスニペットを示します。ここでは、ドントケア信号を初期化しました。 '-'ます。 ご覧のとおり、信号にcontrol.reg_write_addressは3つの異なる値を設定できます:"----"、instruction(11 downto 8);およびinstruction(3 downto 0);。これ'-'は、「ドントケア」と解釈される場合、2入力マルチプレクサに合成されると予想されます。の(others => '0')代わりにを使用して信号を初期化した'-'場合、ツールは代わりに3入力マルチプレクサーを生成する必要があります。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; package mytypes is type control_signals_t is record write_enable : std_logic; write_address : std_ulogic_vector(3 downto 0); read_address : std_ulogic_vector(3 …

3
最も多くのリソースと領域を使用するFPGAデザインの領域を識別する方法
私は大規模なFPGAデザインに取り組んでおり、現在使用しているFPGAのリソース制限であるCSG225パッケージのザイリンクスLX16に非常に近づいています。 設計もほぼ完了していますが、現時点ではFPGAに収まりません。部品をオフにしてフィットさせることはできますが、デザインを完了し、タイミングとサイズの要件を満たすために、リソースの使用量を減らす必要があります。 設計のどの部分が最もリソースを消費しているかを特定するのに役立つレポートがツールにあるかどうかを知りたいです。私のデザインはパーティション分割されておらず、約12個以上のVHDLモジュールに分割されています。 ザイリンクスのタイミングレポートは素晴らしいものですが、スペース節約の観点から見れば、最高の価値をどこで得ることができるかを知る必要があります。 また、どのタイプのリソースが不足しているか、またはそれらのリソースにどのような影響があるのか​​を判断するのも困難です。 もう1つの面倒な点は、デザインが大きくなると、タイミングを満たすために使用されていたコンポーネントが配置が理想的ではなくなったために失敗し始めていることです。 現在、配置配線後のスタティックタイミングレポートを使用し、SmartXplorerを使用しています。タイミングを最適化するために設計戦略を使用しています。 デザインの一部をオフにしてフィットさせると、次のような結果が得られます。 スライスレジスタ使用率:42%スライスLUT使用率:96%完全に使用されたLUT-FFペアの数:38%これは、レジスターは軽いが、ゲート使用率が高いということですか? 開発者がエリアを最適化するのに役立つツールはありますか、少なくともコードについてより多くの洞察を与えることができますか? 更新: モジュールレベルの使用率を確認したところ、LUT全体の約30%を占める小さな接着剤非同期fifoがいたるところにあることがわかりました。高速バスのクロスクロックドメインの接着剤として使用しています。クロックは密接に関連しているため、これらを削除できるはずです。(120 MHz入力、DCMで100 MHzおよび200 MHzを生成)

10
整数mod 10と整数除算10を取得する最も速い方法は?
ハードウェアが係数または除算演算をサポートしていない場合、ソフトウェアによる係数/除算をシミュレートするには、さらに多くのCPUサイクルが必要です。オペランドが10の場合、除算と係数を計算するより速い方法はありますか? 私のプロジェクトでは、整数モジュラス10を頻繁に計算する必要があります。特に、PIC16Fで作業していて、LCDに数値を表示する必要があります。サポートする4桁があるため、係数と除算関数(ソフトウェア実装)への4つの呼び出しがあります。つまり、次のようになります。 digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // …

7
多くのウィンドウコンパレータの簡素化
私は8つのサーミスタを使用していますが、それぞれが温度ウィンドウ内にあることを確認する必要があります。それらはすべて同じウィンドウを持ち、どれが何個が有効範囲内にあるかは気にしません。それらすべてが(同じ)ウィンドウ内にあるかどうかを知る必要があります。これはハードウェアのみのソリューションであるため、ADC読み取りのソフトウェアシーケンスは問題外です。 現在、私の最善の解決策は、多数のコンパレータICを使用し、サーミスタごとに個別のウィンドウコンパレータを実装することです。ソリューションを最適化するために、それぞれにオープンドレイン出力を備えた複数のクワッドコンパレーターを使用して、それらをすべて接続することができます。それでも、本質的には同じ回路です。私が作成できるリファレンス/トリガー電圧は、バッファリングしてからすべてのコンパレータに供給します。 私は問題にコンパレーターの束を投げるだけで愚かだと思います。これ以上の方法がないかどうかはわかりませんが、私は主にボードスペースを最適化しようとしています。あなたが知っている創造的な方法はありますか?たとえば、すべてのサーミスタの最小/最大電圧を選択し、単一のウィンドウコンパレータを使用します(編集:2つのコンパレータofc)。これは、IMHOがより大きなソリューションをもたらすため、良い答えではありません。インスピレーションを得るためにこれについて言及します。 編集:私はソフトウェアベースのソリューションが最善であることを知っています。それが、誰もがそれを示唆するのを防ぐために、冒頭と前にそれを述べた理由です。問題がこのように定義されている理由は、これは安全回路であり、仕様ではソフトウェアモニターに加えてハードウェアのみのソリューションを実装する必要があるためです。したがって、ソフトウェアベースのソリューションはすでに存在しています。ハードウェアベースのソリューションを実装するための最良の方法を見つける必要があるだけです。


4
GCCコンパイラが一部のコードを省略しているのはなぜですか?
GCCコンパイラが近隣のまったく同じコードを保持しながら、なぜコードの一部を切り取るのか理解できません。 Cコード: #define setb_SYNCO do{(PORTA|= (1<<0));} while(0); ISR(INT0_vect){ unsigned char i; i = 10; while(i>0)i--; // first pause - omitted setb_SYNCO; setb_GATE; i=30; clrb_SYNCO; while(i>0)i--; // second pause - preserved clrb_GATE; } LSSの対応する部分(コンパイラーによって作成されたアセンブラーファイル): ISR(INT0_vect){ a4: 1f 92 push r1 a6: 0f 92 push r0 a8: 0f b6 in r0, 0x3f …
9 avr  c  avr-gcc  optimization  gcc 

1
ループが離れて最適化されている間
マイクロコントローラープログラムに次のコードがあります。 // Wait for ADC conversion to complete while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {} ADCSRAは、アナログ変換が完了するとその値を変更するレジスタであり、ビットがクリアされるのを待ちたい場所です。このビットは、変換が完了したことを示します。 結果のアセンブリコードを見ると、ループ全体が1つの命令に置き換えられています。 in r24, 0x06 ; ADCSRA レジスタは読み込まれますが、その値はテストされていません!? プログラムを不必要に遅延させることなく、レジスターを再チェックし続けるようコンパイラーに指示するには、C ++コードをどのように変更する必要がありますか? 私はavr-gccツールチェーンを使用しています。 編集: 私は次のようにコードを変更しました(Thnx:lhballoti): while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.