2026/1/9 19:31:59
网站建设
项目流程
云南网站制作,云服务器怎么用,给你网站你会怎么做的,十大it教育培训机构排名目录
1.软件版本
2.像素排序模块原理
3.像素排序模块Verilog实现
3.1 像素排序模块FPGA实现思路
3.2 verilog程序实现
4.像素排序模块的仿真测试 欢迎订阅FPGA/MATLAB/Simulink系列教程 《★教程1:matlab入门100例》 《★教程2:fpga入门100例》 《★教程3:simulink入门60…目录1.软件版本2.像素排序模块原理3.像素排序模块Verilog实现3.1 像素排序模块FPGA实现思路3.2 verilog程序实现4.像素排序模块的仿真测试欢迎订阅FPGA/MATLAB/Simulink系列教程《★教程1:matlab入门100例》《★教程2:fpga入门100例》《★教程3:simulink入门60例》《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》《★专题3:人工智能基础应用研究》1.软件版本vivado2022.22.像素排序模块原理我们以3*3窗口为例首先需要提取图像中3*3窗口的像素值在FPGA中获得图像3.*3的像素矩阵。对于相邻的两个像素只要通过延迟模块进行延迟就可以在一个时间得到3个像素而对于不同行之间的像素值则需要延迟256个周期来得到其实现结构如下通过这个结构可以同时获得三行三列中的九个像素值。 此时我们就获得了九个像素值然后将这九个像素值进行排序最后提取中间值作为输出如下示意图所示3.像素排序模块Verilog实现3.1 像素排序模块FPGA实现思路我们根据上面介绍的排序原理将FPGA的中值滤波器的实现过程通过如下的流程来实现首先假设提取的3×3窗口矩阵p11p12p13p21p22p23p31p32p33然后进行多级排序第一级排序对3×3窗口的每一行像素分别排序输出每行的最大值、中值、最小值对p11p12p13第一行排序输出p1_max/p1_mid/p1_min对p21p22p23第二行排序输出p2_max/p2_mid/p2_min对p31p32p33第三行排序输出p3_max/p3_mid/p3_min第二级排序对3个最大值p1_max/p2_max/p3_max排序提取最小值p123_min对3个中值p1_mid/p2_mid/p3_mid排序仅提取中值p123_mid对3个最小值p1_min/p2_min/p3_min排序仅提取最大值p123_max第三级排序对3个中值p123_min/p123_mid/p123_max排序仅提取中值Pmid3.2 verilog程序实现这里我们首先对上述模块各个子排序模块进行实现其程序如下timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2025/12/15 20:15:53 // Design Name: // Module Name: Fmed0 // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module Fmed0( input i_clk,// 时钟 input i_rst, // 复位 input [7:0] i_pix1, i_pix2, i_pix3, // 三个像素 i_pix1、i_pix2 和 i_pix3 output reg [7:0] o_pixmax, o_pixmid, o_pixmin// 输出o_pixmax、o_pixmid 和 o_pixmin ); always (posedge i_clk, posedge i_rst) begin if(i_rst) begin o_pixmax 0; o_pixmid 0; o_pixmin 0; end else begin // 最大值 if(i_pix1 i_pix2 i_pix1 i_pix3) o_pixmax i_pix1; else if(i_pix2 i_pix1 i_pix2 i_pix3) o_pixmax i_pix2; else o_pixmax i_pix3; // 中间值 if((i_pix1 i_pix2 i_pix1 i_pix3) || (i_pix1 i_pix3 i_pix1 i_pix2)) o_pixmid i_pix1; else if((i_pix2 i_pix1 i_pix2 i_pix3) || (i_pix2 i_pix3 i_pix2 i_pix1)) o_pixmid i_pix2; else o_pixmid i_pix3; //最小值 if(i_pix1 i_pix2 i_pix1 i_pix3) o_pixmin i_pix1; else if(i_pix2 i_pix1 i_pix2 i_pix3) o_pixmin i_pix2; else o_pixmin i_pix3; end end endmodule4.像素排序模块的仿真测试我们编写如下的testbench文件timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2025/12/15 20:23:11 // Design Name: // Module Name: test_Fmed0 // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module test_Fmed0(); reg i_clk; reg i_rst; reg [7:0] x1,x2,x3; wire [7:0] o_pixmax; wire [7:0] o_pixmid; wire [7:0] o_pixmin; Fmed0 Fmed0_u( .i_clk (i_clk), .i_rst (i_rst), .i_pix1 (x1), .i_pix2 (x2), .i_pix3 (x3), .o_pixmax (o_pixmax), .o_pixmid (o_pixmid), .o_pixmin (o_pixmin) ); initial begin i_clk1; i_rst1; x10; x20; x30; #1000; i_rst0; x1127; x264; x3231; #100 x10; x20; x30; end always #5 i_clk~i_clk; endmodule仿真结果如下图所示从测试结果看最大值输出为231中间值输出为127最小值为64。