Verilog学习笔记——时序逻辑(shift register移位寄存器)

这篇具有很好参考价值的文章主要介绍了Verilog学习笔记——时序逻辑(shift register移位寄存器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 4位移位寄存器  4-bit shift register

4位移位寄存器verilog代码,学习,笔记,fpga开发

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)
                q<=data;
            else if(ena)
                   q<={1'b0,q[3:1]};
            else
                   q<=q;
        end
endmodule
module top_module(
	input clk,
	input areset,
	input load,
	input ena,
	input [3:0] data,
	output reg [3:0] q);
	
	// Asynchronous reset: Notice the sensitivity list.
	// The shift register has four modes:
	//   reset
	//   load
	//   enable shift
	//   idle -- preserve q (i.e., DFFs)
	always @(posedge clk, posedge areset) begin
		if (areset)		// reset
			q <= 0;
		else if (load)	// load
			q <= data;
		else if (ena)	// shift is enabled
			q <= q[3:1];	// Use vector part select to express a shift.
	end
	
endmodule

2. Left/ right register 左移|右移寄存器(1位)

4位移位寄存器verilog代码,学习,笔记,fpga开发

 文章来源地址https://www.toymoban.com/news/detail-769768.html

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)            // load
            q<=data;
        else case(ena)      //  ena
            2'b00: q<=q;
            2'b01:q<={q[0],q[99:1]};  //右移
            2'b10:q<={q[98:0],q[99]}; //左移
            2'b11:q<=q;
            default;
        endcase
    end

endmodule
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)            // load
            q<=data;
        else case(ena)      //  ena
            2'b00: q<=q;
            2'b01:q<={q[0],q[99:1]};  //右移
            2'b10:q<={q[98:0],q[99]}; //左移
            2'b11:q<=q;
            default;
        endcase
    end

endmodule

3. Left/right arithmetic shift by 1 or 8 算数 左移|右移寄存器(1 或8位)

4位移位寄存器verilog代码,学习,笔记,fpga开发

4位移位寄存器verilog代码,学习,笔记,fpga开发

4位移位寄存器verilog代码,学习,笔记,fpga开发

4位移位寄存器verilog代码,学习,笔记,fpga开发

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 
    
    //左移:算数左移==逻辑左移,丢弃高位,低位补0
    //算数右移:丢弃低位,高位补符号位
    //逻辑右移:丢弃低位,高位补0
    
    always@(posedge clk) begin
        if(load)
            q<=data;
        else if(ena)
            begin
                case(amount)
                    2'b00:q<={q[62:0],1'b0};                //左移,空位补0,丢弃高位,低位补0
                    2'b01:q<={q[55:0],8'b0};                //左移,空位补0,丢弃高位,低位补0
                    2'b10:q<={q[63],q[63:1]};                //算数右移,空位补最高位符号位
                    2'b11:q<={{8{q[63]}},q[63:8]};           //算术右移,空位补最高位符号位
                endcase
                
            end
        else q<=q;
    end

endmodule

4. 5-bit LFSR

4位移位寄存器verilog代码,学习,笔记,fpga开发

module top_module(
	input clk,
	input reset,
	output reg [4:0] q);
	
	reg [4:0] q_next;		// q_next is not a register

	// Convenience: Create a combinational block of logic that computes
	// what the next value should be. For shorter code, I first shift
	// all of the values and then override the two bit positions that have taps.
	// A logic synthesizer creates a circuit that behaves as if the code were
	// executed sequentially, so later assignments override earlier ones.
	// Combinational always block: Use blocking assignments.
	always @(*) begin
		q_next = q[4:1];	// Shift all the bits. This is incorrect for q_next[4] and q_next[2]
		q_next[4] = q[0];	// Give q_next[4] and q_next[2] their correct assignments
		q_next[2] = q[3] ^ q[0];
	end
	
	
	// This is just a set of DFFs. I chose to compute the connections between the
	// DFFs above in its own combinational always block, but you can combine them if you wish.
	// You'll get the same circuit either way.
	// Edge-triggered always block: Use non-blocking assignments.
	always @(posedge clk) begin
		if (reset)
			q <= 5'h1;
		else
			q <= q_next;
	end
	
endmodule
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  
            q<={0^q[0],q[4],q[3]^q[0],q[2],q[1]};
    end

endmodule

5. 3-bit LFSR

4位移位寄存器verilog代码,学习,笔记,fpga开发

 

module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q
    
    LFSR u_0(SW[0],KEY[1],KEY[0],LEDR[2],LEDR[0]);
    LFSR u_1(SW[1],KEY[1],KEY[0],LEDR[0],LEDR[1]);
    LFSR u_2(SW[2],KEY[1],KEY[0],LEDR[1]^LEDR[2],LEDR[2]);


endmodule


module LFSR(
    input r,
    input L,
    input clk,
    input Q,
    output q);
    always@(posedge clk)
        begin 
            q <= L? r:Q ;
        end
endmodule
module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q
	reg ry;
    assign  ry=LEDR[1]^LEDR[2];
    mode_muxdff u0(KEY[0],KEY[1],SW[0],LEDR[2],LEDR[0]);
    mode_muxdff u1(KEY[0],KEY[1],SW[1],LEDR[0],LEDR[1]);
    mode_muxdff u2(KEY[0],KEY[1],SW[2],ry,LEDR[2]);
endmodule
module mode_muxdff (
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q);
	wire D;
    assign D=L? r_in:q_in;
    always @(posedge clk)
        begin
            Q<=D;
        end
endmodule

6. 32-bit LFSR

4位移位寄存器verilog代码,学习,笔记,fpga开发

 

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output [31:0] q
); 
    reg[32:0] q_next;
    
    always@(*) begin
        q_next = q[31:1];
        q_next[31] = 0^q[0];
        q_next[21] = q[22]^q[0];
        q_next[1] = q[2]^q[0];
        q_next[0] = q[1]^q[0];
    end
        
    
    always@(posedge clk) begin
        if(reset)
            q<=32'b1;
        else
            q<=q_next;
    end

endmodule

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

7. Shift register

4位移位寄存器verilog代码,学习,笔记,fpga开发

module top_module (
	input clk,
	input resetn,
	input in,
	output out
);

	reg [3:0] sr;
	
	// Create a shift register named sr. It shifts in "in".
	always @(posedge clk) begin
		if (~resetn)		// Synchronous active-low reset
			sr <= 0;
		else 
			sr <= {sr[2:0], in};
	end
	
	assign out = sr[3];		// Output the final bit (sr[3])

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

8. Shift register

4位移位寄存器verilog代码,学习,笔记,fpga开发

4位移位寄存器verilog代码,学习,笔记,fpga开发 

module top_module (
    input [3:0] SW,      //R
    input [3:0] KEY,     //0-clk,1-E,2-L,3-w
    output [3:0] LEDR    //out
); //
    MUXDFF u_3(SW[3],KEY[0],KEY[1],KEY[2],KEY[3],LEDR[3]);
    MUXDFF u_2(SW[2],KEY[0],KEY[1],KEY[2],LEDR[3],LEDR[2]);
    MUXDFF u_1(SW[1],KEY[0],KEY[1],KEY[2],LEDR[2],LEDR[1]);
    MUXDFF u_0(SW[0],KEY[0],KEY[1],KEY[2],LEDR[1],LEDR[0]);
    

endmodule

module MUXDFF (
    input R,
    input clk,
    input E,
    input L,
    input w,
    output q
);
    reg w1,d;
    always@(posedge clk)
        begin
           w1 = E?w:q;
            d = L?R:w1;
            q<=d;
        end
endmodule

 9. 3-input LUT

4位移位寄存器verilog代码,学习,笔记,fpga开发

 

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};
            else
                q<=q;
        end
    always@(*)
        begin
            case({A,B,C})
                3'b0:Z=q[0];
                3'b001:Z=q[1];
                3'b010:Z=q[2];
                3'b011:Z=q[3];
                3'b100:Z=q[4];
                3'b101:Z=q[5];
                3'b110:Z=q[6];
                3'b111:Z=q[7];
            endcase
        end
endmodule
module top_module (
	input clk,
	input enable,
	input S,
	
	input A, B, C,
	output reg Z
);

	reg [7:0] q;
	
	// The final circuit is a shift register attached to a 8-to-1 mux.
	


	// Create a 8-to-1 mux that chooses one of the bits of q based on the three-bit number {A,B,C}:
	// There are many other ways you could write a 8-to-1 mux
	// (e.g., combinational always block -> case statement with 8 cases).
	assign Z = q[ {A, B, C} ];



	// Edge-triggered always block: This is a standard shift register (named q) with enable.
	// When enabled, shift to the left by 1 (discarding q[7] and and shifting in S).
	always @(posedge clk) begin
		if (enable)
			q <= {q[6:0], S};	
	end
	
	
	
endmodule

到了这里,关于Verilog学习笔记——时序逻辑(shift register移位寄存器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • verilog——移位寄存器

    在Verilog中,你可以使用移位寄存器来实现数据的移位操作。移位寄存器是一种常用的数字电路,用于将数据向左或向右移动一个或多个位置。这在数字信号处理、通信系统和其他应用中非常有用。以下是一个使用Verilog实现的简单移位寄存器的示例: module ShiftRegister (   inpu

    2024年02月05日
    浏览(43)
  • Verilog实现移位寄存器

    Verilog实现8位环形移位寄存器 左移: 环形就是首尾相连 右移: 普通的移位寄存器用for语句实现: 普通左移: tb测试: 图形分析: 双向shift:就是加个判断

    2024年02月11日
    浏览(51)
  • 数字IC前端学习笔记:LSFR(线性反馈移位寄存器)

    相关文章 数字IC前端专栏 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482 引言 LFSR(线性反馈移位寄存器)用于产生可重复的伪随机序列PRBS(Pseudo-Random Binary Sequence),结构包括n级D触发器和一些异或门(或同或门)组成,在每个时钟沿,后级D触发器输出会以

    2024年02月02日
    浏览(38)
  • verilog 学习笔记 —— 时序逻辑 Sequential Logics (Latches and Flip-Flops 锁存器和触发器)

    1. D flip-flop D触发器 2. D flip-flop  D触发器 3. DFF with reset  带复位的D触发器  4. 带复位值的D触发器 5. DFF with asynchronous reset 带异步复位功能的 D触发器 6. DFF with byte enable   带位启动的触发器 7. D Latch  D锁存器 8. DFF  9. DFF   10. DFF+gate   11. Mux and DFF   12. DFFs and gates   13

    2024年02月04日
    浏览(58)
  • Verilog基础之十一、移位寄存器实现

    目录 一、前言 二、工程设计 ​2.1 工程代码 2.2 综合结果 2.3 仿真结果     移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。  工程中包

    2024年02月11日
    浏览(44)
  • 【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

    移位寄存器 :指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。 反馈移位寄存器(Feedback Shift Register,FSR) :每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就

    2024年02月15日
    浏览(52)
  • hdlbits系列verilog解答(8位宽移位寄存器)-24

    这项练习是module_shift移位寄存器的延伸。模块端口不是只有单个引脚,我们现在有以向量作为端口的模块,您将在其上附加线向量而不是普通线网数据。与 Verilog 中的其他位置一样,端口的向量长度不必与连接到它的导线匹配,但这会导致向量的零填充或截断。本练习不使用

    2024年02月08日
    浏览(36)
  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(42)
  • 【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

      目录 Ⅰ. 理论部分 0x00 移位寄存器(Shift Register) 0x01 环形计数器(Ring Counter)

    2024年02月05日
    浏览(41)
  • Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    参考文献1 不简单的进行移位,而是在移位的基础上加上异或门,如题目所示,这就相当于每进行一次移位,寄存器中的值会发生改变,一直移动,一直改变,就形成了伪随机数。

    2024年02月09日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包