使⽤ZYNQ实现单LUT内容的动态修改(⼀)PL端OOC设计流程
⼀,摘要
⼆,系统框图
系统结构主要如上图,其中LUT的读写操作由PS端的程序控制,通过PC端的串⼝助⼿可以观察读取的配置帧数据,设置要修改的LUT位置以及修改后的LUT中的新数据。
三,PL⼯程的创建,综合,布局布线。
考虑到调试过程中可能要多次设置⽬标LUT的初始值来搞清楚bitstream中数据与LUT中数据的映射关系,为了提⾼该系统的编译调试效率,本⽂针对⽬标操作的LUT采取局部动态重构的设计⽅法。实际应⽤中不采⽤部分重构设计流程也可以对LUT进⾏动态读写。
以下是本次设计使⽤Vivado进⾏部分重构系统开发的整体流程:
1. 使⽤Vivado创建整个设计,将部分重构模块保留为空模块。综合⼯程⽣成静态设计的.dcp⽂件(如top_syn_static.dcp)。
2. 综合部分重构模块的源⽂件,⽣成对应的.dcp⽂件(如:pr_lut_syn.dcp)。
3. 打开第⼀步⽣成的top_syn_static.dcp,读⼊第⼆步⽣成的pr_lut_syn.dcp,设置重构属性,保存设计点。
4. 为重构模块指定重构区域,读⼊约束⽂件。
5. 优化,布局,布线,保存设计点。
6. ⽣成bitstream⽂件,及ila调试相关⽂件。
7. 将重构模块清除保留为⿊盒,将其他部分在布局布线后的级别上保存其设计点。
8. 打开上⼀步保存的设计点,读⼊新的重构模块,优化,布局布线,保存设计点,⽣成bitstream等。
9. 使⽤pr_verify指令对⽣成的bitstream进⾏验证。
第⼀步,创建设计。
可直接在给出的⼯程⽬录下⾯执⾏脚本⾃动创建,综合,以及硬件的导出。在⼯程⽬录下执⾏以下代码(windows下需要在Vivado的命令⾏下操作):
source ./tcl/step1_l
具体⼯程⽂件结构如下图所⽰:
其中原理图部分如下:
这⼀步我们要⽤到的⽂件为.\vivado\lut_modify.runs\synth_1\top.dcp,我们需要将此⽂件复制到.\checkpoints\synth\static\路径下,便于后续操作。
python怎么读取串口数据当然也可以⾃⼰⼿动来创建⼯程,编写相关⽂件。
第⼆步,综合重构模块
直接执⾏脚本⽂件即可,脚本代码如下:
read_verilog ./src/rms/pr_lut1/pr_lut.v
synth_design -mode out_of_context -flatten_hierarchy rebuilt -top pr_lut -part xc7z020clg400-1
write_checkpoint ./checkpoints/synth/rms/pr_lut1.dcp
close_design
close_project
以下是重构模块的verilog代码,该模块例化⼀个内部的固定位置的LUT,便于我们以后寻址更改其内部内容:
`timescale 1ns/1ps
//*******************
//DEFINE MODULE PORT
//*******************
module pr_lut(
input clk ,
input rst ,
input [5:0] din ,
output reg dout
);
//*********************
//INNER SIGNAL DECLARATION
//*********************
/
/REGS
reg [5:0] din_ff ;
//WIRES
wire dout_pre ;
//*********************
//MAIN CORE
//*********************
always @(posedge clk or posedge rst) begin
if(rst ==1'b1) begin
din_ff <= 'd0 ;
end
else begin
din_ff <= din ;
end
end
always @(posedge clk or posedge rst) begin
if(rst ==1'b1) begin
dout <= 'd0 ;
end
else begin
dout <= dout_pre ;
end
end
// 0001 0010 0011
(*DONT_TOUCH="TRUE"*)(*BEL="D6LUT",LOC="SLICE_X57Y53"*)LUT6 #( .INIT(64'h1234123412341234)// Specify LUT Contents
)LUT6_inst_D_right(
.O(dout_pre),// LUT general output
.I0(din_ff[0]),// LUT input
.I1(din_ff[1]),// LUT input
.I2(din_ff[2]),// LUT input
.I3(din_ff[3]),// LUT input
.I4(din_ff[4]),// LUT input
.I5(din_ff[5])// LUT input
);
//*********************
endmodule
该步操作主要⽣成的⽂件如下图,后⾯可⽤不同lut初始值的rm来创建完整设计,⽅便在bitstream⽂件中到⽬标lut配置数据的位置及内容。便于分析bitstream配置数据同实际LUT中数据的映射关系:
第三步,打开设计点,读⼊重构模块,划分重构区域
执⾏以下脚本
open_checkpoint ./checkpoints/synth/static/top.dcp
read_checkpoint -cell pr_lut_0 ./checkpoints/synth/rms/pr_lut1.dcp
set_property HD.RECONFIGURABLE1[get_cells pr_lut_0]
write_checkpoint ./checkpoints/synth/top_link_lut.dcp -force
#划分重构区域。
startgroup
create_pblock pblock_pr_lut_0
resize_pblock pblock_pr_lut_0 -add {SLICE_X54Y50:SLICE_X59Y59RAMB18_X3Y20:RAMB18_X3Y23RAMB36_X3Y10:RAMB36_X3Y11}
add_cells_to_pblock pblock_pr_lut_0 [get_cells [list pr_lut_0]]-clear_locs
endgroup
其中为重构模块划分重构区域⼿动操作如下图,然后在layout上⾯绘制相应的重构区域即可,注意:此例中由于指定了LUT的位置信息,所以重构区域必须覆盖到该LUT的物理区域。
此例中划分的重构区域如下:
第四步,优化,布局布线,保存设计点,⽣成.bit及.rbt⽂件。
直接执⾏以下命令:
opt_design
place_design
route_design
write_checkpoint -force ./checkpoints/implement/top_route_design.dcp
write_checkpoint -force -cell pr_lut_0 ./checkpoints/implement/pr_lut_instance_route_design.dcp
write_bitstream -raw_bitfile ./bitstreams/top1 -force
write_debug_probes -force ./bitstreams/top
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论