【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用

    • 1、设计定义
    • 2、设计输入
      • 2.1 数码管译码显示
      • 2.2 74HC595驱动
      • 2.3 主模块设计
    • 3、分析和综合
    • 4、功能仿真
      • 6.1 hex8模块仿真
      • 6.2 HC595模块
    • 5、布局布线
    • 6、时序仿真
    • 7、IO分配以及配置文件(bit流文件)的生成
    • 8、配置(烧录)FPGA
    • 9、在线调试

1、设计定义

通过74HC595芯片点亮8位数码管,通过计时器实现数码管计时显示
在这里插入图片描述

软件开发环境高云V1.99版本
硬件开发环境采用小梅哥ACG525(主芯片GW5A-LV25-UG324C2)
在这里插入图片描述

2、设计输入

本章节内容分为分两个子模块和一个主模块,一个子模块负责驱动74hc595一个子模块负责数码管显示,主模块负责计时和调用子模块进行数码管显示。

2.1 数码管译码显示

首先我们设计数码管显示子模块,数码管有两种结构:共阴极与共阳极。 这两者的区别在于,公共端是连接到地还是高电平,对于共阴数码管需要给对应段以高电平才会使其点亮, 而对于共阳极数码管则需要给低电平才会点亮。 本次实验环境上是使用的共阳数码管,同时为了显示数字或字符,必须对数字或字符进行编码译码。这里的表格dp点默认全部显示,当我们需要显示dp点的时候与上8’b01111111即可,相应的关闭显示就或上8’b10000000;
在这里插入图片描述
数码管的显示方式也分为两种静态显示和动态显示,静态显示的特点是每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法由于每一个数码管均需要独立的数据线因此硬件电路比较复杂,成本较高,很少使用为了节约 IO 以及成本一般采用如下图所示的电路结构,这样 3 个数码管接在一起就比静态的少了 7*2 个 I/O。
在这里插入图片描述
这样就实现了另一种显示模式,动态显示。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示,板载设计的电路为动态显示电路,下面开始设计数码管显示代码;
在这里插入图片描述

位选控制也就是我们上面说到的轮流选择8位数码管的位信号线(sel);

/*********************位选扫描时钟**********************/
reg clk_1k; // 1k时钟
reg [14:0]clk_count; // 系统时钟计数
reg [7:0]sel_reg;//数码管位选寄存器,通过信号传送给seg_sel// 系统clk采用50mhz进行计算
always@(posedge clk or posedge reset)
beginif(reset)clk_count <= 15'd0;else if(!en)clk_count <= 15'd0;else if(clk_count == 24999)clk_count <= 15'd0;elseclk_count <= clk_count + 1'b1;
endalways@(posedge clk or posedge reset) 
beginif(reset)clk_1k <= 1'b0;else if(clk_count == 24999)clk_1k <= ~clk_1k;elseclk_1k <= clk_1k;
endalways@(posedge clk_1k or posedge reset)
beginif(reset)sel_reg <= 8'b0000_0001;else if(sel_reg == 8'b1000_0000)sel_reg <= 8'b0000_0001;else sel_reg <= sel_reg << 1;
endassign sel = (en)?sel_reg:8'b0000_0000;

段选信号,通过上面的译码表实现查表传送给seg端口,这里的dp点显示我以位判断的方式进行显示,哪一位需要显示dp点给dp寄存器哪一位或1即可

/***********************段选数据***********************/
reg [3:0]data_tmp;//数据缓存
always@(*)
begincase(sel_reg)8'b0000_0001:data_tmp = disp_data[3:0];8'b0000_0010:data_tmp = disp_data[7:4];8'b0000_0100:data_tmp = disp_data[11:8];8'b0000_1000:data_tmp = disp_data[15:12];8'b0001_0000:data_tmp = disp_data[19:16];8'b0010_0000:data_tmp = disp_data[23:20];8'b0100_0000:data_tmp = disp_data[27:24];8'b1000_0000:data_tmp = disp_data[31:28];default:data_tmp = 4'b0000;endcase
endalways@(*)
begincase(data_tmp)4'h0:seg = 8'b11000000;4'h1:seg = 8'b11111001;4'h2:seg = 8'b10100100;4'h3:seg = 8'b10110000;4'h4:seg = 8'b10011001;4'h5:seg = 8'b10010010;4'h6:seg = 8'b10000010;4'h7:seg = 8'b11111000;4'h8:seg = 8'b10000000;4'h9:seg = 8'b10010000;4'ha:seg = 8'b10001000;4'hb:seg = 8'b10000011;4'hc:seg = 8'b11000110;4'hd:seg = 8'b10100001;4'he:seg = 8'b10000110;4'hf:seg = 8'b10001110;endcaseif((sel_reg&dp) > 0)seg = seg & 8'b01111111;
end

完整代码

module hex8(input clk,input reset_n,input en,input [31:0]disp_data, //显示数据input [7:0]dp,output [7:0]sel,//数码管段选(当前要显示的内容)output reg [7:0]seg //数码管位选(选择当前要显示的数码管) 
);assign reset=~reset_n;/*********************位选扫描时钟**********************/
reg clk_1k; // 1k时钟
reg [14:0]clk_count; // 系统时钟计数
reg [7:0]sel_reg;//数码管位选寄存器,通过信号传送给seg_selalways@(posedge clk or posedge reset)
beginif(reset)clk_count <= 15'd0;else if(!en)clk_count <= 15'd0;else if(clk_count == 24999)clk_count <= 15'd0;elseclk_count <= clk_count + 1'b1;
endalways@(posedge clk or posedge reset) 
beginif(reset)clk_1k <= 1'b0;else if(clk_count == 24999)clk_1k <= ~clk_1k;elseclk_1k <= clk_1k;
endalways@(posedge clk_1k or posedge reset)
beginif(reset)sel_reg <= 8'b0000_0001;else if(sel_reg == 8'b1000_0000)sel_reg <= 8'b0000_0001;else sel_reg <= sel_reg << 1;
endassign sel = (en)?sel_reg:8'b0000_0000;/***********************段选数据***********************/
reg [3:0]data_tmp;//数据缓存
always@(*)
begincase(sel_reg)8'b0000_0001:data_tmp = disp_data[3:0];8'b0000_0010:data_tmp = disp_data[7:4];8'b0000_0100:data_tmp = disp_data[11:8];8'b0000_1000:data_tmp = disp_data[15:12];8'b0001_0000:data_tmp = disp_data[19:16];8'b0010_0000:data_tmp = disp_data[23:20];8'b0100_0000:data_tmp = disp_data[27:24];8'b1000_0000:data_tmp = disp_data[31:28];default:data_tmp = 4'b0000;endcase
endalways@(*)
begincase(data_tmp)4'h0:seg = 8'b11000000;4'h1:seg = 8'b11111001;4'h2:seg = 8'b10100100;4'h3:seg = 8'b10110000;4'h4:seg = 8'b10011001;4'h5:seg = 8'b10010010;4'h6:seg = 8'b10000010;4'h7:seg = 8'b11111000;4'h8:seg = 8'b10000000;4'h9:seg = 8'b10010000;4'ha:seg = 8'b10001000;4'hb:seg = 8'b10000011;4'hc:seg = 8'b11000110;4'hd:seg = 8'b10100001;4'he:seg = 8'b10000110;4'hf:seg = 8'b10001110;endcaseif((sel_reg&dp) > 0)seg = seg & 8'b01111111;
endendmodule

模块使用

wire [31:0]disp_data;
wire [7:0] sel;//数码管位选(选择当前要显示的数码管)
wire [7:0] seg;//数码管段选(当前要显示的内容)
wire [7:0]dp_data;//数码管小数点(某位点亮某位置1)
reg dp_flag;  // 小数点寄存器
reg [31:0]disp_data_reg = 32'h00000000; // 显示数据寄存器hex8 hex8_mod(.clk(clk), // 50m时钟.reset_n(reset_n), // 复位信号.en(1'b1),  // 使能模块寄存器.disp_data(disp_data), // 32位数据显示,每一个数码管可以显示0-f占4位.sel(sel), // 位选信号.seg(seg), // 段选信号.dp(dp_data) // 8位dp信号
);

2.2 74HC595驱动

为了节省IO引脚开发板数码管设计采用了74HC595来扩展IO,该芯片的作用是位移位寄存器,FPGA 只需要输出 3 个管脚,即可达到发
送数码管数据的目的,与传统段选、位选方式相比,大大节省了 IO 设计资源,在该原理图下,将第一片74HC595的Q7‘串行输出端接到第二片的数据输入端Ds,实现级联功能。经过14个时钟SHcp上升沿后,数据已经全部移位进入移位寄存器,一次共输入14位数据,那么第一位输入的串行数据会在第二片74HC595芯片的Q5输出,此时给一个上升沿的STcp信号就可以将信号移入存储寄存器,OE信号持续给低, 即可输出。这里贴一个博主做的很好理解的gif图。
请添加图片描述
设计代码如下

module hc595(input clk,input reset_n,input [15:0]data,input s_en,output reg sh_cp,output reg st_cp,output reg ds
);assign reset=~reset_n;/*******************时钟模块*********************************/
parameter CNT_MAX = 2;
reg [15:0]r_data; //数据寄存器
reg [7:0]clk_count;//分频计数器;
always@(posedge clk)
beginif(s_en)r_data <= data;
endalways@(posedge clk or posedge reset)
beginif(reset)clk_count <= 0;else if(clk_count == CNT_MAX - 1'b1)clk_count <= 0;elseclk_count <= clk_count + 1'b1;
end    wire sck_plus;
assign sck_plus = (clk_count == CNT_MAX - 1'b1);//对 sck_pluse进行计数, 用于查找表实现数据的串行输入以及移位时钟 sh_cp与存储时钟 st_cp 的产生
reg [5:0]SHCP_EDGE_CNT;
always@(posedge clk or posedge reset)
beginif(reset)SHCP_EDGE_CNT <= 0;else if(sck_plus)beginif(SHCP_EDGE_CNT == 6'd32)SHCP_EDGE_CNT <= 0;elseSHCP_EDGE_CNT <= SHCP_EDGE_CNT + 1'b1;endelseSHCP_EDGE_CNT <= SHCP_EDGE_CNT;
end// 查找表实现状态输出
always@(posedge clk or posedge reset)
beginif(reset)beginst_cp <= 1'b0;ds <= 1'b0;sh_cp <= 1'd0;end else begincase(SHCP_EDGE_CNT)0: begin sh_cp <= 0; st_cp <= 1'd0;ds <= r_data[15];end1: begin sh_cp <= 1; st_cp <= 1'd0;end2: begin sh_cp <= 0; ds <= r_data[14];end3: begin sh_cp <= 1; end4: begin sh_cp <= 0; ds <= r_data[13];end	5: begin sh_cp <= 1; end6: begin sh_cp <= 0; ds <= r_data[12];end	7: begin sh_cp <= 1; end8: begin sh_cp <= 0; ds <= r_data[11];end	9: begin sh_cp <= 1; end10: begin sh_cp <= 0; ds <= r_data[10];end	11: begin sh_cp <= 1; end12: begin sh_cp <= 0; ds <= r_data[9];end	13: begin sh_cp <= 1; end14: begin sh_cp <= 0; ds <= r_data[8];end	15: begin sh_cp <= 1; end16: begin sh_cp <= 0; ds <= r_data[7];end	17: begin sh_cp <= 1; end18: begin sh_cp <= 0; ds <= r_data[6];end	19: begin sh_cp <= 1; end20: begin sh_cp <= 0; ds <= r_data[5];end	21: begin sh_cp <= 1; end22: begin sh_cp <= 0; ds <= r_data[4];end	23: begin sh_cp <= 1; end24: begin sh_cp <= 0; ds <= r_data[3];end	25: begin sh_cp <= 1; end26: begin sh_cp <= 0; ds <= r_data[2];end	27: begin sh_cp <= 1; end28: begin sh_cp <= 0; ds <= r_data[1];end			29: begin sh_cp <= 1; end30: begin sh_cp <= 0; ds <= r_data[0];end31: begin sh_cp <= 1; end32: st_cp <= 1'd1;default:		beginst_cp <= 1'b0;ds <= 1'b0;sh_cp <= 1'd0;endendcaseend
endendmodule

在这里插入图片描述

2.3 主模块设计

完成了数码管驱动的显示,要实现计时的功能我们需要在主模块中设计一个1秒定时器来实现计数,然后在调用我们写好的模块将计数值传入到数码管中进行显示,为了更简单的理解这里没有添加更多的功能,但接口都是比较完整的可以自行DIY优化设计属于自己的数值钟,这里开拓一些功能(按键调整时间,设置定时器闹钟,轮流显示日期温度和时间,网络对时,掉点保存等等),好下面开始设计我们的简单计时代码;

module seg_top(input clk, // system 50minput reset_n,output sh_cp,output st_cp,output ds
);parameter MCNT = 49_999_999; // 一秒计数器 wire [31:0]disp_data;
wire [7:0] sel;//数码管位选(选择当前要显示的数码管)
wire [7:0] seg;//数码管段选(当前要显示的内容)
wire [7:0]dp_data;//数码管小数点(某位点亮某位置1)reg dp_flag;  // 小数点寄存器
reg [31:0]disp_data_reg = 32'h00000000; // 显示数据寄存器
reg [25:0]cnt; //定义计数器寄存器reg[3:0] hour_reg_h;
reg[3:0] hour_reg_l;
reg[3:0] min_reg_h;
reg[3:0] min_reg_l;
reg[3:0] sec_reg_h;
reg[3:0] sec_reg_l;//assign disp_data = disp_data_reg;
assign disp_data = {4'h2,4'h4,hour_reg_h,hour_reg_l,min_reg_h,min_reg_l,sec_reg_h,sec_reg_l};
assign dp_data = (dp_flag) ? 8'b0101_0100 : 8'b0101_0000;hc595 hc595_mod(.clk(clk),.reset_n(reset_n),.data({seg,sel}),.s_en(1'b1),.sh_cp(sh_cp),.st_cp(st_cp),.ds(ds)
);hex8 hex8_mod(.clk(clk),.reset_n(reset_n),.en(1'b1), .disp_data(disp_data),.sel(sel),.seg(seg),.dp(dp_data)
);assign reset=~reset_n;
//计数器计数进程
always@(posedge clk or posedge reset)
beginif(reset)cnt <= 25'd0;else if(cnt == MCNT)cnt <= 25'd0;elsecnt <= cnt + 1'b1;
end//时钟 输出控制进程
always@(posedge clk or posedge reset)
beginif(reset)begindp_flag <= 1'b1;disp_data_reg = 0;endelse if(cnt == 24_999_999) // 0.5反转一次dp点dp_flag <= ~dp_flag;else if(cnt == MCNT) // 一秒计时begindp_flag <= ~dp_flag;disp_data_reg = disp_data_reg+1;sec_reg_l = sec_reg_l+1;if(sec_reg_l == 4'd9)beginsec_reg_l <= 0;sec_reg_h <= sec_reg_h + 1;if(sec_reg_h == 4'd5)beginsec_reg_h <= 0;min_reg_l <= min_reg_l + 1;if(min_reg_l == 4'd9)beginmin_reg_l <= 0;min_reg_h <= min_reg_h + 1;if(min_reg_h == 4'd5)beginmin_reg_h <= 0;hour_reg_l <= hour_reg_l + 1;if((hour_reg_h==4'd2) && (hour_reg_l==4'd3))beginhour_reg_l <=0;hour_reg_h <=0;endif(hour_reg_l == 4'd9)beginhour_reg_l <= 0;hour_reg_h <= hour_reg_h + 1;endendendendendendelsedp_flag <= dp_flag;
endendmodule

3、分析和综合

当逻辑输入设计完成后需要对其进行验证,该部分由软件部分进行验证,如果逻辑输入有问题需要检查语法错误或则重新设计设计输入
在这里插入图片描述

4、功能仿真

当分析和综合通过后应该进行功能性验证,针对项目设计定义的功能使用设计的逻辑输入验证其功能能否实现,一般的做法都是通过功能仿真的方式进行验证,比如软件逻辑分析仪,modelsim、vivado等软件自带的仿真工具进行仿真验证

功能仿真也称为行为仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。也可以叫做RTL仿真(test bench)

6.1 hex8模块仿真

在这里插入图片描述

`timescale 1ns/1ns`define clk_period 20module hex8_tb;reg clk;	//50M
reg reset_n;
reg en;	//数码管显示使能,1使能_0关闭reg [31:0]disp_data;wire [7:0] sel;//数码管位选(选择当前要显示的数码管)
wire [6:0] seg;//数码管段选(当前要显示的内容)hex8 hex8(.clk(clk),.reset_n(reset_n),.en(en),.disp_data(disp_data),.sel(sel),.seg(seg)
);initial clk = 1;
always#(`clk_period/2) clk = ~clk;initial beginreset_n = 1'b0;en = 1;disp_data = 32'h12345678;#(`clk_period*20);reset_n = 1;#(`clk_period*20);#20000000;disp_data = 32'h87654321;#20000000;disp_data = 32'h89abcdef;#20000000;$stop;
endendmodule

6.2 HC595模块

在这里插入图片描述

`timescale 1ns/1ns`define clk_period 20
module hc595_tb;reg clk;
reg reset_n;
reg [15 : 0] data;	//data to send
reg s_en;	//send en
wire sh_cp;	//shift clock
wire st_cp;	//latch data clock
wire ds;	//shift serial datahc595 hc595_mod(.clk(clk),.reset_n(reset_n),.data(data),.s_en(s_en),.sh_cp(sh_cp),.st_cp(st_cp),.ds(ds)
);
initial clk = 1;
always#(`clk_period/2) clk = ~clk;initial beginreset_n = 1'b0;s_en = 1;data = 16'b1010_1111_0110_0101;#(`clk_period*20);reset_n = 1;#(`clk_period*20);#5000;data = 16'b0101_0101_1010_0101;#5000;$stop;
end
endmodule 

5、布局布线

当我们的IO可以开始分配了我们首先需要分配IO,如果当前还没到IO分配的时候我们可以将IO分配放在最后,当IO分配完成后我们就可以通过软件进行布局布线,在芯片内部生成芯片电路

在这里插入图片描述

6、时序仿真

时序仿真也称为布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,能较好地反映芯片的实际工作情况,当时序仿真不通过的时候可能还会设计到时序约束的一个过程(在比较复杂的设计中也需要用到);这个在上一个步骤(功能仿真中)我们已经完成了时序仿真的波形查看

7、IO分配以及配置文件(bit流文件)的生成

如果在布局布线时未进行IO分配在该步骤进行IO分配并生成BIT流文件,这里我们直接查看小梅哥给出的excel文档,填写我们需要输出的时钟引脚;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//Copyright (C)2014-2023 Gowin Semiconductor Corporation.
//All rights reserved. 
//File Title: Physical Constraints file
//Tool Version: V1.9.9 (64-bit)
//Part Number: GW5A-LV25UG324C2/I1
//Device: GW5A-25
//Device Version: A
//Created Time: Sat 02 17 19:32:14 2024IO_LOC "ds" F4;
IO_PORT "ds" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "st_cp" F3;
IO_PORT "st_cp" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "sh_cp" H4;
IO_PORT "sh_cp" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "reset_n" B16;
IO_PORT "reset_n" PULL_MODE=NONE BANK_VCCIO=3.3;
IO_LOC "clk" T9;
IO_PORT "clk" PULL_MODE=NONE BANK_VCCIO=3.3;

到这里软件的模拟仿真验证就完成了最后是烧录到板子上进行测试验证

8、配置(烧录)FPGA

时序通过了后需要通过硬件进行验证也就是最后一步的实物验证

在这里插入图片描述

9、在线调试

当系统出现问题运行不正常我们可以通过外部硬件示波器或者逻辑分析仪进行实际引脚信号抓取分析

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码检测规范和git提交规范

摘要&#xff1a;之前开发的项目&#xff0c;代码检测和提交规范都是已经配置好的&#xff0c;最近自己新建的项目就记录下相关配置过程。 1. ESlint配置 2013年6月创建开源项目&#xff0c;提供一个插件化的JavaScript代码检测工具&#xff0c;创建项目是生成的eslintrc.js文…

【算法分析与设计】

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

如何使用Express框架构建一个简单的Web应用

在这个数字化时代&#xff0c;Web应用的需求越来越多样化和复杂化。在前端开发领域&#xff0c;Express框架作为一个快速、灵活的Node.js Web应用程序框架&#xff0c;拥有强大的功能和丰富的生态系统&#xff0c;深受开发者们的青睐。本篇博客将带您一步步探索如何使用Express…

Bert基础(四)--解码器(上)

1 理解解码器 假设我们想把英语句子I am good&#xff08;原句&#xff09;翻译成法语句子Je vais bien&#xff08;目标句&#xff09;。首先&#xff0c;将原句I am good送入编码器&#xff0c;使编码器学习原句&#xff0c;并计算特征值。在前文中&#xff0c;我们学习了编…

代码随想录算法训练营第四十天|343. 整数拆分、96. 不同的二叉搜索树。

343. 整数拆分 题目链接&#xff1a;整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 解题思路&#xff1a; 1、确定dp数组…

flink内存管理,设置思路,oom问题,一文全

flink内存管理 1 内存分配1.1 JVM 进程总内存&#xff08;Total Process Memory&#xff09;1.2 Flink 总内存&#xff08;Total Flink Memory&#xff09;1.3 JVM 堆外内存&#xff08;JVM Off-Heap Memory&#xff09;1.4 JVM 堆内存&#xff08;JVM Heap Memory&#xff09;…

运维的利器–监控–zabbix–第二步:建设–部署zabbix agent

文章目录 监控客户端部署及添加主机一、在 zabbix-server 安装客户端二、在本机和其他linux主机安装zabbix agent客户端1、安装2、配置3、启动并开机自启4、添加主机创建主机组创建主机等一会或重启zabbix-server查看配置是否成功 三、在其他windows上安装zabbix agent客户端下…

主流的开发语言和开发环境介绍

个人浅见&#xff0c;不喜勿喷&#xff0c;谢谢 软件开发是一个涉及多个方面的复杂过程&#xff0c;其中包括选择合适的编程语言和开发环境。编程语言是软件开发的核心&#xff0c;它定义了程序员用来编写指令的语法和规则。而开发环境则提供了编写、测试和调试代码的工具和平台…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

WebService学习,wsdl文件详解

目录 第一章、起因1.1&#xff09;学习原因1.2&#xff09;提问的过程&#xff08;逐步提出问题&#xff09;1、&#xff1f;wsdl链接的含义&#xff0c;有什么作用&#xff1f;2、什么是wsdl文档&#xff1f;3、如何阅读wsdl文件&#xff1f;4、wsdl文件有什么作用&#xff1f…

基于springboot+vue的智慧社区系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

(十四)【Jmeter】线程(Threads(Users))之开放模型线程组(Open Model Thread Group)

简述 操作路径如下: 开放模型线程组(Open Model Thread Group) 是 JMeter 5.5 版本中引入的一个新特性,它允许用户创建具有可变负载的负载配置文件。相较于传统的线程组,开放模型线程组提供了更多的灵活性和动态调整的能力。 优点: 灵活性:允许测试人员根据测试需求动…

python 提取PDF文字

使用pdfplumber&#xff0c;不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…

Verilog刷题笔记33

题目&#xff1a; You are given a four-bit input vector in[3:0]. We want to know some relationships between each bit and its neighbour: out_both: Each bit of this output vector should indicate whether both the corresponding input bit and its neighbour to t…

Kafka3.x进阶

来源&#xff1a;B站 目录 Kafka生产者生产经验——生产者如何提高吞吐量生产经验——数据可靠性生产经验——数据去重数据传递语义幂等性生产者事务 生产经验——数据有序生产经验——数据乱序 Kafka BrokerKafka Broker 工作流程Zookeeper 存储的 Kafka 信息Kafka Broker 总…

戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)

戏曲文化苑小程序目录 目录 基于微信小程序的戏曲文化苑系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;戏曲管理 &#xff08;2&#xff09;公告信息管理 &#xff08;3&#xff09;公告类型管理…

PostgreSQL 的实体化视图介绍

PostgreSQL 实体化视图提供一个强大的机制&#xff0c;通过预先计算并将查询结果集存储为物理表来提高查询性能。本教程将使用 DVD Rental Database 数据库作为演示例子&#xff0c;指导你在 PostgreSQL中创建实体化视图。 了解实体化视图 实体化视图是查询结果集的快照&…

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…

Aigtek高压放大器是什么东西做的

在许多电子应用中&#xff0c;需要将低电压信号放大到较高电压以满足特定的需求。为了实现这个目标&#xff0c;高压放大器被广泛采用。高压放大器是一种专用电子设备&#xff0c;使用特定的电路和器件来增益输入信号的电压。它通常由以下几个主要组成部分构成。 电源供应 高压…

Linux编译器---gcc/g++使用详解

目录 前言 gcc/g介绍 gcc/g的编译指令&#xff08;以gcc为例&#xff09; ​编辑 gcc选项 预处理(进行宏替换) 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&#xff09; 函数库 概念 …