寄存器Verilog

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

 

            

             

    

 

        

        

             

     

### Verilog寄存器的使用方法及示例 #### 定义模块接口 在Verilog中定义一个简单的8位寄存器模块,该模块具有时钟输入`clk`、复位信号`rst`、数据输入端口`din`、写使能信号`wr`以及数据输出端口`dout`。 ```verilog module reg ( input clk, input rst, input [7:0] din, input wr, output [7:0] dout ); ``` 此部分声明了模块名称及其I/O端口列表[^1]。 #### 声明内部变量 为了存储数据,在模块内声明了一个名为`regfile`的8位宽寄存器型态变量来保存当前状态的数据值。 ```verilog reg [7:0] regfile; ``` 这段代码创建了一个宽度为8比特的寄存器用于后续逻辑操作中的临时储存。 #### 编写组合与时序逻辑 通过`always`块指定当检测到上升沿触发事件发生于时钟线路上(`@(posedge clk)`), 并依据条件判断执行相应的动作: - 如果接收到高电平复位脉冲,则将寄存器清零; - 否则如果写入控制信号有效,则更新寄存器内容至新的输入数值。 ```verilog always @(posedge clk) if (rst) regfile <= 0; else if (wr) regfile <= din; ``` 上述片段实现了基于边沿敏感特性的同步加载机制,确保每次仅在一个特定时刻完成一次完整的读/修改周期。 #### 连续赋值语句 最后利用`assign`关键字把寄存器里的最新值持续不断地赋予给外部可见的输出端子上。 ```verilog assign dout = regfile; ``` 这一步骤建立了从内部寄存器到外界观察点之间的连接路径,使得其他组件能够获到最新的寄存器状态信息。 整个寄存器的设计遵循了并行处理的原则,即所有的过程块(如这里的`always`)、连续赋值语句都在同一时间级别上并发运行[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值