【FPGA/verilog -入门学习17】vivado 实现串口自发自收程序

news2024/11/18 5:39:53

1,需求

PC使用串口助手给FPGA板发送9600 波特率的数据,FPGA板接收到数据后,回复同样的数据给PC

2,需求分析

按模块可以划分为:

rx接收模块,将输入的8位并行rx 数据转换成[7:0]rx_data 信号,当数据接收完成后,同时生成一个rx_done 信号。

bsp_generate_clk_en:接收波特率时钟产生模块,当rx接收到数据时,给一个start信号给波特率时钟产生模块,由bsp时钟产生模块按9600波特率产生时钟使能信号bsp_generate_clk_en 用于同步rx 接收模块接收数据的时序。

tx发送模块:当接收到来子rx 接收模块发过来的rx_done 信号后,将[7:0]rx_data 的数据按波特率时钟产生模块的顺序依次发送出去。

bsp_generate_clk_en:发送波特率时钟产生模块,功能同接收模块

3,绘制框图和时序图

4,编写发送tx 模块,并编写行为测试模块代码测试其功能


`timescale 1ns/1ps

module testbench_top();
    

//参数定义

`define CLK_PERIORD        20        //时钟周期设置为20ns(50MHz)    


//接口申明
reg i_clk;
reg i_rest_n;
 
wire o_uart_tx;
wire o_uart_tx_done;


   

 vlg_design vlg_design_inst(
    .i_clk(i_clk),
    .i_rest_n(i_rest_n),
    .o_uart_tx(o_uart_tx),
    .o_uart_tx_done(o_uart_tx_done)
  
 );
 
initial begin
 
i_clk <= 0;
i_rest_n <= 0;
#20;
i_rest_n <= 1;


#2_000_000_000;
$stop;
 
end

always #(`CLK_PERIORD/2) i_clk = ~i_clk;
 
endmodule
//my_uart_tx
//put o_rx_data to i_uart_tx
  
`timescale 1ns/1ps
module vlg_1ms(
    input i_clk,  //25Mhz
    input i_rest_n,
    output [7:0]o_data, 
    output reg tx_en
    );

localparam CNT_1MS_MAX = 25*2000 - 1;

wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;
 
clk_wiz_0 instance_name
(
    // Clock out ports
    .clk_out1(clk_25m),     // output clk_out1
    .clk_out2(clk_12r5m),     // output clk_out2
    .clk_out3(clk_100m),     // output clk_out3
    // Status and control signals
    .reset(!i_rest_n), // input reset
    .locked(locked),       // output locked
    // Clock in ports
    .clk_in1(i_clk) // input clk_in1
);      

// 每隔1ms 产生一个 tx_en 上升沿脉冲  
reg [15:0] r_cnt_1ms;    
always @(posedge i_clk) begin
    if(!i_rest_n) r_cnt_1ms <= 0;
    else if(r_cnt_1ms < CNT_1MS_MAX)  r_cnt_1ms <= r_cnt_1ms + 1;
    else r_cnt_1ms <= 0;
end    
    
always @(posedge i_clk) begin
    if(!i_rest_n) tx_en <= 0;
    else if(r_cnt_1ms == CNT_1MS_MAX)  tx_en <= 1;
    else tx_en <= 0;
end    
reg [7:0]r_data;
// 每隔1ms ,data = 0000_0001 自增 
always @(posedge i_clk) begin
    if(!i_rest_n)  r_data <= 0;
    else if(r_data == 100) r_data <= 0;
    else if(r_cnt_1ms == CNT_1MS_MAX) r_data <= r_data+1;
    else ;
    end

assign o_data = r_data;




endmodule

//my_uart_tx
//put o_rx_data to i_uart_tx
  
`timescale 1ns/1ps
module vlg_design(
    input i_clk,  //25Mhz
    input i_rest_n,
    output  o_uart_tx,    
    output  o_uart_tx_done 
    );


wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;
 
wire tx_bps_start;
wire o_bps_clk_en;

wire [7:0]w_data;
wire w_tx_en;

  clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_25m),     // output clk_out1
    .clk_out2(clk_12r5m),     // output clk_out2
    .clk_out3(clk_100m),     // output clk_out3
    // Status and control signals
    .reset(!i_rest_n), // input reset
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(i_clk));      // input clk_in1


    
//对被测试的设计进行例化
    
vlg_speed_generate        vlg_speed_generate_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_bps_start(tx_bps_start),
    .o_bps_clk_en(o_bps_clk_en) 
    );    
    
    
///

 vlg_my_uart_tx vlg_my_uart_tx_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_uart_tx_bps_en(o_bps_clk_en),
    .i_rx_data(w_data),
    .tx_en(w_tx_en),
    .tx_bps_start(tx_bps_start),
    .o_uart_tx(o_uart_tx),
    .o_uart_tx_done(o_uart_tx_done)
  
 );
 ///

 vlg_1ms vlg_1ms_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .o_data(w_data),
    .tx_en(w_tx_en)
 );
 endmodule

//my_uart_tx
//put o_rx_data to i_uart_tx
  
`timescale 1ns/1ps
module vlg_my_uart_tx(
    input i_clk,  //25Mhz
    input i_rest_n,
    input i_uart_tx_bps_en, 
    input [7:0]i_rx_data, 
    input tx_en,
    output reg tx_bps_start,
    output reg o_uart_tx,    
    output reg o_uart_tx_done
    );
    
reg [3:0]txdata_cnt;    
    

//检测tx_en 的高电平脉冲
//检测到高脉冲 tx_bps_start 置1
//当数据发送完成,即start,D0~D7,Stop .txdata_cnt = 10 时结束tx_bps_start 置0


reg [1:0]r_tx_en_plus;
wire w_tx_en_pos;


always @(posedge i_clk) begin
    if(!i_rest_n) r_tx_en_plus <= 2'b00;
    else r_tx_en_plus <= {r_tx_en_plus[0],tx_en};
end

assign w_tx_en_pos = r_tx_en_plus[0]& ~r_tx_en_plus[1];


//产生 tx_bps_start
always @(posedge i_clk) begin
if(!i_rest_n) tx_bps_start <= 0;
else if(txdata_cnt == 11) tx_bps_start <= 0;
else if(w_tx_en_pos) tx_bps_start <= 1;
end


//txdata_cnt 计数 0~10 
always @(posedge i_clk) begin
if(!i_rest_n) txdata_cnt <= 0;
else if(txdata_cnt == 11)  txdata_cnt <= 0;
else if(i_uart_tx_bps_en) txdata_cnt <= txdata_cnt + 1;
end

//发出o_uart_tx
wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; // 1,d7,d6,d5,d4,d3,d2,d1,d0,0
always @(posedge i_clk) begin
    if(!i_rest_n) o_uart_tx <= 1;
    else if(i_uart_tx_bps_en)  begin 
            case (txdata_cnt)
                0: o_uart_tx <= w_data_10[0];
                1: o_uart_tx <= w_data_10[1];
                2: o_uart_tx <= w_data_10[2];
                3: o_uart_tx <= w_data_10[3];
                4: o_uart_tx <= w_data_10[4];
                5: o_uart_tx <= w_data_10[5];
                6: o_uart_tx <= w_data_10[6];
                7: o_uart_tx <= w_data_10[7];
                8: o_uart_tx <= w_data_10[8];
                9: o_uart_tx <= w_data_10[9];
                10: o_uart_tx <= 1;
                default : o_uart_tx <= 1;
            endcase 
        end
end

//o_uart_tx_done
always @(posedge i_clk) begin
if(!i_rest_n) o_uart_tx_done <= 0;
else if(txdata_cnt == 11)  o_uart_tx_done <= 1;
else  o_uart_tx_done <= 0;
end



endmodule

 
`timescale 1ns/1ps
module vlg_speed_generate(
    input i_clk,  //input 25Mhz
    input i_rest_n,
    input i_bps_start,
    output reg o_bps_clk_en
    );

localparam bpsrate = 115200;
localparam BPS_COUNT_MAX = 1*25*1000_000/bpsrate - 1;
localparam BPS_COUNT_MAX_DIV_2 = 1*25*1000_000/bpsrate/2-1;


reg [11:0]bsp_cnt;
 
always @(posedge i_clk) begin
if(!i_rest_n) bsp_cnt <= 0;
else if(!i_bps_start) bsp_cnt <= 0;
else if(bsp_cnt < BPS_COUNT_MAX)  bsp_cnt <= bsp_cnt+1;
    else bsp_cnt <= 0;
end
 
 
always @(posedge i_clk) begin
    if(!i_rest_n) o_bps_clk_en <= 0;
    else if (bsp_cnt == BPS_COUNT_MAX_DIV_2)  o_bps_clk_en <= 1;
    else o_bps_clk_en <= 0;
end

endmodule

仿真波形

5,编写RX接收模块,并编写行为测试模块代码测试其功能


`timescale 1ns/1ps

module testbench_top();
    

//参数定义

`define CLK_PERIORD        20        //时钟周期设置为20ns(50MHz)    


//接口申明
reg [7:0]data;
reg i_clk;
reg i_rest_n;
reg i_rx;

 
wire o_uart_tx;
wire o_uart_tx_done;

wire i_uart_rx_bps_en;
wire [7:0]o_rx_data;
wire o_rx_start;
wire o_uart_rx_done;

wire locked;

  clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_25m),     // output clk_out1
    .clk_out2(clk_12r5m),     // output clk_out2
    .clk_out3(clk_100m),     // output clk_out3
    // Status and control signals
    .reset(!i_rest_n), // input reset
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(i_clk));      // input clk_in1
    
 
 
vlg_my_uart_rx vlg_my_uart_rx_inst(

    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_rx(i_rx),
    .i_uart_rx_bps_en(i_uart_rx_bps_en),
    .o_rx_data(o_rx_data),
    .o_rx_start(o_rx_start),
    .o_uart_rx_done(o_uart_rx_done)

); 
 


 
 vlg_speed_generate        vlg_speed_generate_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_bps_start(o_rx_start),
    .o_bps_clk_en(i_uart_rx_bps_en) 
    );    
    
integer i;


 
initial begin
 
i_rx <= 1;
i_clk <= 0;
i_rest_n <= 0;
#20;
i_rest_n <= 1;
data <= 8'b0101_0101;  

end

always #(`CLK_PERIORD/2) i_clk = ~i_clk;


initial begin

 
@(posedge i_clk);
@(posedge i_rest_n);
#2000_000;
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600

for(i = 0;i<8;i=i+1) begin 
    i_rx <= data[i];
    #10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;


data <= 8'b0000_0101;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600

for(i = 0;i<8;i=i+1) begin 
    i_rx <= data[i];
    #10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;


data <= 8'b1111_0000;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600

for(i = 0;i<8;i=i+1) begin 
    i_rx <= data[i];
    #10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;


data <= 8'b0000_1111;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600

for(i = 0;i<8;i=i+1) begin 
    i_rx <= data[i];
    #10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;

$stop;

end


endmodule
//my_uart_tx
//put rx_data to i_uart_tx

`timescale 1ns/1ps
module vlg_design(
    input i_clk,  //25Mhz
    input i_rest_n,
    input i_rx,
    output o_tx
);

wire o_uart_tx;
wire o_uart_tx_done;
wire i_uart_rx_bps_en;
(*mark_debug = "true"*)wire [7:0]o_rx_data;
wire o_rx_start;
(*mark_debug = "true"*)wire o_uart_rx_done;
wire locked;


wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;
 
wire tx_bps_start;
wire i_uart_tx_bps_en;


//灏唕x_data 杞垚 tx 
 ///

 vlg_my_uart_tx vlg_my_uart_tx_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_uart_tx_bps_en(i_uart_tx_bps_en),
    .i_rx_data(o_rx_data),
    .tx_en(o_uart_rx_done),
    .tx_bps_start(tx_bps_start),
    .o_uart_tx(o_tx),
    .o_uart_tx_done(o_uart_tx_done)
  
 );

    
vlg_speed_generate        vlg_speed_generate_tx_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_bps_start(tx_bps_start),
    .o_bps_clk_en(i_uart_tx_bps_en) 
    );    
    

//浜х敓rx 杞琩ata鏁版嵁
vlg_my_uart_rx vlg_my_uart_rx_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_rx(i_rx),
    .i_uart_rx_bps_en(i_uart_rx_bps_en),
    .o_rx_data(o_rx_data),
    .o_rx_start(o_rx_start),
    .o_uart_rx_done(o_uart_rx_done)
); 
  
 vlg_speed_generate        vlg_speed_generate_rx_inst(
    .i_clk(clk_25m),
    .i_rest_n(i_rest_n),
    .i_bps_start(o_rx_start),
    .o_bps_clk_en(i_uart_rx_bps_en) 
    );    


// 浜х敓鏃堕挓淇″彿
  clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_25m),     // output clk_out1
    .clk_out2(clk_12r5m),     // output clk_out2
    .clk_out3(clk_100m),     // output clk_out3
    // Status and control signals
    .reset(!i_rest_n), // input reset
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(i_clk));      // input clk_in1


endmodule

//my_uart_tx
//put o_rx_data to i_uart_tx
  
`timescale 1ns/1ps
module vlg_my_uart_rx(
    input i_clk,  //25Mhz
    input i_rest_n,
    input(*mark_debug = "true"*) i_rx,  //杈撳叆 
    input i_uart_rx_bps_en, 
    
    output  [7:0]o_rx_data, 
    output reg o_rx_start,
    output reg o_uart_rx_done
    );
    
reg [3:0]rxdata_cnt;    
wire w_rx_pos;
reg  r_rx_start_pos;
reg [1:0]rx_plus;

always @(posedge i_clk) begin
    if(!i_rest_n)  rx_plus <= 2'b00;
    else rx_plus <= {rx_plus[0],i_rx};
end    

assign w_rx_pos = ~rx_plus[0] & rx_plus[1];// 鎵?鏈塺x 涓嬮檷娌?

///
//浜х敓 r_rx_start_pos 鑴夊啿锛屽綋rx 绗竴娆? = 0鏃讹紝杈撳嚭楂樼數骞筹紝鍏朵粬鏃跺埢鎷変綆
always @(posedge i_clk) begin
    if(!i_rest_n) r_rx_start_pos <= 0;
    else if(rxdata_cnt == 0) r_rx_start_pos <= w_rx_pos;
    else r_rx_start_pos <= 0;

end    



//妫?娴嬪埌 rx 1涓剦鍐茬殑涓嬮檷娌匡紝琛ㄧず淇″彿寮?濮嬶紝鎶?鏈粨鏉燂紝瀹屾垚
//o_rx_start
always @(posedge i_clk) begin
    if(!i_rest_n) o_rx_start <= 0;
    else if(rxdata_cnt == 11)o_rx_start <= 0;
    else if(r_rx_start_pos) o_rx_start <= 1;
    else  ;
end

//浜х敓rxdata_cnt璁℃暟
always @(posedge i_clk) begin
    if(!i_rest_n) rxdata_cnt <= 0;
    else if (rxdata_cnt == 11) rxdata_cnt <= 0;
    else if(i_uart_rx_bps_en)rxdata_cnt <= rxdata_cnt + 1;
    else ;
end

reg [7:0]r_rx_data;    
//鏀堕泦鏁版嵁
always @(posedge i_clk) begin
    if(!i_rest_n) r_rx_data <= 8'b0000_0000;  
   
     else if(i_uart_rx_bps_en)   
        case (rxdata_cnt)
            4'd0:    ;//start
            4'd1:    r_rx_data[0] <= i_rx;
            4'd2:    r_rx_data[1] <= i_rx;
            4'd3:    r_rx_data[2] <= i_rx;
            4'd4:    r_rx_data[3] <= i_rx;
            4'd5:    r_rx_data[4] <= i_rx;
            4'd6:    r_rx_data[5] <= i_rx;
            4'd7:    r_rx_data[6] <= i_rx;
            4'd8:    r_rx_data[7] <= i_rx;
            4'd9:;//stop
            4'd10:;//none
            default:;//none
        endcase 
 end    

assign o_rx_data= (rxdata_cnt == 11)?r_rx_data:o_rx_data;

//浜х敓o_uart_rx_done
always @(posedge i_clk) begin
    if(!i_rest_n)  o_uart_rx_done <= 0;
    else if(rxdata_cnt == 11) o_uart_rx_done <= 1;
    else o_uart_rx_done <= 0;  
end
endmodule

6,配置IO端口,生成bit文件烧录到板子测试

7,问题1:2024年1月10日

发送单个数据没有问题,但是连发出现异常数据。

对比代码发现例程代码的发送数据,结束位并没有保持1个bsp的完整高电平,而是只保持了一个脉冲的电平

修改代码后,测试ok

//my_uart_tx
//put o_rx_data to i_uart_tx
  
`timescale 1ns/1ps
module vlg_my_uart_tx(
    input i_clk,  //25Mhz
    input i_rest_n,
    input i_uart_tx_bps_en, 
    input [7:0]i_rx_data, 
    input tx_en,
    output reg tx_bps_start,
    output reg o_uart_tx,    
    output reg o_uart_tx_done
    );
    
reg [3:0]txdata_cnt;    
    

//检测tx_en 的高电平脉冲
//检测到高脉冲 tx_bps_start 置1
//当数据发送完成,即start,D0~D7,Stop .txdata_cnt = 10 时结束tx_bps_start 置0


reg [1:0]r_tx_en_plus;
wire w_tx_en_pos;


always @(posedge i_clk) begin
    if(!i_rest_n) r_tx_en_plus <= 2'b00;
    else r_tx_en_plus <= {r_tx_en_plus[0],tx_en};
end

assign w_tx_en_pos = r_tx_en_plus[0]& ~r_tx_en_plus[1];


//产生 tx_bps_start
always @(posedge i_clk) begin
if(!i_rest_n) tx_bps_start <= 0;
else if(txdata_cnt == 10) tx_bps_start <= 0;
else if(w_tx_en_pos) tx_bps_start <= 1;
end


//txdata_cnt 计数 0~10 
always @(posedge i_clk) begin
if(!i_rest_n) txdata_cnt <= 0;
else if(txdata_cnt == 10)  txdata_cnt <= 0;
else if(i_uart_tx_bps_en) txdata_cnt <= txdata_cnt + 1;
end

//发出o_uart_tx
wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; // 1,d7,d6,d5,d4,d3,d2,d1,d0,0
always @(posedge i_clk) begin
    if(!i_rest_n) o_uart_tx <= 1;
    else if(i_uart_tx_bps_en)  begin 
            case (txdata_cnt)
                0: o_uart_tx <= w_data_10[0];
                1: o_uart_tx <= w_data_10[1];
                2: o_uart_tx <= w_data_10[2];
                3: o_uart_tx <= w_data_10[3];
                4: o_uart_tx <= w_data_10[4];
                5: o_uart_tx <= w_data_10[5];
                6: o_uart_tx <= w_data_10[6];
                7: o_uart_tx <= w_data_10[7];
                8: o_uart_tx <= w_data_10[8];
                9: o_uart_tx <= w_data_10[9];
                default : o_uart_tx <= 1;
            endcase 
        end
end

//o_uart_tx_done
always @(posedge i_clk) begin
    if(!i_rest_n) o_uart_tx_done <= 0;
    else if(txdata_cnt == 10)  o_uart_tx_done <= 1;
    else  o_uart_tx_done <= 0;
end
endmodule

8,问题2:{} 数据合并要加上前缀

wire [9:0]w_data_10 = {1,i_rx_data,0}; //错误

wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; //正确

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

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

相关文章

性能优化--实战利用arthas排查java服务cpu占用过高的问题

使用jps -l查看目前的java应用进程 启动arthas&#xff0c;选择需要监控的进程 dashboar查看该应用整体情况 使用thread命令&#xff0c;查看占用cpu过高的几个线程ID 然后使用thread 线程ID查看具体线程在执行哪些内容&#xff0c;可以看到对应的类和方法 正在上传… 重…

K8S实践:非常实用kubectl的别名工具推荐,助你高效工作

转载至我的博客 &#xff0c;公众号&#xff1a;架构成长指南 大家好&#xff0c;我是蜗牛哥&#xff0c;今天介绍一款k8s的别名工具&#xff0c;可以让你高效工作&#xff0c;下面是相关介绍 介绍 我们在管理 Kubernetes集群和执行指定任务是比较复杂和费时的。但是如果使用…

益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康

撰文 | 宋文法 肠道菌群&#xff0c;是人体不可分割的组成部分&#xff0c;生活在我们肠道内的数万亿细菌对健康起着重要作用&#xff0c;它们影响着人的新陈代谢、消化能力、抵御感染、控制人体对药物的反应&#xff0c;甚至还能预防某些癌症。 非酒精性脂肪肝病&#xff0c;是…

虚幻UE 材质-纹理 1

本篇笔记主要讲两个纹理内的内容&#xff1a;渲染目标和媒体纹理 媒体纹理可以参考之前的笔记&#xff1a;虚幻UE 媒体播放器-视频转成材质-播放视频 所以本篇主要讲两个组件&#xff1a;场景捕获2D、场景捕获立方体 两个纹理&#xff1a;渲染目标、立方体渲染目标 三个功能&am…

构建高效学习平台:企业培训系统源码深度解析

企业培训系统是组织中培养和提升员工技能的核心工具。本文将深入探讨企业培训系统的源码&#xff0c;通过关键技术代码解析&#xff0c;揭示其中的设计原理和功能实现&#xff0c;以构建更高效的学习平台。 1. 环境配置与依赖项安装 首先&#xff0c;让我们关注源码的环境配…

Vue3:Axios配置及使用

Axios官方 一、安装&#xff1a; //使用 npm: $ npm install axios//使用 bower: $ bower install axios//使用 yarn: $ yarn add axios 在package-lock.json文件可以查看axios版本 二、配置&#xff1a; milliaAxios.js 配置axios import axios from axios // 创建一个 ax…

AI老照片修复-Bringing-Old-Photos-Back-to-Life

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI老照片修复原理-…

AP5153 低压差 线性降压恒流IC 手电筒LED电源驱动

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

怎么修改照片尺寸?来分享3款实用的工具!

在当今的自媒体时代&#xff0c;照片是吸引读者眼球的重要元素之一。有时候&#xff0c;我们需要在不同的平台上传照片&#xff0c;但不同的平台对照片的尺寸要求却不尽相同。为了满足这些要求&#xff0c;我们经常需要修改照片的尺寸。那么&#xff0c;如何快速、准确地修改照…

Linux内核之红黑树详解(2)

该博客结合了维基百科、博客和一些其他的资料&#xff0c;按照理解整理的&#xff0c;如有错误&#xff0c;欢迎指正。 1、创建红黑树&#xff1a; 在实现插入、删除等操作之前&#xff0c;需要先创建一棵红黑树&#xff0c;返回的是红黑树的根结点&#xff1a; RBRoot* crea…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑤

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷5 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷5 模块一 …

《MyBatis》--多数据源使用实现--超级详细!!!!

阿丹-需求/场景&#xff1a; 在项目中可能要使用到几个数据源&#xff0c;所以本文章解决一个项目中多个数据源的方式。使用简单的配置和注解来实现。 适用于在确定的数据源的场景下。 实现&#xff1a; 三个核心&#xff1a; 构造DataSource、SqlSessionFactory、SqlSessio…

TS 36.322 V12.0.0-过程

​本文的内容主要涉及TS 36.322&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

机器之心 AI 技术--人工智能助力个性化视频实战经验分享(文末送书)

【清华社&机器之心】视频生成前沿研究与应用特别活动 在视频生成即将迎来技术和应用大爆发之际&#xff0c;为了帮助企业和广大从业者掌握技术前沿&#xff0c;把握时代机遇&#xff0c;机器之心AI论坛就将国内的视频生成技术力量齐聚一堂&#xff0c;共同分享国内顶尖力量…

100V耐压 LED恒流驱动芯片 SL2516D兼容替换LN2516车灯照明芯片

SL2516D LED恒流驱动芯片是一款专为LED照明设计的高效、高精度恒流驱动芯片。与LN2516车灯照明芯片兼容&#xff0c;可直接替换LN2516芯片&#xff0c;为LED车灯照明提供稳定、可靠的电源解决方案。 一、SL2516D LED恒流驱动芯片的特点 1. 高效率&#xff1a;SL2516D采用先进的…

【OpenCV学习笔记06】- 制作使用轨迹条控制的调色板

内容 学习将轨迹栏绑定到 OpenCV 窗口。你将学习这些函数&#xff1a;cv.getTrackbarPos(), cv.createTrackbar() 等等。 调色板代码 这里&#xff0c;我们将创建用以显示指定颜色的简单程序。 你有一个显示颜色的窗口和三个轨迹栏&#xff0c;用来指定 B&#xff0c;G&…

师傅带练|在线实习项目,提供实习证明

八大项目&#xff1a;某实习网站招聘信息采集与分析&#xff08;Python数据采集与分析&#xff09; 股票价格形态聚类与收益分析&#xff08;Python金融分析&#xff09; 某平台网络入侵用户自动识别&#xff08;Python机器学习&#xff09; 某平台广东省区采购数据分析&…

信号-进程间通信

信号 1. 信号概述 在 Linux 操作系统中&#xff0c;信号是一种进程间通信的机制&#xff0c;用于通知进程发生了某个事件。信号可以由内核、其他进程&#xff0c;或者进程自身发送。每个信号都对应一个特定的事件或异常&#xff0c;例如进程终止、CtrlC 中断等。 本质上是一…

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验&#xff1a;https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程&#xff1a;https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中&#xff0c;有效地管理日常任务对于提高生…

【makedown自带语法技巧】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…