Xilinx FPGA:vivado用串口控制数码管

news2024/11/15 21:23:10

一、项目要求

      要求输入从千位到个位数字给4位数码管,要求分别输入的数字都能显示

二、关键信号流向

三、程序设计

顶层:

`timescale 1ns / 1ps
module TOP(
    input                sys_clk   ,
    input                rst_n     ,
    input                rx_data  ,
    output wire[3:0]    DIG       ,
    output wire[7:0]    SEG       
    );
    
    /接收端模块例化
    wire [7:0]        uart_data   ;
    wire              rx_done     ;
    uart_rx  uart_rx_u1(
                     .   sys_clk   (sys_clk  )    ,
                     .   rst_n     (rst_n    )    ,
                     .   rx_data   (rx_data  )    ,
                     .   uart_data (uart_data)    ,
                     .   rx_done   (rx_done  )

    );
    
    //translate模块例化
    wire[7:0]          trans_data   ;
    translate translate_u1(
                      .  sys_clk    (sys_clk   )   ,
                      .  rst_n      (rst_n     )   ,
                      .  uart_data  (uart_data )   ,
                      .  rx_done    (rx_done   )   ,
                      .  trans_data (trans_data)

        );
    
    //conversion模块例化
      wire[15:0]        number   ;
    conversion  conversion_u1(
                      .     sys_clk  (  sys_clk )  ,
                      .     rst_n    (  rst_n   )  ,
                      .     rx_done  (  rx_done )  ,
                      .   trans_data (trans_data)  ,   0 1 2 3 4
                      .     number   (  number  )

    );

  //解码器模块例化
     wire  [3:0]      num   ;
     wire  [7:0]      seg   ;
  decoder  decoder_u1(
                      .  num (num)  ,
                      .  seg (seg)
      );

  //数码管模块例化
  SEG_state  SEG_state_u1(
                        .    sys_clk ( sys_clk)  ,
                        .    rst_n   ( rst_n  )  ,
                        .   number   (number  ) ,//0~9999
                        .   seg      (seg     ) ,
                        .   DIG      (DIG     ) ,
                        .   SEG      (SEG     ) ,
                        .   num      (num     )

    );
  




endmodule

接收端模块:

`timescale 1ns / 1ps
module uart_rx(
     input                 sys_clk  ,
     input                 rst_n    ,
     input                 rx_data  ,
     output    reg[7:0]    uart_data,
     output    reg         rx_done

    );
    parameter         SYSCLK =   50_000_000  ;
    parameter         Baud   =   115200      ;
    parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期
    parameter         MID    =   COUNT/2     ;
    
    reg       rx_reg1   ;
    reg       rx_reg2   ;
    
    wire           start_flag ;
    reg            rx_flag    ;
    reg  [3:0]     cnt_bit    ;//0-9
    reg  [9:0]     cnt        ;//0-434
    reg  [7:0]     data_reg   ;
    
    always@(posedge sys_clk)
          if(!rst_n)begin
             rx_reg1 <= 1 ;
             rx_reg2 <= 2 ;
          end
          else
              begin
               rx_reg1 <= rx_data  ;
               rx_reg2 <= rx_reg1  ;
              end
     assign start_flag = ~rx_reg1 & rx_reg2 ;
    
    rx_flag
    always@(posedge sys_clk)
          if(!rst_n)
             rx_flag <= 0 ;
          else if (start_flag)
             rx_flag <= 1 ;
          else if ( cnt_bit == 9 && cnt == MID -1)
             rx_flag <= 0 ;
          else
             rx_flag <= rx_flag ;
    
    /cnt  434
     always@(posedge sys_clk)
           if(!rst_n)
              cnt <= 0 ;
           else if ( rx_flag == 1)begin
                if ( cnt == COUNT -1 )
                     cnt <= 0 ;
                else
                     cnt <= cnt +1 ;
                end
            else
              cnt <= 0 ;
    
    
    计数器
    always@(posedge sys_clk)
          if(!rst_n)
             cnt_bit <= 0 ;
          else if ( rx_flag)begin
               if ( cnt == COUNT -1 )begin
                    if( cnt_bit == 9 )
                        cnt_bit <= 0 ;
                    else
                        cnt_bit <= cnt_bit +1;
                    end
               else
               cnt_bit <= cnt_bit ;
               end
           else
           cnt_bit <= 0 ; 
   
   /中间寄存器的赋值
     always@(posedge sys_clk)
           if(!rst_n)
              data_reg <= 0 ;
           else if ( rx_flag )begin
                if ( cnt == MID -1 && cnt_bit>0 && cnt_bit <9 )
                 data_reg[cnt_bit -1] <= rx_data  ;
                else
                 data_reg <= data_reg  ;
           end
           else
           data_reg <= 0 ; 
           
  给uart_data赋值
     always@(posedge sys_clk )
           if(!rst_n)
              uart_data <= 0 ;
           else if ( rx_flag )begin
                if ( cnt_bit == 9 && cnt == MID/4 -1)
                    uart_data <= data_reg  ;
                else
                    uart_data <= uart_data  ;
           end
           else
            uart_data <= uart_data  ;   
            
    rx_done
      always@(posedge sys_clk )
            if(!rst_n)
               rx_done <= 0 ;
            else if (rx_flag)begin
                 if (cnt_bit == 9 && cnt == MID/2 -1)
                     rx_done <= 1;
                 else
                     rx_done <= 0 ;            
            end    
            else
              rx_done <= 0 ;
    
endmodule

翻译模块:

这里注释掉了组合逻辑的写法,因为根据仿真,组合逻辑引发了时序问题

`timescale 1ns / 1ps
module translate(
      input              sys_clk   ,
      input              rst_n     ,
      input   [7:0]      uart_data ,
      input              rx_done   ,
      output  reg[7:0]   trans_data

    );
//    always@(*)
//          if(!rst_n)
//             trans_data <= 0 ;
//          else if (rx_done)
//               case(uart_data)
//               8'h30 : trans_data <= 8'd0  ; 
//               8'h31 : trans_data <= 8'd1  ; 
//               8'h32 : trans_data <= 8'd2  ; 
//               8'h33 : trans_data <= 8'd3  ; 
//               8'h34 : trans_data <= 8'd4  ; 
//               default:;
//               endcase
//          else
//             trans_data <= trans_data  ;
 
     always@(posedge sys_clk)
          if(!rst_n)
             trans_data <= 0 ;
          else if (rx_done)
               case(uart_data)
               8'h30 : trans_data <= 8'd0  ; 
               8'h31 : trans_data <= 8'd1  ; 
               8'h32 : trans_data <= 8'd2  ; 
               8'h33 : trans_data <= 8'd3  ; 
               8'h34 : trans_data <= 8'd4  ; 
               default:;
               endcase
          else
             trans_data <= trans_data  ;
   
endmodule

转换模块:

`timescale 1ns / 1ps
/*
发送4: 0111  显示4
发送3: 1011  显示3
发送2: 1101  显示2
发送1: 1110  显示1
发送0: 0000  显示0
*/
module conversion(
      input                sys_clk    ,
      input                rst_n      ,
      input                rx_done   ,
      input  wire[7:0]   trans_data  ,   0 1 2 3 4
      output wire[15:0]     number 

    );
    /数据处理
    reg[14:0]            trans_qian   ;     // 1000-9999
    reg[10:0]            trans_bai    ;    //100-999 
    reg[7:0]            trans_shi    ;   // 10-99
    reg[4:0]            trans_ge     ;  //0-9
    

    
    
    
    ///状态机///
    localparam               IDLE = 4'b0000 ;
    localparam               GE   = 4'b0001 ;
    localparam               SHI  = 4'b0010 ;
    localparam               BAI  = 4'b0100 ;
    localparam               QIAN = 4'b1000 ;

    
    reg[4:0]        cur_state   ;
    reg[4:0]        next_state  ;
    //state1
    always@(posedge sys_clk)
          if(!rst_n)
             cur_state <= IDLE  ;
          else 
             cur_state <= next_state  ;
    
    //state2
    always@(*)
          case(cur_state)
//          IDLE : next_state = QIAN  ;
          IDLE   :
                  begin
                      if (rx_done)
                      next_state = QIAN  ;
                      else
                      next_state = cur_state ;
                  end
          QIAN   :
                 begin
                      if(rx_done)
                         next_state = BAI  ;
                      else
                         next_state = cur_state  ;
                 end
          BAI  :
                 begin
                      if(rx_done)
                         next_state = SHI  ;
                      else
                         next_state = cur_state  ;
                 end
          SHI  :
                 begin
                      if(rx_done)
                         next_state = GE  ;
                      else
                         next_state = cur_state  ;
                 end
          GE :
                 begin
                      if(rx_done)
                         next_state = IDLE  ;
                      else
                         next_state = cur_state  ;
                 end
          default:;
          endcase
          
    state3
    always@(posedge sys_clk)
          if(!rst_n)
                     begin
                    trans_qian <= 0 ;
                    trans_bai  <= 0 ;
                    trans_shi  <= 0 ;
                    trans_ge   <= 0 ;                   
                    end
          else
             case(cur_state)
             IDLE : 
                    begin
                    trans_qian <= 0 ;
                    trans_bai  <= 0 ;
                    trans_shi  <= 0 ;
                    trans_ge   <= 0 ;                   
                    end
             QIAN : trans_qian <= trans_data * 1000 ;
             BAI  : trans_bai  <= trans_data * 100  ;
             SHI  : trans_shi  <= trans_data * 10   ;
             GE   : trans_ge   <= trans_data * 1    ;
             default:;
             endcase
    assign  number = trans_qian + trans_bai + trans_shi + trans_ge ;          

endmodule

译码模块:

`timescale 1ns / 1ps
module decoder(
    input      [3:0]   num   ,
    output  reg[7:0]   seg
    );
    always@(*)
    case(num)
        4'd0: seg = 8'h3f;
        4'd1: seg = 8'h06;
        4'd2: seg = 8'h5b;
        4'd3: seg = 8'h4f;
        4'd4: seg = 8'h66;
        4'd5: seg = 8'h6d;
        4'd6: seg = 8'h7d;
        4'd7: seg = 8'h07;
        4'd8: seg = 8'h7f;
        4'd9: seg = 8'h6f;
        default:;
     endcase
endmodule
   

数码管模块: 

`timescale 1ns / 1ps
module SEG_state(
    input                sys_clk   ,
    input                rst_n     ,
    input  wire[15:0]   number    ,//0~9999
    input  wire[7:0]    seg       ,
    output wire[3:0]    DIG       ,
    output wire[7:0]    SEG       ,
    output reg[3:0]     num     

    );
    parameter         MODE = 0 ;  ///共阴极
    
    ///数据处理
    
//    reg[3:0]         num     ;
//    reg[7:0]         seg     ;
    reg[3:0]         dig     ;
    wire[3:0]      num_ge     ;
    wire[3:0]      num_shi    ;
    wire[3:0]      num_bai    ;
    wire[3:0]      num_qian   ;
    
    assign          num_ge   = number%10        ;
    assign          num_shi  = number/10%10     ;
    assign          num_bai  = number/100%10    ;
    assign          num_qian = number/1000%10   ;
    
    状态机
//    parameter      TIME_1ms = 16'd50_000   ;   
    parameter      TIME_1ms = 16'd5  ;    //测试用
    
    reg[3:0]        cur_state     ;
    reg[3:0]        next_state    ;
    reg[20:0]       cnt_1ms       ;
    
    localparam       IDLE = 4'b0000 ;
    localparam       GE   = 4'b0001 ;
    localparam       SHI  = 4'b0010 ;
    localparam       BAI  = 4'b0100 ;
    localparam       QIAN = 4'b1000 ;
    
    
    always@(posedge sys_clk)
          if(!rst_n)
          cur_state <= IDLE  ;
          else
          cur_state <= next_state  ;
          
    always@(*)
          case(cur_state)
          IDLE :next_state = GE ;
          GE   :
                begin
                    if( cnt_1ms == TIME_1ms -1 )
                       next_state = SHI  ;
                    else
                       next_state = cur_state ;
                end
          SHI  :
                begin
                    if( cnt_1ms == TIME_1ms -1 )
                       next_state = BAI  ;
                    else
                       next_state = cur_state ;
                end
          BAI  :
                begin
                    if( cnt_1ms == TIME_1ms -1 )
                       next_state = QIAN  ;
                    else
                       next_state = cur_state ;
                end
          QIAN :
                begin
                    if( cnt_1ms == TIME_1ms -1 )
                       next_state = GE  ;
                    else
                       next_state = cur_state ;
                end
            default:;
          endcase
   
   always@(posedge sys_clk )
         if(!rst_n)begin
            dig <= 0     ;
            cnt_1ms <= 0 ;
            num <= 0     ;
         end
         else
         case(cur_state)
         IDLE : 
               begin
                    dig <= 0 ; 
                    cnt_1ms <= 0 ;
                    num <= 0;
               end
         GE   : 
               begin
               dig <= 4'b1110  ;              
               num <= num_ge   ;
               if( cnt_1ms == TIME_1ms -1 )
                   cnt_1ms <= 0 ;
               else
                   cnt_1ms <= cnt_1ms +1 ;
               end
         SHI  :
               begin
               dig <= 4'b1101  ;              
               num <= num_shi   ;
               if( cnt_1ms == TIME_1ms -1 )
                   cnt_1ms <= 0 ;
               else
                   cnt_1ms <= cnt_1ms +1 ;
               end 
         BAI  :
               begin
               dig <= 4'b1011  ;              
               num <= num_bai   ;
               if( cnt_1ms == TIME_1ms -1 )
                   cnt_1ms <= 0 ;
               else
                   cnt_1ms <= cnt_1ms +1 ;
               end 
         QIAN : 
               begin
               dig <= 4'b0111  ;              
               num <= num_qian   ;
               if( cnt_1ms == TIME_1ms -1 )
                   cnt_1ms <= 0 ;
               else
                   cnt_1ms <= cnt_1ms +1 ;
               end
         default:;
         endcase
    
    assign         DIG = (MODE == 0 ) ? dig : ~dig ;
    assign         SEG = (MODE == 0 ) ? seg : ~seg ;
               
endmodule

四、仿真文件

`timescale 1ns / 1ps
module test_bench(  );

    reg                sys_clk   ;
    reg                rst_n     ;
    reg                rx_data   ;
    wire[3:0]           DIG      ;
    wire[7:0]           SEG      ;
    
    parameter         SYSCLK = 50_000_000  ;  
    parameter         Baud   = 115200      ;
    parameter         COUNT  = SYSCLK/Baud ;
    parameter         MID    = COUNT/2     ;
    
    initial
           begin
                 sys_clk  = 0 ;
                 rst_n    = 0 ;
                 #10
                 rst_n    = 1 ;
           end
    always #1 sys_clk = ~sys_clk  ;
    
    initial
           begin
                uart_out (8'h31)  ;
                uart_out (8'h32)  ;
                uart_out (8'h33)  ;
                uart_out (8'h34)  ;
            end
            
    任务函数
    task              uart_out  ;
    input    [7:0]     DATA     ;
         begin
              rx_data = 1   ;空闲位初始
              #20
              rx_data = 0   ;起始位
        
               #(COUNT*2)  rx_data = DATA[0] ;///数据位第一位
               #(COUNT*2)  rx_data = DATA[1] ;///数据位第二位
               #(COUNT*2)  rx_data = DATA[2] ;
               #(COUNT*2)  rx_data = DATA[3] ;
               #(COUNT*2)  rx_data = DATA[4] ;
               #(COUNT*2)  rx_data = DATA[5] ;
               #(COUNT*2)  rx_data = DATA[6] ;
               #(COUNT*2)  rx_data = DATA[7] ;
               #(COUNT*2)  rx_data = 1       ;
               #(COUNT*2)                    ;//停止位也需要时间
               #200;//0_000                     ;
           end                  //2ms数据发送的时间至少要大于点阵屏切换数据的时间(1ms)
    endtask

TOP TOP_u1(
             .     sys_clk  (sys_clk)  ,
             .     rst_n    (rst_n  )  ,
             .     rx_data  (rx_data)  ,
             .     DIG      (DIG    )  ,
             .     SEG      (SEG    ) 
    );
endmodule

仿真结果:

五、绑定管脚


set_property PACKAGE_PIN P20 [get_ports {DIG[0]}]
set_property PACKAGE_PIN N18 [get_ports {DIG[1]}]
set_property PACKAGE_PIN P18 [get_ports {DIG[2]}]
set_property PACKAGE_PIN W16 [get_ports {DIG[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {DIG[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {DIG[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {DIG[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {DIG[0]}]
set_property PACKAGE_PIN R18 [get_ports {SEG[0]}]
set_property PACKAGE_PIN N20 [get_ports {SEG[1]}]
set_property PACKAGE_PIN U20 [get_ports {SEG[2]}]
set_property PACKAGE_PIN W20 [get_ports {SEG[3]}]
set_property PACKAGE_PIN R17 [get_ports {SEG[4]}]
set_property PACKAGE_PIN P19 [get_ports {SEG[5]}]
set_property PACKAGE_PIN T20 [get_ports {SEG[6]}]
set_property PACKAGE_PIN V20 [get_ports {SEG[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SEG[0]}]

set_property PACKAGE_PIN P15 [get_ports rst_n]
set_property PACKAGE_PIN K17 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]

set_property IOSTANDARD LVCMOS33 [get_ports rx_data]
set_property PACKAGE_PIN W18 [get_ports rx_data]

六、实验结果

0623

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

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

相关文章

基于LangChain构建RAG应用

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;上一篇文章中我们详细介绍了RAG的核心思想以及搭建向量数据库的完整过程&#xff1b;&#x1f632; 本文将基于上一篇文章的结果进行开发&#xff0c;主…

@RequestParam注解的使用及源码解析

前言 RequestParam 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解RequestParam 注解 使用案例 1.获取 URL 上的值 GetMapping("/simple") public String simple(RequestP…

MySQL自学教程:1. MySQL简介与安装

MySQL简介与安装 一、MySQL简介二、MySQL安装(一)Windows系统上的安装(二)Linux系统上的安装(以Ubuntu为例)(三)Mac OS系统上的安装三、安装后的基本配置四、总结一、MySQL简介 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于各种业务场景,从小型个…

2024肥晨赠书活动第三期:《前端工程化:基于Vue.js 3.0的设计与实践》

文章目录 内容简介作者简介关于《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》文章目录文章简介《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》全书速览结束语 内容简介 本书以Vue.js的3.0版本为核心技术栈&#xff0c;围绕“前端工程化”和TypeScript的知识点…

保姆级本地部署Qwen2

重点&#xff1a;Qwen2提供了CPU与GPU两种运行方式 运行成功效果图&#xff1a; 前提说明&#xff1a;如果需要用GPU&#xff0c;那么请在物理机安装ubuntu系统&#xff0c;不然显卡驱动很难安装&#xff0c;不建议新手部署。训练微调模型需要用到GPU。本文仅以ubuntu系统演示…

vue3+ts <script setup lang=“ts“> element-plus的el-date-picker设置默认日期

效果图&#xff08;单个日期&#xff09;&#xff1a; utils.ts&#xff1a; /*** 格式化时间戳* param {number} timestamp 时间戳* param {string} format 格式* returns {string}*/ export const formatTimeStamp (timestamp: number, format: string) > {if (!timesta…

Python魔法参数:深入解析*args和**kwargs的强大用途

目录 引言 基础概念解析 *args:处理位置参数 **kwargs:处理关键字参数 *args和**kwargs的实际应用场景 1. 函数装饰器中使用*args和**kwargs 2. 类构造函数中使用*args和**kwargs 3. API调用中使用**kwargs 与其他参数类型的结合使用 结合默认参数 位置参数与关键…

利用powershell开展网络钓鱼

要确保人们打开我们的恶意文件并执行它们&#xff0c;我们只需让微软努力工作多年来赢得人们的信任&#xff0c;然后将一些危险的宏插入到幻灯片中。 本博文将介绍如何通过屏幕顶部的一个友好的警告提示&#xff0c;在用户启用宏后立即运行您的宏。 首先&#xff0c;我们需要打…

pytest-yaml-sanmu(五):跳过执行和预期失败

除了手动注册标记之外&#xff0c;pytest 还内置了一些标记可直接使用&#xff0c;每种内置标记都会用例带来不同的特殊效果&#xff0c;本文先介绍 3 种。 1. skip skip 标记通常用于忽略暂时无法执行&#xff0c;或不需要执行的用例。 pytest 在执行用例时&#xff0c;如果…

手持小风扇哪个品牌好耐用?手持小风扇品牌排行榜揭晓分享

炎炎夏日&#xff0c;手持小风扇、USB小风扇&#xff0c;成为人手一台的“网红”。这些小风扇造型小巧&#xff0c;可以装进包里&#xff0c;夏日出街或者挤公交地铁都可以拿出来吹一吹。那么这些小风扇性价比高不高呢&#xff1f;真的好用吗&#xff1f;耐用吗&#xff1f;根据…

00. 这里整理了最全的爬虫框架(Java + Python)

目录 1、前言 2、什么是网络爬虫 3、常见的爬虫框架 3.1、java框架 3.1.1、WebMagic 3.1.2、Jsoup 3.1.3、HttpClient 3.1.4、Crawler4j 3.1.5、HtmlUnit 3.1.6、Selenium 3.2、Python框架 3.2.1、Scrapy 3.2.2、BeautifulSoup Requests 3.2.3、Selenium 3.2.4…

web前端——javaScript

目录 一、javaScript概述 1.javaScript历史 2.JavaScript与html,css关系 二、基本语法 ①放在head中 ②放在 body中 ③写在外部的.js文件中 1.变量 2.数据类型 3.算术运算符 4.逻辑运算符 5.赋值运算 6.逻辑运算符 7.条件运算符 8.控制语句 三、函数 1…

简单的text/html无法解析解决记录

简单的text/html无法解析解决记录 1. bug发现 我们所有的服务都是微服务&#xff0c;服务间调用都是使用feign接口进行调用&#xff0c;正常调用都没有问题&#xff0c;但是某一天发现部分从esb服务调用过来到我们本地的服务&#xff0c;本地服务再使用feign接口调用其他微服…

电脑定时重启怎么设置?用这个智能管理电脑定时任务的好帮手!

电脑定时重启怎么设置&#xff1f;用这个智能管理电脑定时任务的好帮手&#xff01;电脑定时重启&#xff0c;这个设置其实很简单&#xff0c;但是很多人都不知道用电脑怎么设置&#xff0c;而且操作也很麻烦&#xff0c;并不好管理&#xff0c;这个时候我们需要一个非常智能的…

模型情景制作-冰镇啤酒

夏日炎炎&#xff0c;当我们在真实世界中开一瓶冰镇啤酒的时候&#xff0c;我们也可以为模型世界中的人物添加一些冰镇啤酒。 下面介绍一种快速酒瓶制造方法&#xff0c;您只需要很少工具&#xff1a; 截取尽量直的流道&#xff08;传说中的板件零件架&#xff09;,将其夹在您的…

adb push 报错 ...error: failed to copy...

一、现象&#xff1a; 原因&#xff1a;没有权限导致的 二、解决方法&#xff1a; adb root adb remount #重新加载文件系统三、再次尝试&#xff1a;adb push xxx.apk /system/app 结果&#xff1a;成功

详细解释Spring事务的传播机制

详细解释Spring事务的传播机制 Spring框架中&#xff0c;事务传播机制是指在一个事务方法调用另一个事务方法时&#xff0c;Spring如何管理这些方法之间的事务边界。Spring提供了七种事务传播行为&#xff0c;以满足不同的业务需求。下面将详细解释每种传播行为及其适用场景&a…

不用翻墙,手把手教你用MAC本地版免费ComfyUI搭建Stable Diffusion工作流,让出图效率起飞

AI绘图如火如荼发展了这么久&#xff0c;从mj到SD webUI,再到时下最热门的Comfy UI。因为显存的问题对Mac用户一直不是很友好&#xff0c;阻碍了大部分设计师上手学习的道路。但是Comflowy解决了这个痛点。这是一款Mac系统可用本地版的sd&#xff0c;一键安装&#xff0c;让苹果…

阿里巴巴找黄金宝箱(IV)

系列文章目录 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 一、题目描述 贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现…

基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…