多周期移位寄存器

示例阶段:

一.代码:

串入并出移位寄存器:

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_R5位赋给下一时刻shift_R的高五位)

     shift_R[0]  <= IN;(将输入in赋给下个时刻shift_R的最低位)

    end

    else begin // 使能无效保持不动

     shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];

    end

end // always

endmodule

时间基准计数器等见前几篇。

 

二:放置元件,指定管脚。BDF图如下:

多周期移位寄存器_第1张图片

三.对串入并出移位寄存器进行分析:

编译后,选择Tools/Netllist Viewers/RTL viewer

多周期移位寄存器_第2张图片

选中元件后,右键Ungroup Selected Node:

多周期移位寄存器_第3张图片

四.下载执行

现象:拨开第一个开关,LED1~6从序号低到高依次亮起;再关掉开关,从左往右依次熄灭。

 

学生实验:

多周期移位寄存器_第4张图片

修改代码:

module shift_reg_SIPO(

  RST  ,   // 异步复位,高有效

  CLK  ,   // 时钟,上升沿有效

  EN   ,   // 输入数据串行移位使能

  IN    ,  // 输入串行数据

  DERICT,   // 确定移位方向

  OUT  );  // 并行输出数据

parameter SHLEN = 6;

input RST, CLK, EN, DERICT;

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(DERICT) 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    (注意缩进,缩进相同为同一层次)

    elsebegin// 使能无效保持不动

      shift_R[SHLEN-1:0] <=shift_R[SHLEN-1:0];

    end

end //end always

endmodule

 

现象:

修改代码后将SW1(开关2)连在DERICT口上,SW1高电平时,灯从序号高到低依次移位;低电平相反。

你可能感兴趣的:(原创)