論理シフタ

入出力

名前 入力・出力 ビット幅 説明
din 入力 N
shift 入力 log N シフト幅
dout 入力 N

動作例

入力 出力
din shift dout
10010111 0 10010111
10010111 1 00101110
10010111 2 01011100
10010111 3 10111000
10010111 4 01110000
10010111 5 11100000
10010111 6 11000000
10010111 7 10000000
  • shiftのビット幅をlog N + 1ビットとするとシフタ+AND回路が推定されてしまうのでlog Nビットとする。

このとき、AND回路はshift=8のときに出力を0クリアするために用いられる

コード

  • VerilogHDL
logical_shifter.v
module logical_shifter(din, shift, dout);
  parameter N = 8;
  parameter LOG_N = 3;
 
  input [N-1:0] din;
  input [LOG_N-1:0] shift;
  output [N-1:0] dout;
 
  assign dout = din << shift;
 
endmodule
  • VHDL
logical_shifter.vhd
library	IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
 
entity logical_shifter is
  generic(N : integer := 8;
          LOG_N : integer := 3);
  port(din : in std_logic_vector(N-1 downto 0);
       shift : in std_logic_vector(LOG_N-1 downto 0);
       dout : out std_logic_vector(N-1 downto 0) );
end logical_shifter;
 
architecture logical_shifter_body of logical_shifter is
begin
 
  dout <= SHL(din,shift);
 
end logical_shifter_body;

sll演算子は型変換を使わないといけないようなので、ライブラリfunctionを利用しました。

シミュレーション

  • テストベンチ(VerilogHDL)
logical_shifter_tb.v
`timescale 1ns / 1ps
module logical_shifter_tb;
  parameter N = 8;
  parameter LOG_N = 3;
 
  reg [N-1:0] din;
  reg [LOG_N:0] shift;
  wire [N-1:0] dout;
 
  logical_shifter logical_shifter_d(.din(din), .shift(shift), .dout(dout));
 
  initial begin
    din = 8'b10010111; shift = 0;
    #100 shift = 1;
    #100 shift = 2;
    #100 shift = 6;
    #100 shift = 7;
    #100 shift = 8;
    #100 din = 0; shift = 0;
  end
 
endmodule
  • テストベンチ(VHDL)
multiplexer_tb.vhd
library ieee;
use ieee.std_logic_1164.all;
 
entity logical_shifter_tb is
end logical_shifter_tb;
 
architecture logical_shifter_tb_body of logical_shifter_tb is
 
  component logical_shifter
    generic( N : integer := 8;
             LOG_N : integer := 3 );
    port( din : in std_logic_vector(N-1 downto 0);
          shift : in std_logic_vector(LOG_N-1 downto 0);
          dout : out std_logic_vector(N-1 downto 0) );
   end component;
 
  signal din, dout : std_logic_vector(N-1 downto 0);
  signal shift : std_logic_vector(LOG_N-1 downto 0);
 
begin
  logical_shifter_d: logical_shifter port map(
    din => din,
    shift => shift,
    dout => dout
  );
 
  process
  begin
    din <= "10010111"; shift <= X"0";
    wait for 100 ns; shift <= X"1";
    wait for 100 ns; shift <= X"2";
    wait for 100 ns; shift <= X"3";
    wait for 100 ns; shift <= X"4";
    wait for 100 ns; shift <= X"5";
    wait for 100 ns; shift <= X"6";
    wait for 100 ns; shift <= X"7";
    wait for 100 ns; din <= "00000000"; shift <= X"0";
    wait;
  end process;
 
end;