私の背景はソフトウェアになっています。(システム)Verilogには新しかったので、シーザーシフターを実装することになっていました(文字をN文字でシフトし、 3だけシフトABCXYZはDEFABCになります)、私は私がソフトウェアの場合と同様に、コードの重複を減らすことができることを期待して、次のように書いた:範囲を包むためのVerilogモジュラス演算子
/* every variable except 'direction' has the type 'byte' */
always_comb
begin
shifted_char = fresh_char; /* don't touch bytes that aren't letters */
is_lower_case = "z" >= fresh_char && fresh_char >= "a";
is_upper_case = "Z" >= fresh_char && fresh_char >= "A";
if (is_lower_case || is_upper_case)
begin
unique if (is_lower_case)
alphabet_start = "a";
else if (is_upper_case)
alphabet_start = "A";
alphabet_position = fresh_char - alphabet_start;
if (direction == "f") /* direction is a module parameter: f for forwards results in a shifter, any other value results in an 'unshifter' */
new_alphabet_position = (26 + (alphabet_position + shift_by)) % 26;
else
new_alphabet_position = (26 + (alphabet_position - shift_by)) % 26;
shifted_char = new_alphabet_position + alphabet_start;
end
end
私の質問は、()、それは前方にシフトだと仮定している:「%について26 "の部分では、シンセサイザーがその時点で得られる可能な値の範囲が[26、26 + 25 + 25]([26、76])であると推論できるので、 (> 26と> 52)を区別するのではなく、すべての可能な256の異なる入力を扱うときスマートコール - (> 26、> 52、> 78などのケースを考えることになるでしょうか?それとも良い方法がありますか?私は逃げる...)]?
は、私はいつも次の操作を行うことができます:
new_alphabet_position = alphabet_position + shift_by;
if (new_alphabet_position > 25)
new_alpahbet_position -= 26;
/* Or, for the reverse shifter: */
new_alphabet_position = alphabet_position - shift_by;
if (new_alphabet_position < 0)
new_alpahbet_position += 26;
を...しかし、興味があったと(私はより多くの人が答えることができるようになります期待している)ことを尋ねるだけでなく、関連する1たかった:CAN通常の非2のカウンター(例えば、 カウント< =(count + 1)%6; )を使用するために使用されますか? VHDLシンセ・ツールは、少なくとも1つのVHDLシンセ・ツールがそれを意図したとおりに解釈するかのように、hgleamon1の応答になります。https://forums.xilinx.com/t5/Synthesis/Modulus-synthesizable-or-non-synthesizable/td-p/747493
にも、ソフトウェアの観点から、これが最も効率的なプログラムではありません。ハードウェアに関しては、いくつかの全加算器と分周器(%)を合成するように要求しています。もし醜い結果を生み出すことができます。すべてのアルゴリズムを再考する必要があるようです。また、クロックと何らかの形で同期させる必要があります。 – Serge
@Sergeソフトウェアではどのように非効率的ですか?ハードウェアに関しては、合成ツールが論理的に同等のものを見つけたり、除算器を合成したりしないでしょうか?加算器に関しては、それは私にとってやむを得ないことです。ではない? – PistoletPierre
私はあなたがアスキー文字だけで作業しているので、特殊なアルファベットを使用して+/- 26の余分な演算、特にモジュロ演算子を取り除くなど、別のアプローチを見つけることができるかもしれません。ソフトウェアでは、パフォーマンスがあまり意味を持たないプログラムのための追加の指示を許可することができます。ハードウェアでは、パフォーマンス、電力、面積、コストなどに大きな影響を与える可能性のあるシリコン/ラッツの無駄使いを始めます... – Serge