vhdl に変換したい Verilog コードの次の行があります。
assign {cout,sum} = ( add ) ? ( in_a + in_b + cin ) : ( in_a - in_b - cin );
vhdlでこれを行うにはどうすればよいですか?
vhdl に変換したい Verilog コードの次の行があります。
assign {cout,sum} = ( add ) ? ( in_a + in_b + cin ) : ( in_a - in_b - cin );
vhdlでこれを行うにはどうすればよいですか?
事実上同じ方法で行います。出力キャリー用の「スペースを作る」ために、入力値の幅を増やすことを覚えておく必要があります。
(cout, sum) <= ('0'&in_a) + ('0'&in_b) + cin when(add='1') else ('0'&in_a) - ('0'&in_b) - cin;
その行は非常に見苦しく、理解しにくいため、すべてをプロセスに変換することをお勧めします。
process(in_a, in_b, cin) begin
if(add='1') then
(cout, sum) <= ('0'&in_a) + ('0'&in_b) + cin;
else
(cout, sum) <= ('0'&in_a) - ('0'&in_b) - cin;
end if;
end process;
これは少なくとももう少し読みやすいです。
編集:
これは VHDL 2008 でのみ機能することに注意してください。以前のバージョンでは、入力より 1 幅広い中間信号を作成し、結果をそれに割り当ててから、cout と sum を抽出する必要があります。
process(in_a, in_b, cin)
-- Assumes in_a and in_b have the same width, otherwise
-- use the wider of the two.
variable result : unsigned(in_a'length downto 0);
begin
if(add='1') then
result := ('0'&in_a) + ('0'&in_b) + cin;
else
result := ('0'&in_a) - ('0'&in_b) - cin;
end if;
cout <= result(result'high);
sum <= result(result'high-1 downto 0);
end process;