【VHDL】バレル・シフト回路とrange-based loop
バレル・シフト回路
以下に,バレル・シフト回路のVHDLソースコードを表示する.
-- Barrel Shifter library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.numeric_std.all; entity BShifterNbit is generic (N : integer := 3); port ( A : in std_logic_vector((2**N) - 1 downto 0); S : in std_logic_vector(N - 1 downto 0); Z : out std_logic_vector((2**N) - 1 downto 0) ); end BShifterNbit; architecture RTL of BShifterNbit is begin process(A, S) variable sc : integer; begin sc := to_integer(unsigned(S)); --Debugsc := conv_integer(S); for I in A'range loop --Debug--for I in 0 to 7 Loop if (I + sc <= A'left) then Z(I + sc) <= A(I); else Z(I + sc - A'left - 1) <= A(I); end if; end loop; end process; end RTL;
[引用]range-based loop
for i in a'range loop
...;
end loop;
aの配列またはバスの範囲がある限りiを増加させながらループを繰り返す。
processの中で利用する。
参考文献
【VHDL】パリティ回路とセンシティビティリスト
パリティ回路
-- Even Parity Circuit library IEEE; use IEEE.std_logic_1164.all; entity ParityNbit is generic (N : integer := 4); port ( A : in std_logic_vector(N - 1 downto 0); P : out std_logic ); end ParityNbit; architecture RTL of ParityNbit is begin process(A) variable tmp : std_logic; begin -- even parity -> tmp := '0' -- odd parity -> tmp := '1' tmp := '0'; for I in 0 to N - 1 loop tmp := tmp xor A(I); end loop; P <= tmp; end process; end RTL;
今回のパリティ回路ではXORを使って,パリティビットを決定する.
手計算を行えば,理屈はわかると思うが, 偶数パリティの時,
tmp := '0';
奇数パリティの時,
tmp := '1';
とすればよい.
センシティビティリスト
センシティビティリストは,process文の機能で,
process(A) begin --<順次処理文> end process;
という風に使用する.
この機能は,信号名をカンマで区切って並べたリストで,
ここに記述された信号に変化があると以下の式が活性化されて実行される.
参考文献
Survey 2016/04/08
プログラミングのスキルの向上だけを書くブログではなく,
色々なスキル,学習記録を書くブログだったことを思い出し,
今回は,アルゴリズムの勉強とかではなく,
Surveyの記録を公開しようかなと思います.
英語の論文読める力を付けたいですね.