亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Verilog
Verilog n 位双向移位寄存器

在数字电子产品中,移位寄存器 是一个级联触发器,其中输出引脚 q 一个触发器的连接到下一个的数据输入引脚(d)。因为所有触发器都在同一个时钟上工作,所以存储在移位寄存器中的位数组将移位一位。例如,如果一个 5 位右移寄存器的初始值是 10110,并且移位寄存器的输入被绑定到 0,那么下一个模​​式将是 01011 和下一个 00101。

设计

该移位寄存器设计有五个输入和一个 n 位输出,并且该设计使用 parameter 进行参数化 MSB 表示移位寄存器的宽度。如果 n 为 4,则它成为一个 4 位移位寄存器。如果n为8,则成为8位移位寄存器。

这个移位寄存器有几个关键特性:

  module shift_reg #(parameter MSB=8) ( input d, // 声明数据输入到移位寄存器 input clk 中的第一个触发器,/ / 声明移位寄存器输入 en 中所有触发器的时钟输入,// 声明用于启用/关闭移位寄存器的输入输入 dir,// 声明输入以向左或向右方向移位输入 rstn,// 声明将寄存器重置为默认值的输入输出 reg [MSB-1:0] out); // 声明输出以读出该寄存器中所有触发器的当前值 // 这个always 块将“总是”在时钟的上升沿被触发 // 一旦进入该块,它会首先检查reset 是否被触发0 如果是,则重置寄存器 // 如果否,则检查移位寄存器是否已启用 // 如果否 => 保持先前的输出。如果是,则根据所请求的方向始终移动 @ (posedge clk) if (!rstn) out <=0;否则开始 if (en) case (dir) 0 :out <={out[MSB-2:0], d}; 1 :out <={d, out[MSB-1:1]}; endcase else out <=out;结束模块 

硬件原理图

测试平台

测试台用于验证该移位寄存器的功能。设计实例化到顶层module 并且输入由不同的值驱动。可以在输出引脚处观察每个输入的设计行为。

  模块 tb_sr;参数 MSB =16; // [可选] 声明一个参数来表示移位寄存器reg数据中的位数; // 声明一个变量来驱动设计 reg clk 的 d-input; // 声明一个变量来驱动时钟到设计 reg en; // 声明一个变量来驱动使能到设计注册目录; // 声明一个变量来驱动换档寄存器的方向 reg rstn; // 声明一个变量来驱动复位到设计线 [MSB-1:0] 输出; // 声明一条线以从设计中捕获输出 // 通过传递 MSB 实例化设计(16 位移位寄存器)并与 TB 信号 shift_reg #(MSB) sr0 ( .d (data), .clk (clk), . en (en), .dir (dir), .rstn (rstn), .out (out)); // 生成时钟时间周期 =20ns, freq => 50MHz 总是 #10 clk =~clk; // 将变量初始化为时间 0 时的默认值 initial begin clk <=0; en <=0;目录 <=0; rstn <=0;数据 <='h1; end // 驱动设计的主要激励以验证这是否有效 初始开始 // 1. 在一段时间后应用复位和解除复位 rstn <=0; #20 rstn <=1; en <=1; // 2. 对于 7 个时钟,驱动交替值到数据引脚重复 (7) @ (posedge clk) data <=~data; // 4. 移位方向并将交替值驱动到数据引脚另外 7 个时钟 #10 dir <=1;重复(7)@(posedge clk)数据<=~数据; // 5.接下来的7个时钟不驱动任何东西,允许移位寄存器根据dir重复(7)@(posedge clk)简单地移位; // 6. 完成模拟 $finish; end // 监控这些变量的值并将它们打印到日志文件中用于调试初始 $monitor ("rstn=%0b data=%b, en=%0b, dir=%0b, out=%b", rstn, data, en, dir, out);endmodule  

移位寄存器启用的时间在下面给出的日志中以绿色突出显示。它改变方向的时间以黄色突出显示。数据输入引脚保持不变的时间以蓝色突出显示。

仿真日志
ncsim> runrstn=0 data=1, en=0, dir=0, out=xxxxxxxxxxxxxxxxxrstn=0 data=1, en=0, dir=0, out=0000000000000000rstn=1 data =1, en=1, dir=0, out=0000000000000000rstn=1 data=0, en=1, dir=0, out=0000000000000001rstn=1 data=1, en=1, dir=0, out=00000000100rstn数据=0, en=1, dir=0, out=0000000000000101rstn=1 data=1, en=1, dir=0, out=0000000000001010rstn=1 data=0, en=1, dir=0, out=0000000001rstn 1 data=1, en=1, dir=0, out=0000000000101010rstn=1 data=0, en=1, dir=0, out=0000000001010101rstn=1 data=0, en=1, dir=1, out=000001000000 =1 data=1, en=1, dir=1, out=0000000000101010rstn=1 data=0, en=1, dir=1, out=1000000000010101rstn=1 data=1, en=1, dir=1, out=0100000000001010rstn=1 data=0, en=1, dir=1, out=1010000000000101rstn=1 data=1, en=1, dir=1, out=0101000000000010rstn, en=1, out=0 =1010100000000001rstn=1 数据=1, en=1, dir=1, out=0101010000000000rstn=1 data=1, en=1, dir=1, out=1010101000000000rstn=1, 数据=1出=110101010 0000000rstn=1 data=1, en=1, dir=1, out=1110101010000000rstn=1 data=1, en=1, dir=1, out=1111010101000000rstn=1 data=1, en,1, out=1 =1111101010100000rstn=1 data=1, en=1, dir=1, out=1111110101010000仿真通过 $finish(1) 在 430 NS + 0 时间完成

Verilog

  1. Verilog 内部和内部分配延迟
  2. Verilog 控制块
  3. Verilog 初始块
  4. Verilog 用户定义的原语
  5. 4 位计数器
  6. Verilog `ifdef 条件编译