精华内容
下载资源
问答
  • 移位寄存器实现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 o...

     

    移位寄存器实现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

     

     

     

    展开全文
  • Verilog——74HC194多功能双向移位寄存器设计思路代码实现设计模块测试模块仿真结果 设计思路 根据74HC194的功能表进行行为级建模,如下图: 代码实现 设计模块 //filename:74HC194.v module _74HC194( input CR,...

    Verilog——74HC194多功能双向移位寄存器

    设计思路

    根据74HC194的功能表进行行为级建模,如下图:

    在这里插入图片描述

    代码实现

    设计模块

    
    //filename:74HC194.v
    module _74HC194(
    input CR,CP,DSR,DSL,
    input [1:0] S,
    input [3:0] D,
    output reg [3:0] Q);
    /*端口说明:
    输入:CR为异步置零端,CP为时钟信号,DSR为右移串行数据输入端,DSL为左移串行数据输入端,
         S为控制信号:当S=00时,输出保持;S=01时,输出右移;S=10时,输出左移,S=11时,进行同步并行置数
     输出:
         Q为输出端信号
     */
     //敏感信号:CP上升沿和CR的下降沿
     always@(posedge CP or negedge CR)
    begin
    if(~CR)    Q<=4'b0000;  //CR异步置零的优先级最高
    else
        case(S)             //判断控制信号
    	2'b00:Q<=Q;
    	2'b01:Q<={Q[2:0],DSR};    //使用位拼接运算符实现数据的左右移动
    	2'b10:Q<={DSL,Q[3:1]};
    	2'b11:Q<=D;
        endcase
    end
    endmodule

    测试模块

    //tb_74HC194.v
    //filename:tb_74HC194.v
    `timescale 10ns/1ns
    module tb_74HC194;
    reg CR,CP,DSR,DSL;
    reg [1:0] S;
    reg [3:0] D;
    wire [3:0] Q;
    /*端口说明:
    输入:CR为异步置零端,CP为时钟信号,DSR为右移串行数据输入端,DSL为左移串行数据输入端,
         S为控制信号:当S=00时,输出保持;S=01时,输出右移;S=10时,输出左移,S=11时,进行同步并行置数
     输出:
         Q为输出端信号
     */
    _74HC194 U(CR,CP,DSR,DSL,S,D,Q);
    
    initial
    	$monitor($time,"\tDSR=%b,DSL=%b,S=%b,D=%b,Q=%b",DSR,DSL,S,D,Q);
    //时钟脉冲
    initial 
    	CP=0;
    always
    	#1 CP=~CP;
    //测试
    initial begin
    	//预置为1111
    	CR=1;S=2'b11;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//清零
    	CR=0;S=2'b11;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//右移,DSR=1
    	CR=1;S=2'b01;DSR=1;DSL=0;D=4'b1111;
    	#2
    	//右移,DSR=1
    	CR=1;S=2'b01;DSR=1;DSL=0;D=4'b1111;
    	#2
    	//右移,DSR=0
    	CR=1;S=2'b01;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//右移,DSR=0
    	CR=1;S=2'b01;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//清零
    	CR=0;S=2'b11;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//左移,DSL=1
    	CR=1;S=2'b10;DSR=0;DSL=1;D=4'b1111;
    	#2
    	//左移,DSL=1
    	CR=1;S=2'b10;DSR=0;DSL=1;D=4'b1111;
    	#2
    	//左移,DSL=0
    	CR=1;S=2'b10;DSR=0;DSL=0;D=4'b1111;
    	#2
    	//左移,DSL=0
    	CR=1;S=2'b10;DSR=0;DSL=0;D=4'b1111;
    	#2
    	$stop;
    end
    endmodule

    仿真结果

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

    展开全文
  • 文章目录[FPGA]周期移位寄存器设计设计目标基础设计移位寄存器模块设计驱动部分顶层设计实现效果添加方向选择功能移位寄存器模块修改实现效果 设计目标 设计一个周期移位寄存器,并实现将一个拨码开关的状态值...

    [FPGA]多周期移位寄存器设计

    设计目标

    设计一个多周期移位寄存器,并实现将一个拨码开关的状态值移位输入到寄存器并顺序移位,再将寄存器的每个比特送至一个LED灯上显示。

    之后为移位寄存器添加方向选择功能。

    基础设计

    移位寄存器模块设计

    module shift_reg_SIPO(
      RST   ,   // 异步复位, 高有效
      CLK   ,   // 时钟,上升沿有效
      EN    ,   // 输入数据串行移位使能
      IN    ,   // 输入串行数据
      OUT   );  // 并行输出数据
    parameter SHLEN = 6;
    input RST, CLK, EN;
    input IN;
    output[SHLEN-1:0] OUT;
    reg [SHLEN-1:0] shift_R;
    
    assign OUT[SHLEN-1:0] = shift_R[SHLEN-1:0];
    // 时序逻辑 根据输入使能进行串行移位
    // shift_R 会被编译为D触发器
    always @ (posedge CLK or posedge RST) begin
      if(RST) 
        shift_R[SHLEN-1:0] <= 0;
      else
        if(EN) begin // 串行移位的使能有效
          shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
          shift_R[0]   <= IN;
        end
        else begin // 使能无效保持不动
          shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
        end
    end // always
    endmodule
    

    RTL视图:

    在这里插入图片描述

    默认是将相同的模块组合的,先左键选择D触发器,然后右键选择Ungroup,可以清晰地看到移位寄存器内部的结构关系。

    在这里插入图片描述

    驱动部分

    基础的时间基准电路即可。

    顶层设计

    在这里插入图片描述

    将各个模块和输入输出端口连接,配置管脚。

    最后上板子。

    实现效果

    程序会将SW0的状态输入LED0,然后进行移位。更改SW0的状态可以更改输入LED0的数据,从而实现灯的亮灭控制。

    添加方向选择功能

    移位寄存器模块修改

    添加方向选择功能只需要在移位寄存器的Verilog里对移位的部分进行修改即可,即对使能部分添加如下方向选择的功能。

    if(EN) begin // 串行移位的使能有效
    	if(DIR)begin
    		shift_R[SHLEN-2:0] <= shift_R[SHLEN-1:1];
    		shift_R[SHLEN-1] <= IN;
    	end
    	else begin
    		shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
            shift_R[0]   <= IN;
        end
      end
      else begin // 使能无效保持不动
        shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
    end
    

    完整的移位寄存器模块代码:

    module shift_reg_SIPO(
      RST   ,   // 异步复位, 高有效
      CLK   ,   // 时钟,上升沿有效
      EN    ,   // 输入数据串行移位使能
      DIR	,	// direction
      IN    ,   // 输入串行数据
      OUT   );  // 并行输出数据
    parameter SHLEN = 10;
    input RST, CLK, EN, DIR;
    input IN;
    output[SHLEN-1:0] OUT;
    reg [SHLEN-1:0] shift_R;
    
    assign OUT[SHLEN-1:0] = shift_R[SHLEN-1:0];
    // 时序逻辑 根据输入使能进行串行移位
    // shift_R 会被编译为D触发器
    always @ (posedge CLK or posedge RST) begin
      if(RST) 
        shift_R[SHLEN-1:0] <= 0;
      else
        if(EN) begin // 串行移位的使能有效
    		if(DIR)begin
    			shift_R[SHLEN-2:0] <= shift_R[SHLEN-1:1];
    			shift_R[SHLEN-1] <= IN;
    		end
    		else begin
    			shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
    			shift_R[0]   <= IN;
    		end
        end
        else begin // 使能无效保持不动
          shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
        end
    end // always
    endmodule
    

    RTL视图:

    在这里插入图片描述

    可以看到是在每一级D触发器的输入前加入了2选1的mux,以此来控制移位的方向。

    实现效果

    SW0的效果和功能和修改前一样。

    为SW1添加了方向选择的功能。当SW1断开时,移位的效果和修改前一样,从右往左移动。如果把SW1闭合,那么方向发生改变,将会从左往右移动,并将SW0的状态输入LED5。

    可以通过在顶层设计中更改shift_reg_SIPO的参数来更改参与移位寄存的LED灯的个数。

    展开全文
  • 寄存器和移位寄存器详解

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

    寄存器的定义

    在这里插入图片描述

    寄存器的分类

    在这里插入图片描述

    寄存器的工作原理

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

    移位寄存器的定义和分类

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

    多功能双向移位寄存器

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

    典型的集成电路

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • LabVIEW的移位寄存器

    2021-01-19 23:05:03
     图2和图3分别显示为For循环结构和While循环结构添加移位寄存器后的结果移位寄存器在循环结构框的左右两侧是成对出现的,一个寄存器右侧的端子只能一个元素,而左侧的端子可以有多个元素。移位寄存器的颜色和输入...
  • 二、 移位寄存器功能与应用 三、XILINX FPGA 中LUT 中移位寄存器的复用情况 一个LUT可以用于产生2个16bit移位寄存器,地址是复用的 利用SRL32 组成 64/96/128 bit的移位寄存器,利用 四、移位寄存器数据流
  • 本关任务:在Logisim中,构建由4个D触发器构成的4位循环右移移位寄存器,要求上升沿触发,具有异步复位功能以及并行数据同步加载功能。 相关知识???? 寄存器(Register)的功能是存储二进制代码,它是由具有存储功能...
  • 设计目标(1) 设计时间基准电路和带使能的周期移位寄存器 • (2)电路工作在50MHz (3)在每个时间基准信号有效的时钟周期 – 把一个拨码开关的状态值移位输入到寄存器的最低位 – 顺序移动移位寄存器的值 –...
  • 周期移位寄存器实验要求实验代码BDF顶层文件verilog 代码板级调试 实验要求 设计新的功能 – 在原有的电路基础上,添加方向选择功能。 – SW0仍然是移位寄存器组的输入 – 使用SW1开关,控制移位寄存的方向 ...
  • 实验要求 • 编译下载电路观察现象 • 拨动SW0开关,观察LED的闪烁变换情况 • 设计新的功能 – 在原有的电路基础上,添加方向选择功能。 – SW0仍然是移位寄存器组的输入 ...串入并出移位寄存器设计...
  •  图2和图3分别显示为For循环结构和While循环结构添加移位寄存器后的结果移位寄存器在循环结构框的左右两侧是成对出现的,一个寄存器右侧的端子只能一个元素,而左侧的端子可以有多个元素。移位寄存器的颜色和输入...
  • 设计时间基准电路和带使能的周期移位寄存器 • 电路工作在50MHz • 在每个时间基准信号有效的时钟周期 – 把一个拨码开关的状态值移位输入到寄存器的最低位 – 顺序移动移位寄存器的值 – 寄存器的每个比特送...
  • 实验六 移位寄存器及其应用

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

    千次阅读 2019-02-03 16:03:51
    用Verilog写一个简单的多功能移位寄存器,并在移位寄存器的基础上进行修改,利用移位功能形成流水灯的效果 基本的功能如下: 寄存器示意图见下方虚拟面板图 两种改进方式: 第一种是把最后一个功能改成循环右移,...
  • 移位寄存器

    2015-02-25 12:17:00
    寄存器是计算机和其它数字系统中用来存储代码或数据的逻辑部件。它的主要组成部分是触发器。一个触发器能存储1位二进制代码,所以要存储n位二进制代码的寄存器就须要用n个触发器组成。一个4位的集成寄存器74LS...
  • : 桶式移位寄存器是 C P U ...高和推广, 许 用户开始用 F P G A实现微处理器的功能, 其中桶式移位寄存器的设计对系统的性能较大的影响。 本文提 出了三种桶式3 2移位寄存器的设计和实现方法, 给出了实现结果。
  • 然后利用该触发器与SABL逻辑门实现移位寄存器电路。Spectre仿真验证表明,所设计的移位寄存器逻辑功能正确,在多种PVT组合下NED均低于2.66%、NSD均低于0.63%,具有显著的防御差分功耗分析性能。
  • HDLBits答案(12)_Verilog移位寄存器

    千次阅读 2020-11-02 16:46:22
    Verilog移位寄存器 HDLBits链接 前言 今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的。 题库 题目描述1: 构建一个4bit的移位寄存器(右移),含异步复位、同步加载和使能 ...
  • LUT与移位寄存器

    千次阅读 2019-08-02 15:47:53
    L的功能M也能实现,M比L更复杂,所以我们直接去看SLICEM。 图上面时直接从工具里面截的,这里面包括了: 6位读地址输入(A1-A6) 8位写地址输入(WA1-WA7) 写时钟(CLK) 写使能(WEN) 数据输入(DI1)....
  • 此程序是用verilog语言编写的8位移位寄存器,已经通过了验证!
  • 2、右击while循环的边框创建添加移位寄存器,这两个移位寄存器的值是相等的 3、在左边的移位寄存器创建一个常量,初始值为0 4、左边的移位寄存器,也就是变量加一后复制给右边的寄存器 5、在右边的移位寄存器...
  • 在数字电子产品中,移位寄存器是级联的触发器,其中一个触发器的输出引脚q连接到下一个触发器的数据输入引脚(d)。 因为所有触发器都在同一时钟上工作,所以存储在移位寄存器中的位阵列将移位一个位置。
  • 变量的作用:在并行循环间传递...移位寄存器可以将前一循环产生的数据传递至下一循环,右键单击循环边框,添加移位寄存器,右侧的移位寄存器存储每次循环结束后的数据,左侧的移位寄存器为下一循环提供所存储的数据。
  • 计算机组成原理——移位寄存器实验报告

    万次阅读 多人点赞 2019-01-28 17:03:07
    验证移位寄存器的组合功能。 二、实验内容 1、实验原理 移位运算实验原理如图1.1所示。移位运算实验原理如图3-4所示,使用了一片74LS299(U34)作为移位发生器,其八位输入/输出端通过74LS245引到...
  • 移位寄存器功能和电路形式较,按移位方向分左移、右移、和双向移位寄存器;按接收数据方式分为串行输入和并行输入;按输出方向分为串行输出和并行输出。 如果将若干个触发器级联成如下图所示电路,则构成基本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,989
精华内容 6,395
关键字:

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