精华内容
下载资源
问答
  • 单片机内部有大量寄存器,寄存器是一种能够存储数据的电路,由触发器构成。    (1)触发器  触发器是一种具有记忆存储功能的电路,由门电路组成。常见的触发器包括:RS 触发器、D 触发器和 JK触发器等...
  • 在数字电路中,移位寄存器是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。分为左移寄存器、右移...

    移位寄存器(shift_reg)

    在数字电路中,移位寄存器是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。分为左移寄存器、右移寄存器和双向移位寄存器三种。根据移位数据的输入-输出方式,又可将它分为串行输入-串行输出、串行输入-并行输出、并行输入-串行输出和并行输入-并行输出四种电路结构。
    移位寄存器具有两个特征:
    (1)移位寄存器是由相同的寄存单元所组成。一般说来,寄存单元的个数就是移位寄存器的位数。为了完成不同的移位功能,每个寄存单元的输出与其相邻的下一个寄存单元的输入之间的连接方式也不同。
    (2)所有寄存单元共用一个时钟。在公共时钟的作用下,各个寄存单元的工作是同步的。每输入一个时钟脉冲,寄存器的就顺序向左或向右移动一位。通常可按传输方式的不同对CMOS移位寄存器进行分类。移位寄存器的输入方式有串行输入和并行输入之分。串行输入就是在时钟脉冲作用下,把要输入的从一个输入端依次一位一位地送入寄存器;并行输入就是把输入的从几个输入端同时送入寄存器。

    使用串行输入-串行输出:
    首先说明一种错误的写法:尽管改变了data_in的值,但是data_reg[word_size-1:1]这三位由于是按照之前排列,所以data_in的值并不能通过寄存器传递至data_out,所以在vcs中data_out一直为0。

    module shift#(parameter word_size=4)(
    	input clk,
    	input resetn,
    	input data_in,
    	output data_out);
    reg [word_size-1:0] data_reg;
    
    always@(posedge clk or negedge resetn)
    begin
    	if(!resetn)
    		data_reg<={word_size{1'b0}};
    	else
    		data_reg<={data_reg[word_size-1:1],data_in};
    end
    
    assign data_out=data_reg[word_size-1];
    endmodule
    	
    

    在这里插入图片描述
    一、下面给出右移寄存器的正确写法与tb文件

    module shift#(parameter word_size=4)(
    	input clk,
    	input resetn,
    	input data_in,
    	output data_out);
    reg [word_size-1:0] data_reg;
    
    always@(posedge clk or negedge resetn)
    begin
    	if(!resetn)
    		data_reg<={word_size{1'b0}};
    	else
    		data_reg<={data_in,data_reg[word_size-1:1]};
    end
    
    assign data_out=data_reg[0];
    endmodule
    	
    
    
    module tb();
    reg data_in;
    reg clk;
    reg resetn;
    wire data_out;
    
    shift u1(
    	.clk(clk),
    	.resetn(resetn),
    	.data_in(data_in),
    	.data_out(data_out));
    
    initial
    begin
    	clk=0;
    	forever #(20/2) clk=~clk;
    end
    
    initial
    begin
    	resetn=0;
    	#(2*20) resetn=1;
    end
    
    initial
    	begin
    		#40;
    		#20 data_in=1;
    		#20 data_in=0;
    	end
    endmodule
    

    在这里插入图片描述
    二、左移寄存器的verilog代码

    module shift#(parameter word_size=4)(
    	input clk,
    	input resetn,
    	input data_in,
    	output data_out);
    reg [word_size-1:0] data_reg;
    
    always@(posedge clk or negedge resetn)
    begin
    	if(!resetn)
    		data_reg<={word_size{1'b0}};
    	else
    		data_reg<={data_reg[word_size-2:0],data_in};
    end
    
    assign data_out=data_reg[word_size-1];
    endmodule
    

    在这里插入图片描述
    三、使用并行输入,串行输出

    module shift#(parameter word_size=4)(
    	input clk,
    	input resetn,
    	input [word_size-1:0] data_in,
    	output data_out,
    	input en);
    reg [word_size-1:0] data_reg;
    
    always@(posedge clk or negedge resetn)
    begin
    	if(!resetn)
    		data_reg<={word_size{1'b0}};
    	else if(en)
    		data_reg<=data_in;
    	else
    		data_reg<={data_reg[0],data_reg[word_size-1:1]};		
    end
    
    assign data_out=data_reg[0];
    endmodule
    
    module tb();
    reg [4-1:0] data_in;
    reg clk;
    reg en;
    reg resetn;
    wire data_out;
    
    shift u1(
    	.clk(clk),
    	.resetn(resetn),
    	.data_in(data_in),
    	.data_out(data_out),
    	.en(en));
    
    initial
    begin
    	clk=0;
    	forever #(20/2) clk=~clk;
    end
    
    initial
    begin
    	resetn=0;
    	#(2*20) resetn=1;
    		en=1;
    		data_in=4'b1000;
    	#20     en=0;
    	
    end	
    endmodule
    

    在这里插入图片描述
    四、使用串行输入,并行输出

    module shift#(parameter word_size=4)(
    	input clk,
    	input resetn,
    	input data_in,
    	output [word_size-1:0] data_out,
    	input en);
    reg [word_size-1:0] data_reg;
    
    always@(posedge clk or negedge resetn)
    begin
    	if(!resetn)
    		data_reg<={word_size{1'b0}};
    	else if(en)
    		data_reg[0]<=data_in;
    	else
    		data_reg<={data_reg[0],data_reg[word_size-1:1]};		
    end
    
    assign data_out=data_reg;
    endmodule	
    

    五、并行输入,并行输出

    module shift #(parameter word_size=4)(
    					input load,
    					input clk,
    					input rst_n,
    					input [word_size-1:0] data_in,
    					output reg [word_size-1:0] data_out);
    always@(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    		data_out<=4'b0000;
    	else if(load)
    		data_out<=data_in;
    end
    endmodule
    

    根据以上的移位寄存器我们可以得出一个通用的移位寄存器:

    module shift #(parameter word_size=4)(
    	input clk,
    	input rst_n,
    	input [1:0] s,//mode
    	input [word_size-1:0] data_in,
    	input MSB_in,// most significant bit
    	input LSB_in,// Least significant bit
    	output reg [word_size-1:0] data_out,
    	output MSB_out,
    	output LSB_out);
    always@(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    		data_out<=4'b0000;
    	else
    	begin
    		case(s)
    		2'b00:data_out<=data_out;
    		2'b01:data_out<={data_out[word_size-2:0],LSB_in};  //LSB
    		2'b10:data_out<={MSB_in,data_out[word_size-1:1]}; //MSB
    		2'b11:data_out<=data_in;
    		endcase
    	end
    end
    
    assign MSB_out=data_out[word_size-1];
    assign LSB_out=data_out[0];
    
    endmodule
    
    module tb #(parameter word_size=4)();
    reg clk;
    reg rst_n;
    reg [1:0] s;
    reg [word_size-1:0] data_in;
    reg MSB_in;
    reg LSB_in;
    wire [word_size-1:0] data_out;
    wire MSB_out;
    wire LSB_out;
    
    shift u1(
    	.clk(clk),
    	.rst_n(rst_n),
    	.s(s),
    	.data_in(data_in),
    	.MSB_in(MSB_in),
    	.LSB_in(LSB_in),
    	.data_out(data_out),
    	.MSB_out(MSB_out),
    	.LSB_out(LSB_out));
    
    initial
    begin
    	clk=0;
    	forever #(20/2) clk=~clk;
    end
    
    task rst(input [31:0]rst_time);
    	begin
    		rst_n=0;
    		#rst_time rst_n=1;
    	end
    endtask
    
    initial
    begin
    	rst(60);
    	#40 s=01;
    	LSB_in=1;
    	#100 s=10;
    	MSB_in=1;
    	#100 s=11;
    	data_in=4'b1000;
    end
    endmodule
    

    在这里插入图片描述

    展开全文
  • 操作数作为指令的部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。立即数可以8位、16位或32位,该数值紧跟在操作码之后。 寄存器寻址方式: 指令所要的操作数已存储在某...

    立即寻址方式
    操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。立即数可以是8位、16位或32位,该数值紧跟在操作码之后。

    寄存器寻址方式
    指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。

    直接寻址方式
    指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。如:MOV BX, [1234H]

    寄存器间接寻址方式
    操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。如:MOV BX,[DI]

    寄存器相对寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS。如:MOV BX, [SI+100H]

    基址加变址寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。如:MOV BX, [BX+SI]。

    相对基址加变址寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。如:MOV AX, [BX+SI+200H]。

    展开全文
  • 寄存器

    2021-01-28 16:52:30
    数码寄存器是用于暂时存放数码的一种逻辑记忆电路,简称寄存器。它可以接收、暂存、传递数据。如下为74LS174六位寄存器逻辑电路图: 移位寄存器除了具有记忆数码功能,还具有移位功能。移位寄存器在进行移位操作时,...

    寄存器分数码寄存器和移位寄存器。数码寄存器是用于暂时存放数码的一种逻辑记忆电路,简称寄存器。它可以接收、暂存、传递数据。如下为74LS174六位寄存器逻辑电路图:在这里插入图片描述

    移位寄存器除了具有记忆数码功能,还具有移位功能。移位寄存器在进行移位操作时,每来一个移位脉冲(CP),寄存器中存放的数码向左或向右移一位,且仅移一位。如74LS395是一个集成的具有异步清零、三态输出、可并行输入的单向移位寄存器。

    展开全文
  • 移位寄存器是一种非常有用的时序逻辑电路,它常用于数据的串/并转换、并/串转换、数值运算、数据处理以及乘法移位操作等。移位寄存器按照移位方向来进行分类,可以分类左移移位寄存器、右移移位寄存器和双...

    双向移位寄存器

    1

    引言

    移位寄存器就是指具有移位功能的触发器组,

    它是在普通寄存器的基础上添加了

    移位功能的一种特殊的寄存器。通常,移位功能就是指在寄存器里面存储的二进制

    数据能够在时钟信号的控制下依次左移或者右移。移位寄存器是一种非常有用的时

    序逻辑电路,它常用于数据的串

    /

    并转换、并

    /

    串转换、数值运算、数据处理以及乘

    法移位操作等。

    移位寄存器按照移位方向来进行分类,

    可以分类左移移位寄存器、

    右移移位寄存

    器和双向移位寄存器等。本文将介绍双向移位寄存器。

    2

    VHDL

    程序

    双向移位寄存器的

    VHDL

    程序如下:

    LIBRARY ieee;

    --

    打开需要用到的库

    USE ieee.std_logic_1164.all;

    USE ieee.std_logic_arith.all;

    USE ieee.std_logic_unsigned.all;

    ENTITY rom_shift IS

    --

    实体说明

    PORT

    (

    clk

    : IN

    STD_LOGIC;

    d

    : IN

    STD_LOGIC;

    dir

    : IN

    STD_LOGIC;

    q

    : OUT

    STD_LOGIC_VECTOR(3 DOWNTO 0)

    );

    END rom_shift;

    ARCHITECTURE behave OF rom_shift IS

    --

    结构体定义

    SIGNAL

    qn

    : STD_LOGIC_VECTOR(3 DOWNTO 0);

    BEGIN

    PROCESS (clk)

    BEGIN

    IF (clk'EVENT AND clk='1') THEN

    展开全文
  • 层次化寄存器是一种相当常见的体系结构,但是关于其验证技术的文档似乎仍然缺乏。本文将描述“层次寄存器”的含义,并实现层次寄存器创建和集成UVM寄存器模型。然后,验证工程师可以创建UVM序列并对这些寄存器进行.....
  • 中国最好最大的FPGA纯工程师社群原本个很普通的时钟管理芯片,通过自带软件用串口很容易就能够进行配置,但尝试着写FPGA代码进行配置却遇到了各种困难,等最终问题解决后才发现,忽略了个很小的细节。...
  • 双向移位寄存器VHDL设计.doc双向移位...移位寄存器是一种非常有用的时序逻辑电路,它常用于数据的串/并转换、并/串转换、数值运算、数据处理以及乘法移位操作等。移位寄存器按照移位方向来进行分类,可以分类左移...
  • 在数字电路中,移位寄存器是一种在若干相同时间脉冲下工作的触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。这种移位寄存器是一维的,...
  • 寄存器是一种物理存储元件,只不过它是比一般的存储介质要快,能够跟上cpu的步伐,所以在cpu内部有好多这样的寄存器用来给cpu存取数据。先简短说这一两句,暂时离开一下主题,咱们先看看相对熟悉一些的概念——缓存...
  • 【ARM】控制寄存器的几方式

    千次阅读 2017-07-28 18:58:48
    定义一个指向寄存器地址的指针原理:利用强制类型转换将寄存器的地址强转为一个指向无符号整形的指针,并将其...利用宏定义原理:与上一种方法原理相同,最终都对一个指向无符号整形的指针进行操作。不同之处在于强转
  • 一种寄存器操作指定位翻转方法

    千次阅读 2018-05-29 20:47:43
    平时开发中会经常遇到,以平时开发中遇到的LED为例,如果要实现指定的LED翻转时,其它的LED状态不变,那么就要操作寄存器对指定位进行翻转,下面笔者采用的一种方法,可以提供各位借鉴,如有更好的方法可以留言,...
  • 在某些场景下我们需要读取...不失一般性,这里假设某32位寄存器bit[0-15]cmd信息,bit[16-24]size信息,bit[25-31]sync信息。我们可以根据这些信息自定义RegStat_t结构,成员可以根据具体需求按需实现。然后...
  • 关键词:CAM移位寄存器VerilogHDLCAM(ContentAddressableMemory,内容可寻址存储器)是一种特殊的存储阵列。它通过将输入数据与CAM中存储的所有数据项同时进行比较,迅速判断出输入数据是否与CAM中的存储数据项相...
  • 通用寄存器

    千次阅读 2017-10-21 10:07:31
    通用寄存器:基本作用 处理机包含了组 1 6位寄存器,其中有 8个任何时候都可存访的“通用寄存器”。这些寄存器被称之为:r 0、r 1、r 2、r 3、r 4、r 5、r 6以及r 7。 U N I X使用这些寄存器的惯例: *...
  • UVM验证环境中访问寄存器,通常通过ralf文件生成寄存器...但是,我们又想访问DUT中的寄存器时,一种方法定义一个sequence,此sequence中包含了需要访问的寄存器地址和相应的变量,然后在body函数中通过调用uvm_do_...
  • PC寄存器

    千次阅读 2020-10-07 13:13:56
    一、概述 JVM中的程序计数寄存器(Program Counter Register)中,Register...JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟,是一种软件层面的概念。 二、作用 PC寄存器用来存储下一条指令的地址,也即将要执行的
  • 1、PC Register介绍 JVM中的程序计数器...JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟 2、作用 PC寄存器用来存储指向下一条指令的地址,即将要执行的代码指令,由执行引擎读取下一条指令 他是一块很小的内存.
  • 寄存器是一种物理存储元件,只不过它是比一般的存储介质要快,能够跟上cpu的步伐,所以在cpu内部有好多这样的寄存器用来给cpu存取数据。 先简短说这一两句,暂时离开一下主题,咱们先看看相对熟悉一些的概念——...
  • 以下介绍一种基于线性反馈位移寄存器的随机数生成方法,这种算法某品牌MCU主控的随机数模块生成算法,主控上电路直接实现的,产生随机数的速度很快,用C代码描述如下: #define WORD unsigned short #define ...
  • stm32寄存器(四输入输出方式)

    千次阅读 2020-03-10 16:32:37
    c极 开路的,你可以接个电阻到3.3V,也可以接个电阻到5V,这样,在输出1的时候,就可以5V电压,也可以3.3V电压了.但是不接电阻上拉的时候,这个输出高就不能实现了. 推挽,就是有推有拉,任何时候IO口的电平都...
  • 一种实用的VXI总线寄存器基接口电路的设计 [日期:2005-1-12] 来源:电子技术应用 作者:电子科技大学自动化工程学院CAT研究室 徐晨曦 [字体:大 中...VXI(VMEbus eXtention for Instrumentation)总线是一种完全
  • 一、立即数寻址 操作数由指令本身给出 MOV r0,#0x0F //是所有寻址方式里面速度最快...ARM中要求立即数是一个8位的常数循环左移偶数位得到的数值。也就是说只要是在0x00~0xFF中的一个数,或者是在这个区间中的一个数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,358
精华内容 2,943
关键字:

寄存器是一种