2时序逻辑电路移位寄存器

2.3.1 自动右移寄存器

  信号由s_in进入8位寄存器最高位,寄存器最低位由s_out输出,代码如下

View Code
 1 module free_run_shift
2 (
3 input clk,
4 input rst_n,
5 input s_in,
6 output s_out
7 );
8
9 reg [7:0] r_reg;//现态寄存器
10 wire [7:0] r_next;//次态寄存器
11
12 always @(posedge clk or negedge rst_n)//时钟上升沿将次态寄存器值赋给现态寄存器,更新数据
13 if(!rst_n)
14 r_reg<=0;
15 else r_reg<=r_next;
16
17 assign r_next={s_in,r_reg[7:1]};
18 assign s_out=r_reg[0];
19
20 endmodule

2.3.2通用移位寄存器

可以并入并出,串入并出,并入串出。ctrl=11时,次态寄存器r_next得到输入值Q。 ctrl=00时,次态值等于现态值,不变。ctrl=01时,次态值左移移位,最低位填充D[0]。ctrl=11时,次态值右移移位,最高位填充D[N]。

View Code
 1 module free_run_shift
2 #(parameter N=8)
3 (
4 input clk,
5 input rst_n,
6 input [1:0] ctrl,
7 input [N-1:0] D,
8 output [N-1:0] Q
9 );
10
11 reg [N-1:0] r_reg;
12 reg [N-1:0] r_next;
13
14 always @(posedge clk or negedge rst_n)
15 if(!rst_n)
16 r_reg<=0;
17 else r_reg<=r_next;
18
19 always @(*)
20 case(ctrl)
21 2'b00:r_next=r_reg;
22 2'b01:r_next={r_reg[N-2:0],Q[0]};
23 2'b10:r_next={Q[N-1],r_reg[N-1:1]};
24 2'b11:r_next=D;
25 default:;
26 endcase
27
28 assign Q=r_reg;
29
30 endmodule
原文地址:https://www.cnblogs.com/yuesheng/p/2125402.html