电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

移位存放器的VHDL描写

2017-09-12 16:24分类:电工考证知识 阅读:

 

8位移位存放器

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY shifter IS

PORT (

data_in: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--输入的数据

n: IN STD_LOGIC_VECTOR(2 DOWNTO 0);--移位的数量

dir: IN STD_LOGIC--移动的方向 0:左 1:右

kind: IN STD_LOGIC_VECTOR(1 DOWNTO 0);--移动类型 00:算术移 01:逻辑移 十:循环移

clock: IN BIT;--手动时钟PULSE

data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--移位的作用

);

END shifter;ARCHITECTURE behav of shifter IS

BEGIN

PROCESS (data_in, n, dir, kind)

VARIABLE x,y : STD_LOGIC_VECTOR(7 DOWNTO 0);

VARIABLE ctrl0,ctrl1,ctrl2 : STD_LOGIC_VECTOR (3 DOWNTO 0);

BEGIN

IF (clock'EVENT AND clock = '1')THEN--发作操控向量ctrl

ctrl0 := n(0) & dir & kind(1) & kind(0);

ctrl1 := n(1) & dir & kind(1) & kind(0);

ctrl2 := n(2) & dir & kind(1) & kind(0);

ctrl2 := n(2) & dir & kind(1) & kind(0);

CASE ctrl0 IS

WHEN "0000" | "0001" | "00十" | "0十0" | "0十1" | "01十" => x := data_in; --n=0时不移动

WHEN "十00" => x := data_in(6 DOWNTO 0) & data_in(0);--算术左移1位

WHEN "十01" => x := data_in(6 DOWNTO 0) & '0';--逻辑左移1位

WHEN "十十" => x := data_in(6 DOWNTO 0) & data_in(7); --循环左移1位

WHEN "1十0" => x := data_in(7) & data_in(7 DOWNTO 1);-算术右移1位

WHEN "1十1" => x := '0' & data_in(7 DOWNTO 1);--逻辑右移1位

WHEN "11十" => x := data_in(0) & data_in(7 DOWNTO 1);--循环右移1位

WHEN others => null;

END CASE;

CASE ctrl1 IS

WHEN "0000" | "0001" | "00十" | "0十0" | "0十1" | "01十" => y := x; --n=0时不移动

WHEN "十00" => y := x(5 DOWNTO 0) & x(0) & x(0);--算术左移2位

WHEN "十01" => y := x(5 DOWNTO 0) & "00";--逻辑左移2位

WHEN "十十" => y := x(5 DOWNTO 0) & x(7 DOWNTO 6);--循环左移2位

WHEN "1十0" => y := x(7) & x(7) & x(7 DOWNTO 2);--算术右移2位

WHEN "1十1" => y := "00" & x(7 DOWNTO 2);--逻辑右移2位

WHEN "11十" => y := x(1 DOWNTO 0) & x(7 DOWNTO 2);--循环右移2位

WHEN others => null;

END CASE;CASE ctrl2 IS

WHEN "0000" | "0001" | "00十" | "0十0" | "0十1" | "01十" => data_out <= y; --n=0时不移动

WHEN "十00" => data_out <= y(3 DOWNTO 0) & y(0) & y(0) & y(0) & y(0); --算术左移4位

WHEN "十01" => data_out <= y(3 DOWNTO 0) & "0000"; --逻辑左移4位

WHEN "十十" | "11十" => data_out <= y(3 DOWNTO 0) & y(7 DOWNTO 4);--循环左(右)移4位

WHEN "1十0" => data_out <= y(7) & y(7) & y(7) & y(7) & y(7 DOWNTO 4);--算术右移4位

WHEN "1十1" => data_out <= "0000" & y(7 DOWNTO 4);--逻辑右移4位

WHEN others => null;

END CASE;

END IF;

END PROCESS;

END behav;

上一篇:电路牢靠性方案与元器材选型

下一篇:RC桥式正弦波振动电路作业原理

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部