私はまだ VHDL のいくつかの癖に慣れようとしていますが、少し問題があります。まず、rol、ror、ssl、srl などのシフト演算子は合成できないことを理解しています。このラボの目的は、ゴールデン モデルを使用して、テストベンチで同じものの合成可能なバージョンと照合することです。
このプログラムの目的は、温度計コードを 3 ビットの 2 進数に変換することです。つまり、温度計コード「00000001」=「001」、「00000011」=「010」、「00000111」=「011」など、基本的に文字列の1の数を右から数えようとしています左へ。1 のストリングの間に '0' が配置されることはありません。そのため、ベクトル "00011101" は無効であり、決して発生しません。
私は、どのように機能させるかを理解できない、合成不可能な (そしてこれまでのところ、コンパイル不可能な) アルゴリズムを考案しました。基本的には、温度計コードを読み取り、それを右にシフトして、温度計コードがゼロになるまでカウンターをインクリメントし、そのカウンター値を 3 ビットの std_logic_vector に割り当てるという考え方です。以下は、これまでに行ったコードです。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity therm2bin_g is
port(therm : inout std_logic_vector(6 downto 0); -- thermometer code
bin : out std_logic_vector(2 downto 0); -- binary code
i : integer range 0 to 7);
end therm2bin_g;
architecture behavioral_g of therm2bin_g is
begin
golden : process(therm)
begin
while(therm /= "00000000") loop
therm <= therm srl 1;
i = i + 1;
end loop;
bin <= std_logic'(to_unsigned(i,3));
end process golden;
behavioral_g;