aboutsummaryrefslogtreecommitdiff
path: root/src/rl8b.vhd
blob: 3f897375c90fd186f91022d8f8166bc566bfae5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

entity rl8b is
	port (
		A, S: in std_logic_vector(7 downto 0);
		X: out std_logic_vector(7 downto 0));
end rl8b;

architecture Behavioral of rl8b is
	signal sr_val: std_logic_vector(7 downto 0); -- shift right value
	signal part_l, part_r: std_logic_vector(7 downto 0); -- left and right part of cylinder
	component sl8b
		port (
			A, S: in std_logic_vector(7 downto 0);
			X: out std_logic_vector(7 downto 0));
	end component;
	component sr8b
		port (
			A, S: in std_logic_vector(7 downto 0);
			X: out std_logic_vector(7 downto 0));
	end component;
	component min8b
		port (
			A: in std_logic_vector(7 downto 0);
			B: in std_logic_vector(7 downto 0);
			Cin: in std_logic;
			X: out std_logic_vector(7 downto 0);
			Cout: out std_logic);
	end component;
begin
	calc_sr_val: component min8b
		port map(
			A => x"08",
			B => S,
			Cin => '0',
			X => sr_val,
			Cout => open);
	left: component sl8b
		port map(
			A => A,
			S => S,
			X => part_l);
	right: component sr8b
		port map(
			A => A,
			S => sr_val,
			X => part_r);
	X <= part_l or part_r;
	-- this rotate-shifts using two bitshifts
	-- C expression with same functionality:
	-- (uint8_t) X = (A << S) | (A >> (8-S));
end Behavioral;