FPGA project : sobel

news2024/9/24 3:29:41

实验目标:

sobel算法,处理100X100灰度图像:野火logo

边缘检测:

边缘检测,针对的是灰度图像,顾名思义,检测图像的边缘,是针对图像像素点的一种计算,目的是标识数字图像中灰度变化明显的点,图像的边缘检测,在保留了图像的重要结构信息的同时,剔除了可以认为不相关的信息,大幅度减少了数据量,便于图像的传输和处理。

什么是sobel算法:

 算出来的Gxy与一个数据T比较大小,大于T则b2像素点赋值为黑色,小于赋值白色。

我踩得坑:

vga_pic模块,调用的时候由于图片大小需要更改,当初写vga_pic模块的时候,没有把代码中的一些数,用parameter表示,在修改的时候很麻烦。所以以后写代码的时候,大于2的参数一定要重新定义一下,代码写的应该更具复用性。

代码复用性也是代码质量的体现。

经验总结:

想要沉浸式写代码,就要清清楚楚的画好时序图。在写代码之前就应该想清楚用到的每个信号的时序图应该是什么样的。

fpga开发一大部分时间花在整体(顶层)设计上,一部分时间花在如何把想法转换为Verilog语言,一部分时间花在仿真调试上。

我认为最重要的就是整体设计,以及画好时序图。或者有流程图或者相关的辅助你把想法转换为代码的图。

模块框图:

时序图: 

特别大

代码:

 就放sobel算法部分,和顶层。

module sobel(
    input		wire 			clk_50		,
    input 		wire 			sys_rst_n 	,
    input 		wire	[7:0]	pi_data		,
    input 		wire 			pi_flag 	,
    
    output 		reg  			po_flag		,
    output		reg  	[7:0]	po_data 
);
    // parameter
    parameter	MAX_LINE = 8'd100 		 ,
                MAX_COL  = 8'd100 		 ,
                THR      = 8'b0000_1100  ,
                BLACK    = 8'b0000_0000  ,
                WHITE    = 8'b1111_1111  ;
                
    // reg signal define
    reg 	[7:0]	cnt_line	;
    reg 	[7:0]	cnt_col		;
    reg 			wrreq1		;
    reg		[7:0]	dataf1_in	;
    reg 			rdreq		;
    reg				wrreq2		;
    reg 	[7:0]	dataf2_in	;
    reg  	[7:0]	pi_data_reg1;
    reg     [7:0]	cnt_read 	; // 对从FIFO中读出的数据个数计数。
    reg 			dataRegFlag ;
    reg 	[7:0]	fifo1_reg   ;
    reg		[7:0]	fifo2_reg	;
    reg  	[7:0]	pi_data_reg2;
    reg  	[7:0]	pi_data_reg3; // 用来保存pi_data以进行sobel运算。不是单纯的对pi_data_reg2打拍。
    reg 			flag_abc	;
    reg		[7:0]	a3			;
    reg 	[7:0]	b3			;
    reg		[7:0]	c3			;
    reg		[7:0]	a2			;
    reg 	[7:0]	b2			;
    reg		[7:0]	c2			;
    reg		[7:0]	a1			;
    reg 	[7:0]	b1			;
    reg		[7:0]	c1			;
    reg  			arithmetic  ; // 进行sobel算法的标志。
    reg 	[8:0]	gx			; // 因为有符号位,所以运算过后要多加一位。
    reg		[8:0]	gy			; // 因为有符号位,所以运算过后要多加一位。
    reg 			flag_gxy	;
    reg		[8:0]	gxy			;
    reg				answer_flag ;
    
    // wire signal define
    wire            rdreq_w     ;    
    wire 			wrreq1_w	;
    wire 	[7:0]	dataf1_in_w ;
    wire	[7:0]	dataf1_out	;
    wire    [9:0]   usedw_f1    ;
    wire            full_f1     ;
    wire            empty_f1    ;
    wire			wrreq2_w	;
    wire	[7:0]	dataf2_in_w ;
    wire	[7:0]	dataf2_out	;
    wire    [9:0]   usedw_f2    ;
    wire            full_f2     ;
    wire            empty_f2    ;

/*********************************************************************/
// 	reg 	[7:0]	cnt_line	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_line <= 8'd0 ;
        else if(pi_flag && cnt_col == MAX_COL - 1 && cnt_line == MAX_LINE - 1)
            cnt_line <= 8'd0 ;
        else if(pi_flag && cnt_col == MAX_COL - 1)
            cnt_line <= cnt_line + 1'b1 ;
        else 
            cnt_line <= cnt_line ;
    end
// 	reg 	[7:0]	cnt_col		;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n)
            cnt_col <= 8'd0 ;
        else if(pi_flag && cnt_col == MAX_COL - 1)
            cnt_col <= 8'd0 ;
        else if(pi_flag)
            cnt_col <= cnt_col + 1'b1 ;
        else 
            cnt_col <= cnt_col ;
    end
// 	reg 			wrreq1		;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            wrreq1 <= 1'b0 ;
        else if(cnt_line == 0)
            wrreq1 <= pi_flag ;
        else if(((cnt_line == 2) && (cnt_col != 0)) 
                || ((cnt_line) > 2 && (cnt_line < MAX_LINE - 1)) 
                || ((cnt_line == MAX_LINE - 1) && (cnt_col == 0))) 
            wrreq1 <= wrreq2 ;
        else 
            wrreq1 <= 1'b0 ;
    end
// 	reg		[7:0]	dataf1_in	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            dataf1_in <= 8'd0 ;
        else if(cnt_line == 0)
            dataf1_in <= pi_data ;
        else if(((cnt_line == 2) && (cnt_col != 0)) 
                || ((cnt_line) > 2 && (cnt_line < MAX_LINE - 1)) 
                || ((cnt_line == MAX_LINE - 1) && (cnt_col == 0))) 
            dataf1_in <= dataf2_out ;
        else 
            dataf1_in <= dataf1_in ;
    end
// 	reg 			rdreq		;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rdreq <= 1'b0 ;
        else if(cnt_line >= 2)
            rdreq <= pi_flag ;
        else 
            rdreq <= 1'b0 ; 
    end
// 	reg				wrreq2		;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            wrreq2 <= 1'b0 ;
        else if(cnt_line == 1)
            wrreq2 <= pi_flag ;
        else if((cnt_line >= 2 && cnt_line <= (MAX_LINE - 1)) 
                || (cnt_line == (MAX_LINE - 1) && (cnt_col == 0)) ) 
            wrreq2 <= rdreq ;
        else 
            wrreq2 <= 1'b0 ;
    end
// 	reg 	[7:0]	dataf2_in	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            dataf2_in <= 8'd0 ;
        else if(cnt_line == 1)
            dataf2_in <= pi_data ;
        else if((cnt_line >= 2 && cnt_line <= (MAX_LINE - 1)) 
                || (cnt_line == (MAX_LINE - 1) && (cnt_col == 0)) ) 
            dataf2_in <= pi_data_reg1 ;
        else 
            dataf2_in <= dataf2_in ;
    end
// 	reg  	[7:0]	pi_data_reg1;
// 	reg  	[7:0]	pi_data_reg2;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            pi_data_reg1 <= 8'd0 ;
            pi_data_reg2 <= 8'd0 ;
        end else begin
            pi_data_reg1 <= pi_data      ;
            pi_data_reg2 <= pi_data_reg1 ;
        end
    end
// 	reg     [7:0]	cnt_read 	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_read <= 8'd0 ;
        else if(rdreq && cnt_read == MAX_COL - 1)
            cnt_read <= 8'd0 ;
        else if(rdreq)
            cnt_read <= cnt_read + 1'b1 ;
        else 
            cnt_read <= cnt_read ;            
    end
// 	reg 			dataRegFlag ;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            dataRegFlag <= 1'b0 ;
        else 
            dataRegFlag <= rdreq ; 
    end
// 	reg 	[7:0]	fifo1_reg   ;
// 	reg		[7:0]	fifo2_reg	;
// 	reg  	[7:0]	pi_data_reg3;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            fifo1_reg    <= 8'd0 ;
            fifo2_reg    <= 8'd0 ;
            pi_data_reg3 <= 8'd0 ;
        end else begin
            if(dataRegFlag) begin
                fifo1_reg    <= dataf1_out   ;
                fifo2_reg    <= dataf2_out   ;
                pi_data_reg3 <= pi_data_reg2 ;
            end else begin
                fifo1_reg    <= fifo1_reg    ;
                fifo2_reg    <= fifo2_reg    ;
                pi_data_reg3 <= pi_data_reg3 ;
            end
        end
    end
// 	reg 			flag_abc	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            flag_abc <= 1'b0 ;
        else 
            flag_abc <= dataRegFlag ;
    end
// 	reg		[7:0]	a3			;
// 	reg 	[7:0]	b3			;
// 	reg		[7:0]	c3			;
// 	reg		[7:0]	a2			;
// 	reg 	[7:0]	b2			;
// 	reg		[7:0]	c2			;
// 	reg		[7:0]	a1			;
// 	reg 	[7:0]	b1			;
// 	reg		[7:0]	c1			;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            a3 <= 8'd0 ;
            b3 <= 8'd0 ;
            c3 <= 8'd0 ;
            a2 <= 8'd0 ;
            b2 <= 8'd0 ;
            c2 <= 8'd0 ;
            a1 <= 8'd0 ;
            b1 <= 8'd0 ;
            c1 <= 8'd0 ;
        end else begin
            if(flag_abc) begin
                a3 <= fifo1_reg    ;
                b3 <= fifo2_reg    ;
                c3 <= pi_data_reg3 ;
                a2 <= a3 ;
                b2 <= b3 ;
                c2 <= c3 ;
                a1 <= a2 ;
                b1 <= b2 ;
                c1 <= c2 ;
            end else begin
                a3 <= a3 ;
                b3 <= b3 ;
                c3 <= c3 ;
                a2 <= a2 ;
                b2 <= b2 ;
                c2 <= c2 ;
                a1 <= a1 ;
                b1 <= b1 ;
                c1 <= c1 ;
            end
        end
    end
// 	reg  			arithmetic  ;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            arithmetic <= 1'b0 ;
        else if(cnt_col != 1 && cnt_col != 2)
            arithmetic <= flag_abc ;
        else 
            arithmetic <= 1'b0 ;
    end
// 	reg 	[8:0]	gx			;
// 	reg		[8:0]	gy			;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            gx <= 9'd0 ;
            gy <= 9'd0 ;
        end else begin
            if(arithmetic) begin
                gx <= (a3-a1)+((b3-b1) << 1)+(c3-c1) ; // 向左移动1bit相当于扩大二倍。
                gy <= (a1-c1)+((a2-c2) << 1)+(a3-c3) ; // 向左移动1bit相当于扩大二倍。
            end else begin
                gx <= gx ;
                gy <= gy ;
            end
        end
    end
// 	reg 			flag_gxy	;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n)
            flag_gxy <= 1'b0 ;
        else 
            flag_gxy <= arithmetic ;
    end

// 	reg		[8:0]	gxy			;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            gxy <= 8'd0 ;
        else if(flag_gxy) begin
            case ({gx[8],gy[8]})
            2'b00  : gxy <=  gx[7:0] +  gy[7:0]        ;
            2'b01  : gxy <=  gx[7:0] + ~gy[7:0] + 1'b1 ;
            2'b10  : gxy <= ~gx[7:0] +  gy[7:0] + 1'b1 ;
            2'b11  : gxy <= ~gx[7:0] + ~gy[7:0] + 2'd2 ;
            default: gxy <= gxy ;
            endcase
        end //    gxy <= {1'b0,gx[7:0]} + {1'b0,gy[7:0]} ; // 取其绝对值相加。也就是说最高位应该为0.
    end
// 	reg				answer_flag ;
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            answer_flag <= 1'b0 ;
        else 
            answer_flag <= flag_gxy ; 
    end
// output signal
// reg  			po_flag		
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            po_flag <= 1'b0 ;
        else if(answer_flag)
            po_flag <= 1'b1 ;
        else 
            po_flag <= 1'b0 ;
    end
// reg  	[7:0]	po_data 
    always @(posedge clk_50 or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            po_data <= 8'd0 ;
        else if(answer_flag && (gxy >  THR))
            po_data <= BLACK ;
        else if(answer_flag && (gxy <= THR))
            po_data <= WHITE ;
        else 
            po_data <=  po_data ;
    end
/*************************************************************/
    // 例化
    assign  dataf1_in_w = dataf1_in ;
    assign  dataf2_in_w = dataf2_in ;
    assign  rdreq_w     = rdreq     ; 
    assign  wrreq1_w    = wrreq1    ;
    assign  wrreq2_w    = wrreq2    ;
    
fifo fifo_f1(
	.clock                  ( clk_50        ) ,
	.data                   ( dataf1_in_w   ) ,
	.rdreq                  ( rdreq_w       ) ,
	.wrreq                  ( wrreq1_w      ) ,
	.empty                  ( empty_f1      ) ,
	.full                   ( full_f1       ) ,
	.q                      ( dataf1_out    ) ,
	.usedw                  ( usedw_f1      ) 
);

fifo fifo_f2(
	.clock                  ( clk_50        ) ,
	.data                   ( dataf2_in_w   ) ,
	.rdreq                  ( rdreq_w       ) ,
	.wrreq                  ( wrreq2_w      ) ,
	.empty                  ( empty_f2      ) ,
	.full                   ( full_f2       ) ,
	.q                      ( dataf2_out    ) ,
	.usedw                  ( usedw_f2      ) 
);

endmodule

 

module top(
    input		wire			sys_clk 	,
    input 		wire			sys_rst_n 	,
    input 		wire 			rx 			,
    
    output 		wire 			hsync 		,
    output		wire			vsync  		,
    output		wire	[7:0]	rgb			,
    output		wire			tx 
);

    // 例化间连线
    wire			clk_50     ;
    wire			clk_25     ;
    wire			rst_n      ;
    wire  			po_flag_rx ;
    wire	[7:0]	po_data_rx ;
    wire  			po_flag_so ;
    wire	[7:0]	po_data_so ;

pll pll_50_25(
    .sys_rst_n		( sys_rst_n  ) ,
    .areset			( ~sys_rst_n ) ,
    .inclk0			( sys_clk 	 ) ,
    .c0				( clk_50 	 ) ,
    .c1				( clk_25 	 ) ,
    .locked			( rst_n 	 ) 
);

uart_rx uart_rx_inst(
    .sys_clk		( clk_50     ) ,
    .sys_rst_n		( rst_n      ) ,
    .rx				( rx         ) ,

    .po_flag		( po_flag_rx ) ,
    .po_data		( po_data_rx )    
);

sobel sobel_inst(
    .clk_50			( clk_50     ) ,
    .sys_rst_n		( rst_n      ) ,
    .pi_data		( po_data_rx ) ,
    .pi_flag		( po_flag_rx ) ,
        
   .po_flag         ( po_flag_so ) ,
   .po_data         ( po_data_so ) 
);

uart_tx uart_tx_inst(
    .sys_clk        ( clk_50     ) ,
    .sys_rst_n      ( rst_n      ) ,
    .pi_flag        ( po_flag_so ) ,
    .pi_data        ( po_data_so ) ,

    .tx             ( tx         )          
);

vga vga_inst(
    .clk_25         ( clk_25     ) ,
    .clk_50         ( clk_50     ) ,
    .rst_n          ( rst_n      ) ,
    .pi_data        ( po_data_so ) ,
    .pi_flag        ( po_flag_so ) ,

    .hsync          ( hsync      ) ,
    .vsync          ( vsync      ) ,
    .rgb            ( rgb        )    
);

endmodule

 仿真图忘记截屏了。

上板验证:

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

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

相关文章

VM虚拟机扩容

背景介绍 在实现3D结构光扫描算法移植到嵌入式平台jetson Xavier NX时&#xff0c;需要在windows的电脑上安装VM虚拟机搭载Ubuntu&#xff0c;然后在Ubuntu 18.04上安装开发软件Nsight Eclipse Edition&#xff0c;在该集成开发软件上交叉编译jetson aarc64架构上可运行的文件…

SAE-J1939-21 (超8字节)多包数据----CAN传输协议

一、协议数据单元&#xff08;PDU&#xff09; 1. 优先级&#xff08;P&#xff09; 消息优先级可从最高 0&#xff08;000&#xff09;设置到最低 7&#xff08;111&#xff09;。 2. 保留位&#xff08;R&#xff09; 保留此位以备今后开发使用。 3. 数据页&#xff08;D…

中国移动咪咕、阿里云、华为“秀肌肉”,这届亚运会的“高光”不止比赛

文 | 智能相对论 作者 | 青月 竞技体育的发展&#xff0c;其实也可以看作是一部“技术进化史”。 在1924年的巴黎&#xff0c;广播首次进入奥运会&#xff0c;人们第一次可以通过报纸以外的方式了解奥运会。 1928年&#xff0c;在荷兰申办的阿姆斯特丹奥运会&#xff0c;高…

mi note3 刷入lineageos

下载 twrp TWRP是国外安卓爱好者开发的一款工具&#xff0c;全名为Team Win Recovery Project&#xff0c;主要作用包括刷机、备份 &#xff0c;救砖。 https://twrp.me/xiaomi/xiaomiminote3.html 一般下载最新版本&#xff0c;mi note 3对应 https://dl.twrp.me/jason/twrp-…

Hadoop----Azkaban的使用与一些报错问题的解决

1.因为官方只放出源码&#xff0c;并没有放出其tar包&#xff0c;所以需要我们自己编译&#xff0c;通过查阅资料我们可以使用gradlew对其进行编译&#xff0c;还是比较简单&#xff0c;然后将里面需要用到的服务文件夹进行拷贝&#xff0c;完善其文件夹结构&#xff0c;通常会…

Android笔记(二):JetPack Compose定义移动界面概述

一、JetPack Compose组件概述 JetPack Compose是Google公司在2021年正式推出的声明式UI工具包。Compose库用于开发原生Android应用界面。它取代传统XML文件配置界面&#xff0c;不需要界面编辑工具&#xff0c;而是采用强大Kotlin API以及函数搭建移动应用界面&#xff0c;代码…

请求的转发和重定向

RequestDispatcher接口实现转发&#xff1a; jsp1上链接到Servlet&#xff0c;Servlet再转发&#xff08;关键在这里怎么实现转发&#xff1f;&#xff1f;&#xff09; 演示index.html页面---->Servlet1(转发到)------>Servlet2 实现转发流程 1.用HttpServletReques…

如何使用CDN加载静态资源

文章目录 前言工具场景七牛云创建空间存储 控制台查看后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误…

《机器学习》- 第3章 线性模型

文章目录 3.1 基本形式3.2 线性回归一元线性回归多元线性回归 3.3 对数几率回归3.4 线性判别分析3.5 多分类学习3.6 类别不平衡问题 3.1 基本形式 问题描述&#xff1a; 函数形式&#xff1a; 向量形式&#xff1a; 许多功能更为强大的非线性模型可在线性模型的基础上引入层…

Java项目如何防止SQL注入的四种方案

什么是SQL注入 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者通过操纵应用程序的输入来执行恶意的SQL查询。这种漏洞发生在应用程序没有正确验证、过滤或转义用户提供的输入数据时。攻击者可以利用这个漏洞来执行未经授权的…

笔记本怎么录制屏幕?推荐3个实用技巧

在当今信息化快速发展的时代&#xff0c;笔记本录制屏幕成为人们日常生活中经常需要面对的问题。无论是办公、学习还是娱乐&#xff0c;录制屏幕都有着广泛的应用。可是笔记本怎么录制屏幕呢&#xff1f;接下来&#xff0c;本文将介绍3种常见的笔记本录制屏幕方法&#xff0c;我…

Python:Jupyter:OSError: Initializing from file failed

在学习Python的时候&#xff0c;我在进行导入外部文件的时候总是出现问题&#xff0c;总是乱导文件&#xff0c;可能碰巧文件导进去了&#xff0c;这次记录一下导入.csv文件失败的原因 read_csv时发生报错&#xff1a;OSError: Initializing from file failed filepathr"…

zabbix自定义监控内容和自动发现

6 目录 一、自定义监控内容&#xff1a; 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key&#xff1a; 3. 在 Web 页面创建自定义监控项模板&#xff1a; 3.1 创建模板&#xff1a; 3.2 创建监控项&#xff1a; 3.3 创建触发器&#…

C 语言数据类型概述

int 表示基本的整数类型, long, short, unsigned, signed 提供基本整数类型的变式. char 用于指定字符, 也可以表示较小的整数. float, double, long double 表示浮点数. _Bool 表示布尔值 (true 或者 false) _Complex 和 _Imaginary 分别表示复数和虚数. 通过这些关键字创…

Linux 内核 LTS 期限将从 6 年恢复至 2 年

导读在日前举行的欧洲开源峰会上&#xff0c;Linux 内核开发人员兼《Linux Weekly News》执行主编 Jonathan Corbet 介绍了 Linux 内核的最新动态以及未来的发展方向。其中一项即将发生的重大变化是&#xff1a;Linux 内核的长期支持 (LTS) 时间将从六年缩短至两年。 目前 Lin…

基于Java+SpringBoot+Vue在线家具商城系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

从零开始的Transformers第二篇:代码解析transformer架构

代码解析transformer架构 总体解析输入部分词向量Input Embedding 位置编码编码器自注意力机制掩码多头自注意力机制Feed ForwardLayer Norm残差链接Encoder Layer 解码器输出头总体模型所有代码 总体解析 上面是 transformer 的论文中的架构图&#xff0c;从上面拆分各个模块的…

2023版 STM32实战8 独立看门狗(IWDG)

IWDG简介 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 说人话就是能解决程序跑飞的问题。 编写代码思路 -1- 使用这个功能必须解除写保护 -2-…

Gartner:55%的组织,正在试用ChatGPT等生成式AI

10月4日,全球著名信息咨询调查机构Gartner在官网,公布了一项调查数据,55%的组织正在使用或试验生成式AI;超过一半的组织在过去10个月内,增加了对生成式 AI 投资。 本次,Gartner共对1419名企业高管/领导者进行了调查,45%的人表示正处于生成式AI试用期,10%已经在实际业务…

JavaScript Web APIs第六天笔记

Web APIs - 第6天笔记 目标&#xff1a;能够利用正则表达式完成小兔鲜注册页面的表单验证&#xff0c;具备常见的表单验证能力 正则表达式综合案例阶段案例 正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是一种字符串匹配的模式&#xff08;规则&#xf…