控制信号与数据同步的实现 有时候,我们进行图像处理时,图像数据完成被处理,通常需要花费很多时钟的,而控制信号是应当与时钟信号在时序上(在时间轴上)对齐的,因此我们需要对控制信号进行相应的时钟数的延迟。 对控制信号的延迟可以使用两种方式:一是寄存器来实现延迟;二是通过shiftRAM来实现延迟。 一般来说为了代码的简洁,我们使用寄存器来实现延迟更方便,下面我们就通过寄存器来延迟数个时钟数来与被处理的像素数据时序对齐。 首先我们需要申明需要延迟位数的寄存器reg类型的变量,然后通过时钟节拍来实现控制信号的延迟。 //Mean_filter control signals to delay two clk reg[1:0] matrix_frame_vsync_r; reg[1:0] matrix_frame_href_r; reg[1:0] matrix_frame_clken_r; always@(posedgeclk ) begin matrix_frame_vsync_r[1:0] <={matrix_frame_vsync_r[0], matrix_frame_vsync}; matrix_frame_href_r[1:0] <={matrix_frame_href_r[0], matrix_frame_href}; matrix_frame_clken_r[1:0] <={matrix_frame_clken_r[0], matrix_frame_clken}; end assign video_vblank = matrix_frame_vsync_r[1]; assign video_hblank = matrix_frame_href_r[1];
assign video_de = matrix_frame_clken_r[1];
代码的灵活控制 我们设置好SystemGenerator模块的参数,并搭建好了相应算法模块模型,然后通过点击SystemGenerator模块参数里的 Generate来生成相应的配置好的算法代码,其实这个时候生成的代码不可以直接使用,必须通过用户添加控制信号来实现灵活实现算法。 我们以两个例子为例:图像二值化和中值滤波来举例。
二值化的名字我们命名为BinImage,然后我们新建BiImage文件夹,然后搭建我们的模块
搭建后的模块如下:
我们将编写好的FromWorkspace里调用的函数LoadImage_coinsgray和To Workspace里调用的函数 ShowImage_coinsgray,还有在当前目录里存放我们的硬币图片,经过设置,新建netlist文件存放我们编译和仿真的文件,下面就是我们的相关文件。
经过运行与编译,我们打开netlist文件夹来查看我们的编译好的文件,下面就是netlist文件夹里的文件:
其中sysgen文件夹里包含我们编译以后的所有HDL相关文件,images文件夹包含我们模型的相关图片。下面就是sysgen文件夹里的文件: hdl_netlist文件夹里包含下面文件,SystemGenerator给我们建好了Vivado工程,可以直接打开,便是我们搭建的模块编译后的文件。
我们sysgen文件夹里的文件可以给我们提供源代码,可以提供给我们新建工程使用;hdl_netlist文件夹里的工程也可以给我们来查看使用。通常我们使用前者,利用源代码来给予我们提供算法的编写,因为一般我们搭建的模块只是提供一部分算法的实现,这样可以使用这些源代码进行方便移植使用,而hdl_netlist文件夹里的工程只是方便我们查看,而无法直接使用。
在sysgen文件夹里跟我们搭建的模型的同名.v文件(biimage.v)是我们需要查看的,其余文件都是被该文件例化与调用的,不需要我们查看:
我们打开biimage文件,寻找到我们的同名module模块,下面是我们biimage文件需要修改的地方: //Generated from Simulink block "BiImage" (* core_generation_info ="biimage,sysgen_core_2015_2,{compilation=HDLNetlist,block_icon_display=Default,family=zynq,part=xc7z020,speed=-1,package=clg484,synthesis_tool=Vivado,synthesis_language=verilog,hdl_library=work,proj_type=Vivado,synth_file=VivadoSynthesis Defaults,impl_file=Vivado ImplementationDefaults,clock_loc=,clock_wrapper=ClockEnables,directory=./netlist,testbench=1,create_interface_document=1,ce_clr=0,base_system_period_hardware=10,dcm_input_clock_period=10,base_system_period_simulink=1,sim_time=73801,sim_status=1,}"*) modulebiimage ( clk, gateway_in, gateway_out ); input clk; input [7:0] gateway_in; output [7:0] gateway_out; wire clk_net; wire [7:0] gateway_in_net; wire [7:0] gateway_out_net; assign clk_net = clk; assign gateway_in_net = gateway_in; assign gateway_out = gateway_out_net; biimage_struct biimage_struct ( .gateway_in(gateway_in_net), .gateway_out(gateway_out_net) ); default_clock_driver_biimagedefault_clock_driver_biimage ( .sysclk(clk_net), .sysce(1'b1), // 系统的使能控制 .sysce_clr(1'b0) ); endmodule 从这里可以看出,我们的模块的对外接口存在时钟、输入信号和输出信号接口,为了使算法按照我们的意愿来运行,我们找到算法运行的使能控制信号sysce,我们可将自己的使能信号例化到default_clock_driver_biimage这个模块上,然后进行控制算法运行,这样我们就可以控制我们的算法流程了
|