精华内容
下载资源
问答
  • 多功能移位寄存器的功能有
    2019-11-27 04:28:04

     

    移位寄存器实现Verilog代码:

    `timescale 1ns / 1ps
    
    
    module add(
        input clk,
        input reset,
        input [1:0] s,
    	input dl,
    	input dr,
    	input [3:0] d,
        output reg [3:0] q
        );
    	always @(posedge clk or negedge reset)
    	    if (~reset) begin
    			q <= 4'b0000;
    		end else begin
    			case(s)	
    				2'b00:	q <= q;              //保持
    				2'b01:	q <= {q[2:0],dr};    //右移
    				2'b10:	q <= {dl,q[3:1]};    //左移
    				2'b11:	q <= d;              //置数
    				endcase
    		end
    endmodule

    仿真代码

    `timescale 1ns / 1ps
    
    module conter_t;
    
    	// Inputs
    	reg clk;
    	reg reset;
    	reg [1:0] s;
    	reg dl;
    	reg dr;
    	reg [3:0] d;
    
    	// Outputs
    	wire [3:0] q;
    
    	// Instantiate the Unit Under Test (UUT)
    	add uut (
    		.clk(clk), 
    		.reset(reset), 
    		.s(s), 
    		.dl(dl), 
    		.dr(dr), 
    		.d(d), 
    		.q(q)
    	);
    	
       parameter PERIOD = 20;
    
       always begin
          clk = 1'b0;
          #(PERIOD/2) clk = 1'b1;
          #(PERIOD/2);
       end  
    	
        initial begin
            // Initialize Inputs
    		clk = 0;
    		reset = 0;
    		s = 0;
    		dl = 0;
    		dr = 0;
    		d = 0;
    
    		// Wait 100 ns for global reset to finish
    		#40;
    		reset = 1;
    		d = 4'b1011;
            
    		// Add stimulus here
    		s = 2'b11;		//置数
    		#40;
    		s = 2'b01;		//右移
    		#100;
    		s = 2'b11;		//置数
    		#40;
    		s = 2'b10;		//左移
    		#100;
    		s = 2'b11;		//置数
    		#40;
    		s = 2'b00;		//保持
    		#100;
    	end
    
    endmodule

    仿真波形:

    总结:由于没有人给予指导,在调试的过程中,一直被一个问题困扰,问题及解决办法描述如下。

    本来想要测试程序的移位功能时,我想的是给q(输出)一个初始值,然后设定模式为移位模式,让q在时钟脉冲的作用下移位并进行观察。于是在仿真程序中,对q进行幅值操作,但是默认生成的仿真程序模板中,q为wire类型,不允许幅值,于是手动改为reg类型(实现程序中为了对q赋值,就是需要定义q为reg类型,所以我理所当然的认为这里也要这样改写)。

    但是这样操作之后的现象是:仿真程序中对q的值的改变语句均生效,但是源程序中对q值的改变语句无效,寻找很久未果。

    后来发现,其他的仿真的程序中似乎都没有把输出变量设定为reg类型,即没有在仿真程序中修改输出变量的值。

    因此想到,将q恢复为默认的wire类型,在仿真程序中对d赋值,然后通过移位寄存器的置数功能将d的值传递给q,上述问题得到解决。

     

    如有问题,欢迎交流。

     ——cloud over sky

    ——2019/11/26

     

     

     

    更多相关内容
  • 移位寄存器

    2020-12-09 01:57:52
    移位寄存器是暂时存放数据的部件,同时它还具有移位功能。 一、特点和分类 从逻辑结构上看,移位寄存器有以下两个显著特征:(1)移位寄存器是由相同的寄存单元所组成。一般说来,寄存单元的个数就是移位寄存器的...
  • LabVIEW的移位寄存器

    2021-01-19 23:05:03
     图2和图3分别显示为For循环结构和While循环结构添加移位寄存器后的结果移位寄存器在循环结构框的左右两侧是成对出现的,一个寄存器右侧的端子只能一个元素,而左侧的端子可以有多个元素。移位寄存器的颜色和输入...
  • FPGA与数字系统设计:实验五 四位多功能移位寄存器的设计.doc
  •  图2和图3分别显示为For循环结构和While循环结构添加移位寄存器后的结果移位寄存器在循环结构框的左右两侧是成对出现的,一个寄存器右侧的端子只能一个元素,而左侧的端子可以有多个元素。移位寄存器的颜色和输入...
  • 摘要:依据非线性移位寄存器的原理,文中讨论二元给定序列非线性反馈移位寄存器的综合算法,用C语言编程,找到了产生该序列的非线性移位寄存器。借助EDA技术,以FPGA为硬件基础,经过设计优化构成定长序列和给定周期...
  • 实验六 移位寄存器及其应用

    万次阅读 多人点赞 2021-05-20 20:37:58
    1、掌握中规模4位双向移位寄存器的逻辑功能测试和使用方法。 2、学会移位寄存器的应用,如实现数据的串/并转换、构成环形计数器等。 三、实验原理 1、移位寄存器 寄存器是一种用于寄存在二进制数码或指令的时序逻辑...

    一、预习要求

    1、复习有关寄存器的内容,弄懂移位寄存器工作的基本原理。
    2、查阅74LS194(或CC40194)的有关资料,熟悉其逻辑功能及引脚排列。
    3、绘出实验内容的详细电路图,并拟出实验所需的测试记录表格。

    二、实验目的

    1、掌握中规模4位双向移位寄存器的逻辑功能测试和使用方法。
    2、学会移位寄存器的应用,如实现数据的串/并转换、构成环形计数器等。

    三、实验原理

    1、移位寄存器

    寄存器是一种用于寄存在二进制数码或指令的时序逻辑部件,它被广泛地应用于各类数字系统和数字计算机中。其功能是在时钟脉冲的作用下,将数码或指令存入寄存器(写入),或从寄存器中将数码或指令取出(读出)。寄存器只能短时存放数据,电路失电数据便消失,故又称暂存器。存取数据的方式有串行和并行两种,寄存器按功能不同可分为:①数码寄存器:数码寄存器一般由多位D触发器或D锁存器构成,也可由JK触发器构成,其数码的输入和输出都是并行的,且只能存放数据而没有移位功能;②移位寄存器:移位寄存器是一个具有移位功能的寄存器,由触发器连接组成同步时序电路,每个触发器的输出端连接到下一级触发器的控制输入端,所有触发器共用一个时钟脉冲源,寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。既能左移又能右移的称为双向移位寄存器,只需要改变左右移的控制信号便可实现双向移位要求。根据寄存器存取信息的方式不同分为:串入串出、串入并出、并入串出、并入并出四种形式。
    本实验选用4位双向移位寄存器74LS194,它的最高时钟频率为36MHz。它具有清零、左移、右移、预置数(并入/并出)和保持功能,其引脚排列如图1所示,功能表如表1。
    在这里插入图片描述

    	图1 74LS194引脚排列图
    

    在这里插入图片描述

    				表1 74LS194的逻辑功能表
    

    管脚符号说明:D3、D2、D1、D0 :并行数据输入端;Q3、Q2、Q1、Q0:并行数据输出端;DSR :右移串行输入端;DSL :左移串行输入端;S1、S0:工作模式控制端;:直接清零端;CP:时钟脉冲输入端。
    由功能表可知:当=0时,寄存器清零使输出Q0 Q1 Q2 Q3=0000,=1时,寄存器正常工作;当=1,S1S0=11时,且在CP上升沿作用下,并行输入数据送入寄存器,使得Q0 Q1 Q2 Q3=D0D1D2D3=abcd,此时串行数据(DSR、DSL)被禁止;当=1,S1S0=01时,串行输入数据送至右移输入端DSR,在CP上升沿作用下,同步右移,即Q0 Q1 Q2 Q3=DSR Q0 Q1 Q2,Q3串行输出;当=1,S1S0=10时,串行输入数据送至左移输入端DSL,在CP上升沿作用下,同步左移,即Q0 Q1 Q2 Q3= Q1 Q2Q3 DSL,Q0串行输出;当=1,S1S0=00时,在CP上升沿作用下,寄存器内容保持不变;当=1,S1S0=××时,在CP非上升沿作用下,寄存器内容也保持不变。

    2、移位寄存器的应用

    移位寄存器的应用很广,可构成移位寄存器型计数器、顺序脉冲发生器和串行累加器;可用作数据转换,即把串行数据转换为并行数据,或把并行数据转换为串行数据等。

    (1)用74LS194构成环形计数器

    把移位寄存器的末级触发器的Q输出反馈到它的串行输入端,就可以构成环形计数器。
    图2是将74LS194的Q3端接到DSR端,即可得模为4的右移环形计数器。首先预置数,假设D0D1D2D3=0001,在循环前,先使S1S0=11,让预置数并行进入寄存器,使得输出Q0Q1Q2 Q3=D0D1D2D3=0001,然后改变S1、S0的电平,使S1S0=01,此时在有效脉冲作用下Q0Q1Q2 Q3将依次右移,其输出状态变化如图3所示。图2所示电路的各个输出端的输出脉冲是在时间上有先后顺序脉冲,因此也可以作为顺序脉冲发生器。
    在这里插入图片描述在这里插入图片描述

    图2 模4环形计数器                    图3 输出状态变化图
    

    若将图2中的Q3输出端通过反相器连接到DSR端,则可得到模为8的右移扭环形计数器,其电路如图4所示,输出状态变化如图5所示。Q输出端通过不同的组合电路接到DSR端,还可以得到不同模值的计数器或伪随机序列发生器。

    (2)用74LS194实现数据串行/并行转换

    ①串行/并行转换器

    串行/并行转换是指串行输入的数据,经过转换电路之后变成并行数据输出。图6所示电路是用两片74LS194构成的七位串行/并行数据转换电路。
    在这里插入图片描述在这里插入图片描述

    图4 模8扭环形计数器                  图5 输出状态变化图
    

    在这里插入图片描述

    					图6 7位串行/并行转换电路
    

    其中:电路中S0端接高电平1,S1受Q7控制,两片寄存器连接成串行输入右移工作方式。Q7是转换结束标志。当Q7=1时,S1为0,使之成为S1S0=01的串入右移工作方式。当Q7=0时,
    S1为1,且有S1S0=11,表示串行送数结束,标志着串行输入数据已转换成为并行输出数据。
    在这里插入图片描述

    	表2 7位串行/并行转换电路输出状态变换表
    

    串行/并行转换的详细过程如下:
    转换开始前端加低电平,使芯片(1)和(2)两寄存器被清零,此时S1S0=11,寄存器执行并行输入工作方式。当第一个有效脉冲到来后,寄存器的输出状态Q0~Q7被置数为01111111,与此同时S1S0变为01,转换电路变为执行串入右移工作方式,串行输入数据由芯片(1)的DSR端加入。假设输入数据为d6d5d4d3d2d1d0,则随着CP脉冲的依次加入,输出状态的变化如表2所示。
    由表2可知,右移操作7次后,Q7变为0,S1S0变为11,表明串行输入结束。此时,串行输入数据已经转换成为并行数据,从Q0~Q6端输出。

    ②并行/串行转换器

    并行/串行转换是指并行输入的数据,经过转换电路之后变成串行输出。图7所示电路是用两片74LS194构成的七位并行/串行数据转换电路,与图6相比,它多了两个与非门,而且还多了一个启动信号(负脉冲或低电平),工作方式同样为右移。
    在这里插入图片描述

    				图7 7位并行/串行转换电路
    

    在这里插入图片描述

    	表3 7位并行/串行转换电路输出状态变换表
    

    并行/串行转换的详细过程如下:
    转换开始前在这里插入图片描述端加低电平,使芯片(1)和(2)两寄存器被清零,清零后,当启动转换负脉冲到来时,使得S1S0=11,此时寄存器执行并行输入工作方式。当第一个有效脉冲到来后,寄存器的输出状态Q0~Q7被置数为0d1d2d3d4d5d6d7,并行输入数据存入寄存器,同时使得门G1输出为1,门G2输出为0,S1S0变为01,转换电路变为执行右移串行操作,随着CP脉冲的依次加入,输出状态依次右移,使串行输出Q7端的输出数据依次为d7d6d5d4d3d2d1,待右移操作7次后,Q0~Q6的状态均为高电平1,使得门G1输出为低电平0,门G2输出为高电平1,此时S1S0变为11,表明并行/串行结束。7位并行/串行转换电路的输出状态变换详见表3所示。

    对于中规模的集成移位寄存器,其位数往往以4位居多,当所需要的位数多于4位时,可以把几片集成移位寄存器用级连的方法来扩展位数。

    四、实验设备与器件

    1、TH-SZ型数字系统设计实验箱;
    2、双踪示波器;
    3、74LS00 四2输入与非门,74LS20 双4输入与非门,74LS04 六反相器,74LS194;
    4、导线/插接线若干。

    五、实验内容与步骤

    1、测试74LS194的逻辑功能
    将、S1、S0、DSL、DSR、D0、D1、D2、D3分别接至逻辑开关的输出插孔;Q0、Q1、Q2、Q3分别接至逻辑电平显示输入插孔;CP接单次脉冲源。自拟表格,逐项进行测试。并与给出的功能表做对比。

    在这里插入图片描述

    					移位寄存器(向右移动)
    

    在这里插入图片描述

    					移位寄存器(向左移动)
    

    在这里插入图片描述

    2、用74LS194和74LS20构成一个右移环形计数器(脉冲分配器)。要求:利用加在G2门上的负脉冲,使电路处于“送数”状态,设初始状态为Q0Q1Q2Q3=1110;启动信号撤出后,电路进入“右移”并保持这种模式。试按图8所示电路进行连接实验,测试环形计数器的CP与输出Q0Q1Q2Q3的计数时序及输入与各输出的波形关系,用示波器观察输入输出波形,并画出输出状态变化图和波形。CP输入为1HZ 连续脉冲,信号输出用发光二极管进行监测。
    在这里插入图片描述

    		图8 环形计数器脉冲分配器
    

    在这里插入图片描述

    							输入波形
    

    在这里插入图片描述

    							各个输出波形
    

    在这里插入图片描述
    在这里插入图片描述

    3、使用两片74LS194设计一彩灯控制电路,共有8只彩灯,使其7暗1亮(或7亮1暗)且这一亮灯(或一暗灯)循环右移,CP输入为1HZ 连续脉冲,信号输出用发光二极管进行监测。

    在这里插入图片描述

    						向右移动
    

    在这里插入图片描述

    						向左移动
    

    六、实验报告要求

    1、分析实验结果,总结移位寄存器74LS194的逻辑功能。
    2、根据实验内容,画出相关实验连接电路,记录各测试结果,画出环形计数器状态转换图及所观察到的有关实验波形。

    更多相关文章点这里哦

    数字电子技术基础(全套实验手册及仿真工艺实习)

    通信工程(信息类,电子类,电气工程,自动化,计算机,软件工程,机电,等相关专业)全套学习指导

    在这里插入图片描述

    答疑资料qq群:1007576722

    展开全文
  • 构建一个具有异步复位、同步加载和使能功能的 4 位移位寄存器(右移位)。 reset:将移位寄存器重置为零。 load: 加载数据[3:0]的移位寄存器,而不是移位。 ena:向右移(q[3] 变为零,q[0] 移出并消失)。 q:...

    题目1:4位移位寄存器(4-bit shift register)

    构建一个具有异步复位、同步加载和使能功能的 4 位移位寄存器(右移位)。

    reset:将移位寄存器重置为零。
    load: 加载数据[3:0]的移位寄存器,而不是移位。
    ena:向右移(q[3] 变为零,q[0] 移出并消失)。
    q:移位寄存器的内容。
    如果同时load和 ena 输入 (1),则load输入具有更高的优先级。

    模块声明
    module top_module(
    input clk,
    input areset, // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q);
    **分析:题意要求实现的是右移功能的寄存器,即q[3]传给q[2],q[2]传给q[1],q[1]传给q[0]。

    代码实现如下:

    module top_module(
        input clk,
        input areset,  // async active-high reset to zero
        input load,
        input ena,
        input [3:0] data,
        output reg [3:0] q); 
        always @(posedge clk or posedge areset)
            begin
                if(areset)
                    q <= 4'b0;
                else if(load)
                    begin
                        q <= data;
                    end
                 else if(ena)
                     begin
                         q[3] <= 0;
                         q[2:0] <= q[3:1];
                     end
            end
    endmodule
    

    仿真结果如下:
    在这里插入图片描述
    使用quartus ii画出逻辑图如下:
    在这里插入图片描述

    题目2:构建100位的左/右旋转器(Left/right rotator)

    构建一个 100 位左/右旋转器,具有同步负载和左/右使能。旋转器从寄存器的另一端移入移出位,这与丢弃移出位并在零中移位的移位不同。如果启用,旋转器将旋转位,并且不会修改/丢弃它们。

    • load: 加载带有数据[99:0]的移位寄存器,而不是旋转。
    • ena[1:0]:选择是否旋转以及旋转方向。
    • 2’b01 向右旋转一位
      2’b10 向左旋转一位
      2’b00 和 2’b11 不旋转
      q:旋转器的内容

    模块声明
    module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q);
    分析:这相当于一个100位的环形计数器。其中右移寄存器丢弃的是低位,即q[0];左移寄存器丢弃的是高位,即q[99]。环形计数器通过首尾相连,不会丢弃任何位。

    代码实现 :

    module top_module(
        input clk,
        input load,
        input [1:0] ena,
        input [99:0] data,
        output reg [99:0] q); 
        always @(posedge clk )
            begin
                if(load)
                    q <= data;
                else if(ena == 2'b01)
                    q <= {q[0],q[99:1]};//右移
                else if(ena == 2'b10)
                        q <= {q[98:0],q[99]};//左移
               
            end
    endmodule
    

    其中: q <= {q[0],q[99:1]};//右移 说明了右移操作,即在时钟上升沿的作用下,将q[0]的数据直接传给q[99],触发器由原来的数据向右移动一位,q[99:1]传给q[98:1],即q[99]传给q[98],q[98]传给q[97],直到q[1]传给q[0]。左移则与上述相反。

    题目3:左/右移算术偏移1或8(Left/right arithmetic shift by 1 or 8)

    构建一个具有同步负载的64位算术移位寄存器。移位器可以左右移动,也可以移动 1 位或 8 位位置(按量选择)。

    算术右移位在移位寄存器(在本例中为q[63])中数字的符号位中移动,而不是像逻辑右移那样为零。另一种思考算术右移位的方法是,它假设被移位的数字是有符号的并保留符号,因此算术右移将有符号数除以2的幂。

    逻辑左移和算术左移之间没有区别。

    • load: 加载带有数据[63:0]的移位寄存器,而不是移位。
    • ena:选择是否转移。
    • amount:选择要移位的方向和频次。
      2’b00:向左偏移 1 位。 2’b01:向左偏移 8 位。 2’b10:向右移动 1 位。 2’b11:向右移动 8 位。
      q:移位器的内容。

    模块声明
    module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q);
    **提示:**5 位数字 11000 算术右移 1 是 11100,而逻辑右移将产生 01100。
    同样,5 位数字 01000 算术右移 1 是 00100,逻辑右移将产生相同的结果,因为原始数字是非负数。

    代码实现如下:

    module top_module(
        input clk,
        input load,
        input ena,
        input [1:0] amount,
        input [63:0] data,
        output reg [63:0] q); 
        always @(posedge clk)
            begin
                if(load)
                    q <= data;
                else if(ena)
                    begin
                        case(amount)
                            2'b00: q <= {q[62:0],1'b0};
                            2'b01: q <= {q[55:0],8'b0};
                            2'b10: q <= {q[63],q[63:1]};
                            2'b11: q <= {{8{q[63]}},q[63:8]};
                        endcase        
                    end
            end
    endmodule
    

    仿真结果如下:
    在这里插入图片描述
    在这里插入图片描述

    题目4:5位LFSR(线性反馈移位寄存器)

    线性反馈移位寄存器是一个移位寄存器,通常具有几个XOR门,以产生移位寄存器的下一个状态。 Galois LFSR是一种特殊的排列方式,其中带有“抽头”的位位置与输出位进行XORed以产生其下一个值,而没有抽头的位位置移位。如果仔细选择抽头位置,则可以将LFSR设置为“最大长度”。n 位的最大长度 LFSR 循环通过 2n-1 个状态在重复之前(永远不会达到全零状态)。

    下图显示了一个 5 位最大长度 Galois LFSR,在位位置 5 和 3 处有抽头。(抽头位置通常从 1 开始编号)。请注意,为了保持一致性,我在位置 5 处绘制了异或门,但其中一个异或门输入为 0。
    在这里插入图片描述
    构建此 LFSR。重置应将 LFSR 重置为 1。

    模块声明
    module top_module(
    input clk,
    input reset, // Active-high synchronous reset to 5’h1
    output [4:0] q
    );

    分析:按照所给的图写代码出来就好。

    module top_module(
        input clk,
        input reset,    // Active-high synchronous reset to 5'h1
        output [4:0] q
    ); 
        always @(posedge clk)
            begin
                if(reset)
                    q <= 5'b1;
                else
                    begin
                        q[4] <= q[0]^1'b0;
                        q[3] <= q[4];
                        q[2] <= q[3]^q[0];
                        q[1] <= q[2];
                        q[0] <= q[1];
                    end
            end
    endmodule
    

    仿真结果如下:
    在这里插入图片描述

    题目5:3位LSFR

    摘自2015年中期问题5。另请参阅此问题的第一部分:mt2015_muxdff

    在这里插入图片描述
    为此顺序电路编写Verilog代码(子模块是可以的,但顶层必须命名为top_module)。假设您将在 DE1-SoC 板上实现该电路。将R输入连接到SW 开关,将Clock 连接到KEY[0],L连接到KEY[1]。将 Q 输出连接到红灯 LEDR。

    模块声明
    module top_module (
    input [2:0] SW, // R
    input [1:0] KEY, // L and clk
    output [2:0] LEDR); // Q
    提示:
    该电路是线性反馈移位寄存器(LFSR)的一个例子。最大周期 LFSR 可用于生成伪随机数,因为它循环通过 2n重复前-1个组合。全零组合不在此序列中出现。
    分析:通过编写子模块、并在顶层模块中调用的方式来实现。
    代码编写如下:

    module top_module (
    	 	input [2:0] SW,      // R
    	input [1:0] KEY,     // L and clk
    	output [2:0] LEDR);  // Q
             lsfr u1(.clk(KEY[0]),.r(SW),.L(KEY[1]),.q(LEDR));   
    
    endmodule
    module lsfr(L,clk,r,q);
        input L,clk;
    	 input [2:0] r;
        output q;
    	 reg [2:0] q;
        always @(posedge clk)
            begin
                if(L)
    				q <=r;
    
                else
                    begin
    					 q[0] <= q[2];
    					 q[1] <= q[0];
    					 q[2] <= q[1]^q[2];
    					 end
            end
    endmodule
    

    使用quartus ii画出逻辑图:
    顶层模块:
    在这里插入图片描述
    子模块:
    在这里插入图片描述

    题目6:32位LFSR

    有关说明,请参阅 Lfsr5。

    构建一个 32 位 Galois LFSR,在位位置 32、22、2 和 1 处使用抽头。
    模块声明
    module top_module(
    input clk,
    input reset, // Active-high synchronous reset to 32’h1
    output [31:0] q
    );

    **参考题目4。**使用抽头即增加了异或门。

    module top_module(
        input clk,
        input reset,    // Active-high synchronous reset to 32'h1
        output [31:0] q
    ); 
        always @(posedge clk)
            begin
                if(reset)
                    q <= 32'h1;
                else
                    begin
                        q[31] <= q[0]^32'h0;
                        q[30:22] <= q[31:23];
                        q[21] <= q[22]^q[0];
                        q[20:2] <= q[21:3];
                        q[1] <= q[2]^q[0];
                        q[0] <= q[1]^q[0];
                    end
            end
    endmodule
    

    题目7:移位寄存器(Exams/m2014 q4k)

    实现以下电路:
    在这里插入图片描述
    模块声明
    module top_module (
    input clk,
    input resetn, // synchronous reset
    input in,
    output out);
    代码实现如下:

    module top_module (
        input clk,
        input resetn,   // synchronous reset
        input in,
        output out);
        reg [3:0] q;
        always @(posedge clk)
            begin
                if(~resetn)
                    q <= 4'b0;
                else
                    begin
                     q <= {q[2:0], in};
                    end
                               
            end
     assign       out = q[3];  
    endmodule
    

    题目8:移位寄存器(Exams/2014 q4b)

    考虑下面所示的n位移位寄存器电路:
    在这里插入图片描述
    为移位寄存器编写一个顶级 Verilog 模块(名为 top_module),假设 n = 4。在顶级模块中实例化 MUXDFF 子循环的四个副本。假设您将在 DE2 板上实现该电路。

    • 将 R 输入连接到SW ,
    • clk to KEY[0],
    • E 到 KEY[1],
    • L 到 KEY[2],以及w 到 KEY[3]。
    • 将输出连接到红灯 LEDR[3:0]。
      从考试/2014_q4a中重复使用您的 MUXDFF。链接:题目6:n位移位寄存器:Exams/2014 q4a

    **法一,采用题目6:n位移位寄存器:Exams/2014 q4a的编写方法:

    module top_module (
        input [3:0] SW,
        input [3:0] KEY,
        output [3:0] LEDR
    ); //
        MUXDFF u1(.clk(KEY[0]),.e(KEY[1]),.r(SW[0]),.l(KEY[2]),.w(LEDR[1]),.q(LEDR[0]));
        MUXDFF u2(.clk(KEY[0]),.e(KEY[1]),.r(SW[1]),.l(KEY[2]),.w(LEDR[2]),.q(LEDR[1]));
        MUXDFF u3(.clk(KEY[0]),.e(KEY[1]),.r(SW[2]),.l(KEY[2]),.w(LEDR[3]),.q(LEDR[2]));
        MUXDFF u4(.clk(KEY[0]),.e(KEY[1]),.r(SW[3]),.l(KEY[2]),.w(KEY[3]),.q(LEDR[3]));
    endmodule
    
    module MUXDFF (clk,w,e,l,r,q);
        input clk,w,e,l,r;
        output [3:0] q;
        always @(posedge clk)
            begin
                if(l==1)
                    q <= r;
                 else
                     begin
                         if(e == 1)
                             q <= w;
                         else
                             q <= q;
                     end
            end
    endmodule
    

    **法2:另一种子模块的编写方法:

    module top_module (
        input [3:0] SW,
        input [3:0] KEY,
        output [3:0] LEDR
    ); //
        MUXDFF u1(.clk(KEY[0]),.e(KEY[1]),.r(SW[0]),.l(KEY[2]),.w(LEDR[1]),.q(LEDR[0]));
        MUXDFF u2(.clk(KEY[0]),.e(KEY[1]),.r(SW[1]),.l(KEY[2]),.w(LEDR[2]),.q(LEDR[1]));
        MUXDFF u3(.clk(KEY[0]),.e(KEY[1]),.r(SW[2]),.l(KEY[2]),.w(LEDR[3]),.q(LEDR[2]));
        MUXDFF u4(.clk(KEY[0]),.e(KEY[1]),.r(SW[3]),.l(KEY[2]),.w(KEY[3]),.q(LEDR[3]));
    endmodule
    
    module MUXDFF (clk,w,e,l,r,q);
        input clk,w,e,l,r;
        output [3:0] q;
        always @(posedge clk)
            begin
                if(~l)
                    begin
                        if(~e)
                    q <= q;
                        else
                    q <= w; 
                    end
                else
                    q <= r;
    
            end
    endmodule
    

    题目8:为8x1存储器设计一个电路(Exams/ece241 2013 q12)-3-input LUT

    在本课程中,您将为8x1存储器设计一个电路,其中写入存储器是通过移入位完成的,读取是“随机访问”,就像在典型的RAM中一样。然后,您将使用电路实现3输入逻辑功能。

    首先,创建一个具有8个D型触发器的8位移位寄存器。标记的触发器输出 Q[0]…Q[7].。移位寄存器输入应称为S,它为Q[0]的输入供电(MSB首先移位)。enable输入控制是否移位。然后,扩展电路以具有3个额外的输入A,B,C和一个输出Z。电路的行为应如下所示:当 ABC 为 000 时,Z=Q[0],当 ABC 为 001 时,Z=Q[1],依此类推。您的电路应仅包含8位移位寄存器和多路复用器。(题外话:该电路称为3输入查找表(LUT)

    模块声明
    module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z );

    分析:多读几次 题目要求即可。代码实现如下:

    module top_module (
        input clk,
        input enable,
        input S,
        input A, B, C,
        output Z ); 
        reg [7:0] q;
        always @(posedge clk)
            begin
                if(enable)
                    q <= {q[6:0],S};
                   // q <= {q[7:0],S};//左移操作
            end
        assign Z = q[{A,B,C}];
            
    endmodule
    

    使用q <= {q[7:0],S};或者q <= {q[6:0],S};均可实现,q[6:0]默认丢弃q[7],q[7:0]则保留,因此使用q <= {q[7:0],S};会出现警告。

    仿真结果:
    在这里插入图片描述

    展开全文
  • 04 4bit移位寄存器设计与功能验证(附源码)

    千次阅读 多人点赞 2022-04-27 09:02:14
    写在前面,4位右移移位寄存器,顾名思义使用四个触发器级联,从一次输入到输出,只移动了3位,而不是4位。比如输入是1101,输出时为0001,而不是0000。 虚拟机:VMware -14.0.0.24051 环 境:ubuntu 18.04.1 脚 本...

    写在前面,4位右移移位寄存器,顾名思义使用四个触发器级联,从一次输入到输出,只移动了3位,而不是4位。比如输入是1101,输出时为0001,而不是0000。


    虚拟机:VMware -14.0.0.24051
    环 境:ubuntu 18.04.1
    脚 本:makefile(点击直达
    应用工具:vcs 和 verdi



    一、Overview

    (1)Theory

    • 行为级描述
      在这里插入图片描述

    • 结构级描述

    在这里插入图片描述

      移位寄存器可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器等;上图是4位右移寄存器原理图,依据移位寄存器的特点,移位寄存器在时钟的控制下,可将输入数据依次往后移动,N个寄存器级联,最后输出的数据是输入数据的右移N-1位。其中,左边的空位会被补0。其中QD是串行输出端,{QA,QB,QC,QD}可实现并行输出,如果将输出端QD接到输入端QI,则可以实现自循环移位寄存器。

    (2)Demand

    1. 当复位信号为0时,输出端全为0;在每个时钟的上升沿时刻,输出端的4位数据向右移一位。
    2. 使用行为级描述和结构建模方式描述。

    二、Interface

    Signal NameWidthDirectionDescription
    clk1inputSystem clk signal, xxMhz
    rst1inputSystem reset signal
    data1inputDetected data
    result1outputDetection result signal

    三、Timeing

    在这里插入图片描述


    四、Design and Functional Verification

    (1)RTL

    //行为级描述
    //-- modified by xlinxdu, 2022/04/27
    module shift(
      input            clk_i  ,
      input            rst_n_i,
      input            data_i ,
      output reg [3:0] out_o
    );
    reg [3:0] out_s;
    
    always @ (posedge clk_i or negedge rst_n_i)begin
      if(!rst_n_i)begin
        out_s <= 4'b0;
      end
      else begin
        out_s <= {out_s[2:0],data_i};
      end
    end
    
    always @ (posedge clk_i or negedge rst_n_i)begin
      if(!rst_n_i)begin
        out_o <= 4'b0;
      end
      else begin
        out_o <= (out_s >> 3);
      end
    end
     
    endmodule
    
    
    //结构级描述
    //-- modified by xlinxdu, 2022/04/27
    module shift(
      input            clk_i   ,
      input            rst_n_i   ,
      input            data_i  ,
      output reg [3:0] result_o,
      output reg [3:0] out_o
    );
    reg [2:0] cnt;
    reg QA,QB,QC,QD;
    
    always @ (posedge clk_i or negedge rst_n_i)begin
      if(!rst_n_i) begin
        cnt <= 2'b0;
        QA <= 1'b0;
        QB <= 1'b0;
        QC <= 1'b0;
        QD <= 1'b0;
        result_o <= 4'b0;
      end
      else begin
        QA <= data_i;
        QB <= QA;
        QC <= QB;
        QD <= QC;
        result_o <= {QD,QC,QB,QA};
      end
    end
    
    always @ (posedge clk_i or negedge rst_n_i)begin
      if(!rst_n_i) begin
        out_o <= 4'b0;
      end
      else begin
        out_o <= {out_o[2:0],QD};
      end
    end
    endmodule
    

    (2)Test Bench

    //行为级描述测试平台
    //-- modified by xlinxdu, 2022/04/27
    module tb_shift;
      reg clk_i;
      reg rst_n_i;
      reg data_i;
    //  wire [3:0] result_o;
      wire [3:0] out_o;
    
    initial begin
      clk_i = 0;
      rst_n_i = 1;
      data_i = 0;
      #10 rst_n_i = 0;
      #10;
      rst_n_i = 1;
    end
    
    always #50  clk_i = ~clk_i;
    always begin
    #100 data_i = 1;
    #100 data_i = 1;
    #100 data_i = 0;
    #100 data_i = 1;
    #100;
    end
    shift tb_shift(
                    .clk_i(clk_i),
                    .rst_n_i(rst_n_i),
                    .data_i(data_i),
    //                .result_o(result_o),
                    .out_o(out_o)
                  );
    
    initial begin
      $fsdbDumpfile("shift.fsdb");
      $fsdbDumpvars              ;
      $fsdbDumpMDA               ;
      #1000 $finish             ;
    end
    endmodule
    
    //结构描述测试平台
    //-- modified by xlinxdu, 2022/04/27
    module tb_shift;
      reg clk_i;
      reg rst_n_i;
      reg data_i;
      wire [3:0] result_o;
      wire [3:0] out_o;
    
    initial begin
      clk_i = 0;
      rst_n_i = 1;
      data_i = 0;
      #10 rst_n_i = 0;
      #10;
      rst_n_i = 1;
    end
    
    always #50  clk_i = ~clk_i;
    always begin
    #100 data_i = 1;
    #100 data_i = 1;
    #100 data_i = 0;
    #100 data_i = 1;
    #100;
    end
    shift tb_shift(
                    .clk_i(clk_i),
                    .rst_n_i(rst_n_i),
                    .data_i(data_i),
                    .result_o(result_o),
                    .out_o(out_o)
                  );
    
    initial begin
      $fsdbDumpfile("shift.fsdb");
      $fsdbDumpvars              ;
      $fsdbDumpMDA               ;
      #1000 $finish             ;
    end
    endmodule
    
    

    五、Result

    (1)行为级描述测试结果

    在这里插入图片描述

    (2)结构级描述测试结果

    在这里插入图片描述
    分析
      在行为级描述过程中,输出只与输入有关,每次只会操作就近的四位数据,之外的数据会被丢弃掉,四位内左侧补0,因为每次只有四位数据被赋值到中间变量out_s造成下一次的时候,四位以外的数据丢失了,数据不符合实际电路产生的值bug)。
      在结构级描述过程中,输出与result_o是4位寄存器的并输出端,out_o是移位后数据的输出端,其中输出的值需要看该时刻前面的完整的输入值。比如刚开始的时候,串行输入值为0110时,移位输出值为0000;串行输入值为01101时,移位输出值为0001;串行输入值为0110111时,移位输出值为0110,,依次类推,每来一个时钟,数据右移一位输出。

    (3)bug分析

      针对上述情况,分析产生数据丢失的是因为中间的缓存变量每次只缓存4bit数据,而在四位移位寄存器中,要保证数据不被截取掉,至少保证数据位宽为7(移动的3bit+4bit数据)。见下表:

    输入累计数据(4bit)移位后的数据(>>3)累计数据(7bit)移位后的数据(>>3)
    a000a0000000_000a0000
    b00ab0000000_00ab0000
    c0abc0000000_0abc0000
    dabcd000a000_abcd000a
    ebcde000b00a_bcde00ab
    fcdef000c0ab_cdef0abc
    gdefg000dabc_defgabcd
    hefgh000hbcd_efghbcde
    • 更正后的测试波形与结构描述的一一致。
      在这里插入图片描述

    作者:xlinxdu
    版权:本文是作者原创,版权归作者所有。
    转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

    展开全文
  • 当设计中含有LED时,采用移位寄存器...包括恩智浦在内的很供应商都提供标准8位移位寄存器(比如75HC595)。使用集成开漏输出的移位寄存器(比如恩智浦NPIC6C系列)则可在此基础上更进一步,无需使用外部LED驱动器。
  • 目录摘要 .................................................................................................................................... 11 多功能双向移位寄存器 .....................................
  • Verilog——74HC194多功能双向移位寄存器设计思路代码实现设计模块测试模块仿真结果 设计思路 根据74HC194的功能表进行行为级建模,如下图: 代码实现 设计模块 //filename:74HC194.v module _74HC194( input CR,...
  • 从底层结构开始学习FPGA(5)----移位寄存器

    千次阅读 多人点赞 2022-05-25 17:33:55
    源语方式 综合工具推断方式 4.1、源语 (1)源语类型 SRL16E:最高可实现16个时钟周期的移位功能 SRLC32E:最高可实现32个时钟周期的移位功能 以上均可以实现移位寄存器功能,后文以SRLC32E为例进行讲解。...
  • 寄存器和移位寄存器详解

    千次阅读 多人点赞 2020-04-17 08:50:53
    文章目录寄存器的定义寄存器的分类寄存器的工作原理移位寄存器的定义和分类多功能双向移位寄存器典型的集成电路 寄存器的定义 寄存器的分类 寄存器的工作原理 移位寄存器的定义和分类 多功能双向移位...
  • 寄存器与移位寄存器(数字电路)

    千次阅读 2021-06-12 22:23:29
    寄存器功能: 暂时存放计算机的数据或者指令。 基本构成: D触发器 0 时钟上升沿 0 1 1 ...
  • LUT与移位寄存器

    千次阅读 2019-08-02 15:47:53
    L的功能M也能实现,M比L更复杂,所以我们直接去看SLICEM。 图上面时直接从工具里面截的,这里面包括了: 6位读地址输入(A1-A6) 8位写地址输入(WA1-WA7) 写时钟(CLK) 写使能(WEN) 数据输入(DI1)....
  • LabVIEW基本概念系列视频。执行架构包含图形化代码以控制内部代码何时...通过这些架构,即可次执行代码的某些区段,或根据条件执行代码的不同区段。该模块将说明结构的功能,以及何时应该在NI LabVIEW软件中使用。
  • 文章目录[FPGA]周期移位寄存器设计设计目标基础设计移位寄存器模块设计驱动部分顶层设计实现效果添加方向选择功能移位寄存器模块修改实现效果 设计目标 设计一个周期移位寄存器,并实现将一个拨码开关的状态值...
  • LabView编程基础:隧道和移位寄存器

    千次阅读 2021-08-13 11:51:30
    通过代码的结果,来看看隧道和移位寄存器到底什么区别。 一、隧道 1、前面板创建一个数值显示控件 2、程序框图 (2.1)程序框图添加一个For循环,循环次数为3 (2.2)、程序框图For循环外面添加...
  • 从原理到最基本的代码编写(点亮LED灯),认识和使用74HC595移位寄存器
  • 74HC595 8位移位寄存器介绍

    千次阅读 2021-10-06 12:37:44
    74HC595 8位移位寄存器介绍 74HC595是使用非常普遍的一个移位寄存器芯片,由TI公司提供。其主要功能是串转并,即通过串行信号输入转为并行信号输出,用于单片机引脚资源不足时补充引脚的作用,在数码管、继电器网络...
  • 本关任务:在Logisim中,构建由4个D触发器构成的4位循环右移移位寄存器,要求上升沿触发,具有异步复位功能以及并行数据同步加载功能。 相关知识???? 寄存器(Register)的功能是存储二进制代码,它是由具有存储功能...
  • (20)VHDL移位寄存器

    2021-11-10 17:07:31
    (20)VHDL移位寄存器 1.1 目录 1)目录 2)FPGA简介 3)VHDL简介 4)VHDL移位寄存器 5)结语 1.2 FPGA简介 FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是...
  • SHIFT RAM IP核,FPGA工程师们也通常称之为移位寄存器,它是一种特殊的RAM,并且在FPGA图像视频加速领域有着非常广泛的应用,甚至被人们称为专门为图像卷积运算而生的IP核。 在这篇博客里笔者和大家一起去学习实践...
  • 个D触发器构成位寄存器d3、d2、d1、d0q3、q2、q1、q0每一位都由一个D触发器提供 个D触发器的串联构成移位寄存器 第一个D触发器的输入是shiftin后面每一个D触发器的输入,都是左边触发器的输出每一个时钟到来的...
  • 二、 移位寄存器功能与应用 三、XILINX FPGA 中LUT 中移位寄存器的复用情况 一个LUT可以用于产生2个16bit移位寄存器,地址是复用的 利用SRL32 组成 64/96/128 bit的移位寄存器,利用 四、移位寄存器数据流
  • 摘要本文通过对EDA和VHDL的简单说明,阐述了基于VHDL硬件描述语言的移位寄存器设计方法,程序简单,在电子设计中一定的推广价值。关键词移位寄存器设计EDAVHDL随着科学技术的不断进步,尤其是计算机产业的日新月异...
  • 文章目录Shift4Rotate100Shift18Lfsr53位LSFRLfsr32shift registern位 移位寄存器3-input LUTRule90Rule 100 Shift4 构建一个4bit的移位寄存器(右移),含异步复位、同步加载和使能信号 areset:让寄存器复位为0 ...
  • 在数字电子产品中,移位寄存器是级联的触发器,其中一个触发器的输出引脚q连接到下一个触发器的数据输入引脚(d)。 因为所有触发器都在同一时钟上工作,所以存储在移位寄存器中的位阵列将移位一个位置。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,426
精华内容 9,770
关键字:

多功能移位寄存器的功能有

友情链接: 串口控制舵机.zip