xilinx verilog语法技巧
- 2019 年 10 月 29 日
- 笔记
xilinx verilog语法技巧 一
硬件描述语言(HDL)编码技术让您: •描述数字逻辑电路中最常见的功能。 •充分利用Xilinx®器件的架构特性。
1 Flip-Flops and Registers :
Vivado综合根据HDL代码的编写方式推断出四种类型的寄存器原语: •FDCE:具有时钟使能和异步清除的D触发器 •FDPE:具有时钟使能和异步预设的D触发器 •FDSE:具有时钟使能和同步设置的D触发器 •FDRE:具有时钟使能和同步复位的D触发器 Register with Rising-Edge Coding Example (Verilog)
// 8-bit Register with // Rising-edge Clock // Active-high Synchronous Clear // Active-high Clock Enable // File: registers_1.v module registers_1(d_in,ce,clk,clr,dout); input [7:0] d_in; input ce; input clk; input clr; output [7:0] dout; reg [7:0] d_reg; always @ (posedge clk) begin if(clr) d_reg <= 8'b0; else if(ce) d_reg <= d_in; end assign dout = d_reg; endmodule
2 Latches
// Latch with Positive Gate and Asynchronous Reset // File: latches.v module latches ( input G, input D, input CLR, output reg Q ); always @ * begin if(CLR) Q = 0; else if(G) Q = D; end endmodule
3 Shift Registers
移位寄存器是一系列触发器,允许跨固定(静态)数量的延迟级传播数据。 相反,在动态移位寄存器中,传播链的长度在电路操作期间动态变化。 Vivado综合在SRL类资源上实现了推断的移位寄存器,例如: •SRL16E •SRLC32E 8-Bit Shift Register Coding Example One (Verilog)
// 8-bit Shift Register // Rising edge clock // Active high clock enable // Concatenation-based template // File: shift_registers_0.v module shift_registers_0 (clk, clken, SI, SO); parameter WIDTH = 32; input clk, clken, SI; output SO; reg [WIDTH-1:0] shreg; always @(posedge clk) begin if (clken) shreg <= {shreg[WIDTH-2:0], SI}; end assign SO = shreg[WIDTH-1]; endmodule
32-Bit Shift Register Coding Example Two (Verilog)
// 32-bit Shift Register // Rising edge clock // Active high clock enable // For-loop based template // File: shift_registers_1.v module shift_registers_1 (clk, clken, SI, SO); parameter WIDTH = 32; input clk, clken, SI; output SO; reg [WIDTH-1:0] shreg; integer i; always @(posedge clk) begin if (clken) begin for (i = 0; i < WIDTH-1; i = i+1) shreg[i+1] <= shreg[i]; shreg[0] <= SI; end end assign SO = shreg[WIDTH-1]; endmodule
Dynamic Shift Registers 动态移位寄存器是移位寄存器,其长度可在电路操作期间动态变化。 动态移位寄存器可以看作: •一系列触发器,它们在电路工作期间可以接受的最大长度。 •多路复用器,在给定的时钟周期内选择从传播链中提取数据的阶段。
32-Bit Dynamic Shift Registers Coding Example (Verilog)
// 32-bit dynamic shift register. // Download: // File: dynamic_shift_registers_1.v module dynamic_shift_register_1 (CLK, CE, SEL, SI, DO); parameter SELWIDTH = 5; input CLK, CE, SI; input [SELWIDTH-1:0] SEL; output DO; localparam DATAWIDTH = 2**SELWIDTH; reg [DATAWIDTH-1:0] data; assign DO = data[SEL]; always @(posedge CLK) begin if (CE == 1'b1) data <= {data[DATAWIDTH-2:0], SI}; end endmodule