电工学习网

 找回密码
 立即注册

移位寄存器的VHDL描述

2015-7-20 07:13| 编辑:电工学习网| 查看: 17504| 评论: 0

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:逻辑移  10:循环移

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" | "0010" | "0100" | "0101" | "0110"  =>  x := data_in;  --n=0时不移动

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

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

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

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

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

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

WHEN others => null;

END CASE;

CASE ctrl1 IS

WHEN "0000" | "0001" | "0010" | "0100" | "0101" | "0110"  =>  y := x;        --n=0时不移动

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

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

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

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

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

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

WHEN others => null;

END CASE;CASE ctrl2 IS

WHEN "0000" | "0001" | "0010" | "0100" | "0101" | "0110"  => data_out <= y;  --n=0时不移动

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

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

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

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

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

WHEN others => null;

END CASE;       

END IF;

END PROCESS;

END behav;  

看过《移位寄存器的VHDL描述》的人还看了以下文章:

发表评论

最新评论

  • 阻容降压电路结构原理图解
  • 电子电路的核心是什么?主要传输什么信号?
  • 电工必知整流桥好坏的两种检测方法
  • 4个二极管整流和2个二极管整流出电压一样吗
  • 三分钟带你搞懂运算放大器与比较器的区别
  • PN结为什么可以单向导电?PN结单向导电原理
热点文章

电工学习网 ( )

GMT+8, 2023-3-21 02:35

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

返回顶部