精华内容
下载资源
问答
  • verilog8位寄存器

    2018-04-20 13:05:50
    verilog初学者设计8位寄存器,提供verilog代码,里面不含仿真文件。
  • 寄存器Verilog

    千次阅读 2010-07-29 14:36:00
    有异步清零端的n位寄存器:module regn(D,clk,reset,Q); parameter n=16; input [n-1] D; input clk,reset; output [n-1] reg Q; always @(negedge reset,posedge clk) if(!reset) //复位端reset低电平...

    1。有异步清零端的n位寄存器:

    module regn(D,clk,reset,Q);

      parameter n=16;

      input  [n-1] D;

      input  clk,reset;

      output [n-1] reg Q;

     

      always @(negedge reset,posedge clk)

          if(!reset)  //复位端reset低电平有效

             Q<=0;

           else

             Q<=D;

     

    endmodule

     

    2.D输入端有2选1多路器的D触发器:

    module  mux_flipflop(sel,D0,D1,clk,Q);

       input  D0,D1,sel,clk;

       output reg Q;

     

    always @(posedge clk)

         if(!sel)

             Q<=D0;

         else

             Q<=D1;

     

    endmodule

     

    3.四位一位寄存器:

    /*当load=1时,让D的值赋给Q;当load=0时,寄存器向右移,right移入最高位Q[3];*/

     

    module shift4(D,right,load,clk,Q);

        input  [3:0] D;

        input load ,clk,right;

        output  [3:0]  reg Q;

     

        always @(posedge clk)//注:这里的敏感信号只有一个clk,同步加载;

             if(load==1)

                 Q<=D;

             else

             begin

                Q[0]<=Q[1];

                Q[1]<=Q[2];

                Q[2]<=Q[3];

                Q[3]<=right;

             end

     

    endmodule

     

    4.n位移位寄存器:

    module shiftn(D,load,right,clk,Q);           

         parameter  n=16;

         input [n-1] D;

         input load,right,clk;

         output [n-1] reg  Q;

         integer  k;

     

         always  @(posedge clk)

              if(load==1)

                   Q<=D;

               else

               begin

                   for(k=0;k<n-1;k=k+1)    

                        Q[k]=Q[k+1];

                   Q[n-1]=right;

               end

     

    endmodule

     

    5。四位递增计数器:

    /*E为使能计数端,reset为异步复位端。*/

    module upcount(D,reset,clk,load,E,Q);

         input [3:0] D;

         input reset,clk,E,load;

         output [3:0] reg Q;

     

         always @(negedge reset,posedge clk)

              if(!reset)

                  Q<=0;

              ele if(load)

                  Q<=D;

              else  if(E)//注:这里的else是必须的。因为复位端reset优先级最高。

                      Q<=Q+1;

     

    endmodule

     

    6.递增/减计数器代码:

    module updowncounter(D,clk,load,E,updown,Q);

         parameter  n=8;

         input [n-1] D;

         input clk,load,E,updown;

         output [n-1] reg Q;

         integer direction;

     

         always @(clk)

            begin

                direction=-1

                if(reset)

                   Q<=0;

                 else if(updown)

                    direction<=1;

                 else if(load)

                     Q<=D;

                  else if(E)

                     Q<=Q+direction;

                end

     

    endmodule

     

                

                 

        

     

            

            

                 

         

    展开全文
  • Cyclone4E FPGA设计4并入串出移位寄存器Verilog逻辑源码Quartus工程文件.。Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 **----------------------------文件信息--...
  • LocalBUS总线读写寄存器Verilog代码实现(一)应用背景注意事项 应用背景 在FPGA内部,经常需要实现一些寄存器功能,这些寄存器可以通过外部的localbus并行总线或其它串行总线来访问。本文所设计的模块先考虑并行...

    LocalBUS总线读写寄存器的Verilog代码实现(一)

    应用背景

    在FPGA内部,经常需要实现一些寄存器功能,这些寄存器可以通过外部的localbus并行总线或其它串行总线来访问。本文所设计的模块先考虑并行情况,针对串行总线的情况,需要增加另外的串转并模块,请参阅其它博文。
    模块所涉及的信号主要是地址、双向数据、片选、读、写,用到的知识就是数字电路里的译码器,地址总线上送来的一组数据满足FPGA内部的地址时,访问寄存器信号有效。然后依据是读有效还是写有些,分别实现不同的功能。

    注意事项

    1. 总线描述的时候,一定要注意位宽是放在变量名称的前面,如果放在后面,则是表示变量的某一位,或者表示某个内存地址。
      比如:
      [7:0]BMD,表示8位宽度的BMD总线;
      BMD[7:0],表示BMD的bit7到bit0;
      [7:0]BMD[7:0],表示一个数据,或者叫矩阵,8个位宽是8位矩阵。
    2. 需要注意地址锁存的条件,写操作时,判断的是nBWE的上升沿;读操作判断nBOE的下降沿。实际应用时需要留意锁存的时序条件是否满足,可以根据实际选择使用上升沿还是下降沿。如果存在锁存失败的情况,需要改为判断Clk上升沿,做成时序逻辑。

    always@(posedge Clk )
    begin
    if (~Rst_n && nBWE)

    1. 双向端口不能在模块间传递,意思是只能顶层定义双向端口,然后在顶层模块里分别实现读写寄存器,然后往下一层模块传递数据。
    2. testbench文件请参考下一篇博文。

    代码如下:

    module regs(
    	Clk,  //时钟
    	Rst_n, //复位信号,低有效
    	BMA,  //地址信号
    	BMD,  //数据信号
    	nBOE, //读信号,低有效
    	nBWE, //写信号,低有效
    	nBCS1 //片选信号,低有效
    );
    
    input Clk;
    input Rst_n;
    input [7:0]BMA;
    
    inout [7:0]BMD;
    
    input nBOE;
    input nBWE;
    input nBCS1;
    
    
    //CPLD Registers
    reg 	[7:0]SFTDog_reg;
    reg 	[7:0]Read_reg_data;
    reg 	[7:0]Test_reg ;
    
    reg	[7:0]cpld_ver = 8'b0010_0001;		//CPLD major revision
    
    reg 	system_rst = 1'b0;				//CPLD software reset
    
    wire SFTDog_CS;
    
    localparam [7:0]
    		ADDR_HDDog_Close            = 8'h060,	// F500_180  ADDR[9:2]
    		
    		ADDR_Test_reg					 = 8'h061,	// F500_184
    		
    		ADDR_SFTDog_CS              = 8'h071,  // F500_01C4
    		ADDR_SFTDog_Clr             = 8'h072;  // F500_01C8
    		
    	
    	assign SFTDog_CS    = (!nBCS1  &&  (BMA[7:0] == ADDR_SFTDog_CS[7:0])) ? 1'b0 : 1'b1;	
    
    // write logic	
    //	always@(posedge Clk  or  negedge Rst_n)
    //		if (!Rst_n)		
    //			SFTDog_reg <= 8'h38;
    //		else if (!SFTDog_CS && !nBWE)	
    //			SFTDog_reg <=  BMD;
    
    
    // write logic			写逻辑实现	
    always@(posedge nBWE or negedge Rst_n )                               
    	begin
    		if (~Rst_n)												//Set CPLD registers to default value
    			begin
    				SFTDog_reg <= 8'h38;
    				Test_reg <= 8'b0011_1100;
    			end
    
    		else if (~nBCS1)
    			begin
    				case (BMA[7:0])
    					ADDR_SFTDog_CS:	SFTDog_reg <=  BMD;
    											
    					ADDR_Test_reg:		Test_reg <= BMD;
    //						4:	soft_mux_on1[7:0] <= cpld_data[7:0];
    //						5:	cfg_rcw_src1[7:0] <= cpld_data[7:0];
    //		在此处添加更多的寄存器	
    				endcase
    			end
    	end			
    			
    
    			
    //read registers 读逻辑实现
    assign BMD[7:0] = (!nBCS1 && !nBOE) ?	Read_reg_data[7:0]	:	8'bzzzz_zzzz;
    
    always@(negedge nBOE)                
    	begin
    		if (~nBCS1)
    			begin
    				case (BMA[7:0])
    
    					ADDR_SFTDog_CS:	Read_reg_data[7:0] <= SFTDog_reg;
    					ADDR_Test_reg:		Read_reg_data[7:0] <= Test_reg ;
                       //在此处添加更多的寄存器
    					default:	Read_reg_data[7:0]<=8'bzzzz_zzzz;
    				endcase	
    			end
    	end
    	
    endmodule
    		
    
    展开全文
  • Verilog寄存器堆的实现代码
  • LocalBUS总线读写寄存器Verilog代码实现(二)-inout型双向总线Testbench的编写Testbench 注意事项Teshbench 源码仿真波形 Testbench 注意事项 在本例中,testbench 的难点在于如何对双向信号进行仿真,通过查找...

    LocalBUS总线读写寄存器的Verilog代码实现(二)-inout型双向总线Testbench的编写

    Testbench 注意事项

    在本例中,testbench 的难点在于如何对双向信号进行仿真,通过查找资料,我找到用下方法来实现inout型信号的仿真。

    reg [7:0]BMD$inout$reg;
    wire [7:0]BMD = BMD$inout$reg;
    

    Teshbench 源码

    写总线的时候通过
    BMD$inout$reg = 8’ha5;
    来赋值。
    读总线的时候只需要给地址赋值即可。

    `timescale 1ns/1ns
    `define clock_period 20
    
    module regs_tb;
    	reg clk;
    	reg rst_n;
    	
    	reg [7:0]BMA;
    
    	reg nBOE;
    	reg nBWE;
    	reg nBCS1;
    
    	reg [7:0]BMD$inout$reg = 8'b0000_0000;
    	wire [7:0]BMD = BMD$inout$reg;
    
    	wire HDDog_close;  //8'h60,	F500_180  ADDR[9:2] write 5a
    //	wire SFTDog_close; //8'h71,   F500_01C4 read close soft dog
    //	wire SFTDog_open;  //8'h71,   F500_01C4 write a5 open soft dog
    	wire SFTDog_en;
    	wire SFTDog_clr;	 //8'h72,   F500_01C8 write aa
    	
    	wire SFTDog_close_view; //8'h71,   F500_01C4 read close soft dog
    	wire SFTDog_open_view;  //8'h71,   F500_01C4 write a5 open soft dog
    	
    
    assign 	SFTDog_close_view = regs0.SFTDog_close;
    assign 	SFTDog_open_view = regs0.SFTDog_open;
    	
    	regs	regs0(
    			.Clk(clk),
    			.Rst_n(rst_n),
    			.BMA(BMA),
    			.BMD(BMD),
    			.nBOE(nBOE),
    			.nBWE(nBWE),
    			.nBCS1(nBCS1),
    			.HDDog_close(HDDog_close),
    			.SFTDog_en(SFTDog_en),
    			.SFTDog_clr(SFTDog_clr)
    	);
    	
    	initial clk = 1;
    	always #(`clock_period/2) clk = ~clk;
    	
    	initial begin
    		rst_n = 1'b0;
    		#(`clock_period *100);
    		rst_n = 1'b1;
    		#(`clock_period *100);
    		
    		nBCS1 = 1;
    		nBOE = 1;
    		nBWE = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *100);
    		
    	//read
    		BMA = 8'h61;
    		nBCS1 = 0;
    		#(`clock_period *2);	
    		nBOE = 0;
    		nBWE = 1;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		#(`clock_period *10);
    		
        //write
    		BMA = 8'h61;
    		BMD$inout$reg = 8'ha5;
    		nBCS1 = 0;
    		#(`clock_period *2);		
    		nBOE = 1;
    		nBWE = 0;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *10);
    		
    	//read
    		BMA = 8'h61;
    		nBCS1 = 0;
    		#(`clock_period *2);	
    		nBOE = 0;
    		nBWE = 1;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		#(`clock_period *10);
    		
    	 //write  HDDog_close
    		BMA = 8'h60;
    		BMD$inout$reg = 8'h5a;
    		nBCS1 = 0;
    		#(`clock_period *2);		
    		nBOE = 1;
    		nBWE = 0;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *10);
    		
    
    	//read SFTDog_close
    		BMA = 8'h71;
    		nBCS1 = 0;
    		#(`clock_period *2);	
    		nBOE = 0;
    		nBWE = 1;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		#(`clock_period *10);
    		
    	 //write  SFTDog_open
    		BMA = 8'h71;
    		BMD$inout$reg = 8'ha5;
    		nBCS1 = 0;
    		#(`clock_period *2);		
    		nBOE = 1;
    		nBWE = 0;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *30);
    		
    			//read SFTDog_close
    		BMA = 8'h71;
    		nBCS1 = 0;
    		#(`clock_period *2);	
    		nBOE = 0;
    		nBWE = 1;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		#(`clock_period *30);
    		
    	 //write  SFTDog_open
    		BMA = 8'h71;
    		BMD$inout$reg = 8'ha5;
    		nBCS1 = 0;
    		#(`clock_period *2);		
    		nBOE = 1;
    		nBWE = 0;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *30);
    		
    	 //write  SFTDog_clr
    		BMA = 8'h72;
    		BMD$inout$reg = 8'haa;
    		nBCS1 = 0;
    		#(`clock_period *2);		
    		nBOE = 1;
    		nBWE = 0;
    		#(`clock_period *3);
    		nBOE = 1;
    		nBWE = 1;
    		#(`clock_period *2);
    		nBCS1 = 1;
    		BMA = 8'hff;
    		BMD$inout$reg = 8'hzz;
    		#(`clock_period *10);
    		
    		$stop;
    	end
    	
    endmodule
    
    
    

    仿真波形

    待测试寄存器上电默认值为0x3c,执行一次写操作(写入0xa5),再次读寄存器,返回值为0xa5。操作成功。
    在这里插入图片描述

    展开全文
  • 32CPU Verilog 代码

    2018-01-22 11:06:40
    32的cpu verilog 源码,希望对开发cpu架构的硬件工程师有所帮助。
  • Verilog FPGA 4位寄存器 异步清零 同步置数 可调时钟周期
  • Verilog4位寄存器程序(可调周期)

    千次阅读 2018-04-22 23:30:43
    本文提供了用Verilog设计4位寄存器代码,且时钟周期可调,实现异步清零与同步置数,已通过Basys2开发板验证。代码如下:module register #(parameter N=4) ( input wire load, input wire clr, input wire clk...

    本文提供了用Verilog设计4位寄存器的代码,且时钟周期可调,实现异步清零与同步置数,已通过Basys2开发板验证。

    代码如下:

    module register
    #(parameter N=4)
    (
        input wire load,
        input wire clr,
    	 input wire clk,
    	 input wire [N-1:0] d,
    	 output reg [N-1:0] q
        );
    	 
      reg [25:0] m;
      reg n;
      initial m=26'b0;
      initial n=0;
      
      always@(posedge clk) //clk频率为50MHz
      begin
        if(m==25000000)//通过改变m的条件值可改变n的频率
    	   n=!n;
    	 else
    	   m<=m+1;
        if(m==25000000)//通过改变m的条件值可改变n的频率
    	   m<=0;
    	 else
    	   m<=m+1;
      end
      
      always@(posedge n or posedge clr)
      begin
        if(clr==1)
    	   q<=0;
    	 else if(load==1)
    	   q<=d;
    	 else
    	   q<=q; 
      end
    	 
    
    endmodule
    

    约束条件如下:

    NET"d[0]"LOC=P11;
    NET"d[1]"LOC=L3;
    NET"d[2]"LOC=K3;
    NET"d[3]"LOC=B4;
    NET"clk"LOC=B8;
    NET"clr"LOC=N3;
    NET"load"LOC=E2;
    NET"q[0]"LOC=M5;
    NET"q[1]"LOC=M11;
    NET"q[2]"LOC=P7;
    NET"q[3]"LOC=P6; 

    欢迎大家指正,觉得有用就赞一个~


    展开全文
  • 此程序是用verilog语言编写的8位移位寄存器,已经通过了验证!
  • 寄存器:用以存放二进制代码的电路,下图为由维特阻塞D触发器组成的4位数码寄存器: 逻辑功能分析: 1.异步端CR置0时,输出置0; 2.同步并行置数:D0~D3为4个输入代码,当CP上升沿到达时,D0~D3被同时并行置入。 3....
  • 1 Verilog描述 module shift_s2s( input din, input clk, output reg dout ); reg tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;...//串行输入串行输出移位.../*8位移位寄存器8个D触发器串联构成,在时钟 信号的作用...
  • 8位串入并出移位寄存器Verilog描述

    千次阅读 2020-04-24 18:18:00
    1 Verilog描述 module shift_s2p( input din, input clk, input clr, output reg [7:0] q ); //串入并出移位寄存器 /* 该寄存器8个同步D触发器组成 */ always@(posedge clk or negedge clr)begin ...
  • FPGA Verilog寄存器模块及testbench代码

    千次阅读 2020-04-02 10:27:49
    异步清零寄存器 工作原理: CP 不为上升沿,且 RD=1 时,寄存器输出保持不变。 CP 上升沿,且 RD=1 时,输入端 D0-D3 送...寄存器模块代码: module hardreg(d,clk,clrb,q); input clk,clrb; input[3:0] d; outp...
  • 目录 背景 ...环形移位寄存器(右移) Verilog HDL描述 测试代码 仿真波形图 ISE综合 背景 之所以单独把这个简单的东西拿出来,就是因为这个东西我可能要用到,不能眼高手低,以为简单就一...
  • 简单的串行数据到8位并行数据的转换,verilog语言描述
  • Verilog 代码风格

    2020-05-18 23:13:29
    verilog 代码风格
  • 移位寄存器专题(verilog HDL设计)

    万次阅读 多人点赞 2018-05-19 21:09:11
    4右移位寄存器工作原理 1、16右移位寄存器 2、16左移寄存器 3、串行输入并行输出寄存器 4、并行输入串行输出移位寄存器 移位寄存器简介 移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移...
  • APB接口的I2S verilog 代码 APB接口的I2S verilog 代码
  • Biss C Verilog代码

    2021-01-13 16:03:49
    Biss C Verilog代码,可以直接用于支持Biss C编码器的读取。
  • verilog代码设计

    2021-06-17 10:13:06
    1、带异步复位下降沿触发器的HDL代码 2、8位双向可控制移位寄存器设计
  • FPGA边沿检测Verilog代码(上升沿,下降沿,双边沿) 实现思路:用两个一位寄存器直接异或可以实现 代码实现: module edge_detect( input clk, input rst_n, ...
  • verilog代码解析脚本

    2012-03-10 23:52:46
    该perl脚本可以读入verilog代码,利用哈希数据结构提取出代码的丰富信息,如路径、文件名、模块名、例化名、例化关系、模块接口名等。是处理verilog代码的利器。
  • 36个Verilog设计基础代码移位寄存器编码器加法减法器分频器计数器逻辑源码Quartus工程文件合集, Quartus软件版本11.0, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 38decoder 4串入串出...
  • Verilog 学习过程——4移位寄存器的设计与实现
  • verilog寄存器复用小技巧

    千次阅读 2019-12-10 21:42:07
    在编写较为复杂的电路时,寄存器往往需要进行复用。对于非常大的电路来说,一般会设置一个支持寻址的寄存器堆,然后像CPU那样使用微码来控制寄存器的访问。但如果我们要编写的电路模块对寄存器的访问并不需要这么...

空空如也

空空如也

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

8位寄存器verilog代码