FPGA基础入门【13】开发板USB键盘控制,教你做硬核键盘侠

FPGA纯逻辑实现USB设备:低成本、全功能开源方案详解 USB(通用串行总线)是连接计算机与外部设备的主流接口标准,其核心原理在于通过标准化的协议实现主机与设备间的数据交换与控制。在嵌入式系统开发中,为FPGA项目添加USB通信功能通常需要外接专用芯片或使用集成PHY的高端FPGA,这增加了硬件成本与设计复杂度。开源项目“FPGA-USB-Device”提供了一种创新的技术方案,它利用FPGA的可编程逻辑资源,在内部直接实现了完整的USB 1.1全速设备控制器。该方案将复杂的USB协议栈,包括物理层信号处理、数据链路层打包以及事务管理,全部用Verilog硬件描 阅读详情
AI摘要

本教程讲解如何使用FPGA开发板实现USB键盘控制,包括键盘控制信号解析、逻辑设计及代码实现,通过实例演示如何读取键盘扫描码并转换为ASCII字符。

上一篇教程挖了个USB键盘的坑,这一篇来填它,教你做硬核键盘侠

FPGA基础入门【13】开发板USB键盘控制

键盘控制信号

和USB接口有关的引脚连接和PS/2接口协议在上一篇教程介绍过,这里重复一次:
PS/2 Control

connection
具体可以参考NEXYS 4开发板文档

时钟信号和数据信号都是双向的,没人去驱动它们的时候就被电阻拉高成高电平。

接收键盘传来的数据相对简单,host保持侦测时钟和数据,当时钟Clock的下降沿时,侦测到数据Data也拉低,代表一个数据包传送出来,之后的10个时钟下降沿,分别收到从最低位LSB到MSB的八位数据,1位的奇偶校验(1表示八位数据中1的位数为偶数,0是奇数),最后1位高电平表示数据包结束。

PS2 detail
从Host发送指令到键盘的步骤如下

  1. 一般时钟Clock信号都是由键盘驱动的,只有Host发送指令出去的时候要拉低一次,就是标为1的位置,Host驱动时钟成低电平,并保持大约60us
  2. 在时钟拉低时,也就是标为2的位置,把数据Data信号也拉低
  3. 60us结束后把时钟Clock信号的控制权交回,开启侦测时钟,这时键盘侦测到标为3的时钟上升沿,数据Data位0,准备接受指令
  4. 键盘开始驱动时钟Clock,每个上升沿读取一位数据,Host可以在侦测到时钟下降沿时把数据位准备好,数据包顺序和读取时一样,1位起始低电位,8位LSB到MSB数据,1位奇偶校验,1位结尾高电位
  5. 把数据Data信号控制权交还

键盘

对键盘来说,它用的是扫描码,每个按键对应一个代码,当一个按键被按下,每100ms会重复发送一次;当这个按键被松开,一个0xF0被发出,跟着是那个被松开的按键。那些可以被shift的按键,比如大小写字母和可以代表符号的数字键,它的扫描码后面会跟着shift码,FPGA需要根据这个来决定用哪个ASCII字符。有些按键,比如Ctrl和Alt被按下时,会在扫描码前先发一个E0,当它们被松开时,会发E0 F0,并跟随着相应按键的扫描码。

这部分比较复杂,需要写相应代码来确定使用哪个ASCII码,相应按键的扫描码如下:
keyboard
有一个网站把这部分写的比较清楚:PS2 controller
其中就包含了一张键盘字符表,每个按键KEY都有对应按下(MAKE)的代码,和松开(BREAK)的代码:
character table

键盘的一些其他特殊指令如下,我们可以用Echo回声测试指令,看键盘是否会返回相应数据
keyboard command

逻辑设计

这个逻辑结构计划基本照搬上一篇教程中用串口控制USB鼠标的逻辑,因为两者用的都是PS/2控制协议,只需要调用之前写的ps2_transmitter.v,并对顶层做少量的修改即可。

修改后的顶层代码usb_keyboard.v如下:
引脚基本不变,只是去掉了不必要的LED

module usb_keyboard(
    input             clk,
    input             rst,
    
    // UART port
    inout             USB_CLOCK,
    inout             USB_DATA,
    
    // UART port
    input             RXD,
    output reg        TXD,
    output reg        CTS,
    input             RTS
);

// USB ports control
wire   USB_CLOCK_OE;
wire   USB_DATA_OE;
wire   USB_CLOCK_out;
wire   USB_CLOCK_in;
wire   USB_DATA_out;
wire   USB_DATA_in;
assign USB_CLOCK = (USB_CLOCK_OE) ? USB_CLOCK_out : 1'bz;
assign USB_DATA = (USB_DATA_OE) ? USB_DATA_out : 1'bz;
assign USB_CLOCK_in = USB_CLOCK;
assign USB_DATA_in = USB_DATA;

wire       PS2_valid;
wire [7:0] PS2_data_in;
wire       PS2_busy;
wire       PS2_error;
wire       PS2_complete;
reg        PS2_enable;
(* dont_touch = "true" *)reg  [7:0] PS2_data_out;

PS2控制模块不变

// Controller for the PS2 port
// Transfer parallel 8-bit data into serial, or receive serial to parallel
ps2_transmitter ps2_transmitter(
    .clk(clk),
    .rst(rst),
    
    .clock_in(USB_CLOCK_in),
    .serial_data_in(USB_DATA_in),
    .parallel_data_in(PS2_data_in),
    .parallel_data_valid(PS2_valid),
    .busy(PS2_busy),
    .data_in_error(PS2_error),
    
    .clock_out(USB_CLOCK_out),
    .serial_data_out(USB_DATA_out),
    .parallel_data_out(PS2_data_out),
    .parallel_data_enable(PS2_enable),
    .data_out_complete(PS2_complete),
    
    .clock_output_oe(USB_CLOCK_OE),
    .data_output_oe(USB_DATA_OE)
);

串口输出逻辑不变,一样是把PS/2收到的8位数转化成2个十六进制符号传回,并且把PC端输出的指令传回

// Output the data to uart
reg [15:0] tx_count;
reg [19:0] tx_shift;
reg [19:0] CTS_delay;

always @(posedge clk or posedge rst) begin
    if(rst) begin
        tx_count <= 16'd0;
        TXD <= 1'b1;
		tx_shift <= 20'd0;
        CTS <= 1'b1;
        CTS_delay <= 20'hFFFFF;
    end
    // When get data from PS2, transfer and buffer it into register
    else if(PS2_valid) begin
        case(PS2_data_in[3:0])
        4'h0: begin tx_shift[9:0] <= 10'b0000011001; end
        4'h1: begin tx_shift[9:0] <= 10'b0100011001; end
        4'h2: begin tx_shift[9:0] <= 10'b0010011001; end
        4'h3: begin tx_shift[9:0] <= 10'b0110011001; end
        4'h4: begin tx_shift[9:0] <= 10'b0001011001; end
        4'h5: begin tx_shift[9:0] <= 10'b0101011001; end
        4'h6: begin tx_shift[9:0] <= 10'b0011011001; end
        4'h7: begin tx_shift[9:0] <= 10'b0111011001; end
        4'h8: begin tx_shift[9:0] <= 10'b0000111001; end
        4'h9: begin tx_shift[9:0] <= 10'b0100111001; end
        4'hA: begin tx_shift[9:0] <= 10'b0100000101; end
        4'hB: begin tx_shift[9:0] <= 10'b0010000101; end
        4'hC: begin tx_shift[9:0] <= 10'b0110000101; end
        4'hD: begin tx_shift[9:0] <= 10'b0001000101; end
        4'hE: begin tx_shift[9:0] <= 10'b0101000101; end
        4'hF: begin tx_shift[9:0] <= 10'b0011000101; end
        endcase
        
        case(PS2_data_in[7:4])
        4'h0: begin tx_shift[19:10] <= 10'b0000011001; end
        4'h1: begin tx_shift[19:10] <= 10'b0100011001; end
        4'h2: begin tx_shift[19:10] <= 10'b0010011001; end
        4'h3: begin tx_shift[19:10] <= 10'b0110011001; end
        4'h4: begin tx_shift[19:10] <= 10'b0001011001; end
        4'h5: begin tx_shift[19:10] <= 10'b0101011001; end
        4'h6: begin tx_shift[19:10] <= 10'b0011011001; end
        4'h7: begin tx_shift[19:10] <= 10'b0111011001; end
        4'h8: begin tx_shift[19:10] <= 10'b0000111001; end
        4'h9: begin tx_shift[19:10] <= 10'b0100111001; end
        4'hA: begin tx_shift[19:10] <= 10'b0100000101; end
        4'hB: begin tx_shift[19:10] <= 10'b0010000101; end
        4'hC: begin tx_shift[19:10] <= 10'b0110000101; end
        4'hD: begin tx_shift[19:10] <= 10'b0001000101; end
        4'hE: begin tx_shift[19:10] <= 10'b0101000101; end
        4'hF: begin tx_shift[19:10] <= 10'b0011000101; end
        endcase
        
        CTS_delay <= 20'h00000;
    end
    // When receiving data, output the same thing in the meantime
    else if((~RXD) || rx_start) begin
        TXD <= RXD;
        CTS <= 1'b0;
    end
    // Shift out the received data
    else begin
		if(tx_count < 16'd867) begin
			tx_count <= tx_count + 16'd1;
		end
		else begin
			tx_count <= 16'd0;
		end
		
		if(tx_count == 16'd0) begin
			TXD <= tx_shift[19];
			tx_shift <= {tx_shift[18:0], 1'b1};
            CTS <= CTS_delay[19];
            CTS_delay <= {CTS_delay[18:0], 1'b1};
		end
    end
end

把用来控制鼠标的指令修改一下,0是复位指令0xFF,1是LED等配置0xED,用来控制键盘上大写锁定、滚动锁定、小键盘锁定LED,跟随着2的最低3位分别指定这三个LED都亮起,3是回声测试0xEE,4是重传指令0xFE

// Input from uart
(* dont_touch = "true" *)reg [7:0]  RXD_delay;
reg [15:0] rx_count;
(* dont_touch = "true" *)reg [3:0]  rx_bit_count;
reg        rx_start;

always @(posedge clk or posedge rst) begin
    if(rst) begin
        RXD_delay <= 8'h00;
        rx_count <= 16'd0;
        rx_bit_count <= 4'd0;
        PS2_enable <= 1'b0;
        rx_start <= 1'b0;
    end
    else if(~RTS) begin
        if(rx_count < 16'd867) begin
			rx_count <= rx_count + 16'd1;
		end
		else begin
			rx_count <= 16'd0;
		end
        
        if( (rx_count == 16'd0) && (~RXD) && (~rx_start) ) begin
            RXD_delay <= 8'h00;
            rx_bit_count <= 4'd0;
            rx_start <= 1'b1;
        end
        else if( (rx_count == 16'd0) && rx_start && (rx_bit_count != 4'd8)) begin
            rx_bit_count <= rx_bit_count + 4'd1;
            RXD_delay <= {RXD_delay[6:0], RXD};
        end
        else if( (rx_count == 16'd0) && rx_start) begin
            rx_start <= 1'b0;
            rx_bit_count <= 4'd0;
            PS2_enable <= 1'b1;
            case(RXD_delay[7:0])
            8'b00001100: begin PS2_data_out <= 8'hFF; end // Reset
            8'b10001100: begin PS2_data_out <= 8'hED; end // Set status LED
            8'b01001100: begin PS2_data_out <= 8'h07; end // LED byte
            8'b11001100: begin PS2_data_out <= 8'hEE; end // Echo
            8'b00101100: begin PS2_data_out <= 8'hFE; end // Resend
            default: begin PS2_data_out <= 8'hEE; end
            endcase
        end
        else begin
            PS2_enable <= 1'b0;
        end
    end
end

endmodule

编译烧写测试

由于代码是基于上一篇USB鼠标的教程,已经实际测试过,因此这里跳过仿真步骤,如果需要的话可以仿照前几篇教程中的仿真进行。

在Vivado中新建名为usb_keyboard的工程,选择NEXYS 4 DDR 作为配置,并加入修改好的顶层代码usb_keyboard.v和上一篇教程中写好的ps2_transmitter.v。

加入由官方约束文件NEXYS4.xdc修改成的引脚约束文件usb_keyboard.xdc:

## This file is a general .xdc for the Nexys4 DDR Rev. C
## To use it in a project:
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project

## Clock signal
set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports clk]
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]


##Switches

set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports rst]


##USB HID (PS/2)

set_property -dict {PACKAGE_PIN F4 IOSTANDARD LVCMOS33} [get_ports USB_CLOCK]
set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports USB_DATA]

##USB-RS232 Interface

set_property -dict {PACKAGE_PIN C4 IOSTANDARD LVCMOS33} [get_ports RXD]
set_property -dict {PACKAGE_PIN D4 IOSTANDARD LVCMOS33} [get_ports TXD]
set_property -dict {PACKAGE_PIN D3 IOSTANDARD LVCMOS33} [get_ports CTS]
set_property -dict {PACKAGE_PIN E5 IOSTANDARD LVCMOS33} [get_ports RTS]

开始编译综合生成bitstream,为开发板连上USB烧写线,并烧写进bitstream。复位后打开Putty串口控制窗口,配置方式如下:
uart1
uart2
为开发板上连上USB键盘,如果你只有一个键盘,可以在PC端开启一个虚拟键盘On-Screen Keyboard。先后输入几个指令,看到串口控制窗口如下:
console

  • AA是接上键盘后传回的自测试完成信号0xAA
  • 0FAAA,发出0复位指令0xFF,键盘传回0xFA确认Acknowledge,重新自测试并传回自测试完成信号0xAA
  • 1FA2,发出1配置LED指令0xED,键盘返回0xFA确认,然后在发出2具体LED信息0x07,最低3位都是1,将全部三个LED都亮起,如下面的图片所示,键盘上两盏LED都亮起,还有一个大写锁定在另一边没拍下来
  • 3EE,发出3回声测试0xEE,键盘返回0xEE
  • 58F058EBF02B3CF03C21F02142F042,“随便”在键盘上打了几个字母,比如0x58是大写锁定,0xF058是松开大写锁定,其他几个字母都可以通过查上方的字符表得到
  • 442,发出4重传指令0xFE,把键盘中最后发出的数据0x42重传了一遍

keyboard

总结

硬核键盘侠教程结束,下一篇讲VGA视频接口控制,不过VGA是给以前的电子管电视机使用的,希望能在下一篇开始前找到一个VGA转HDMI的转接口,不然我手上还真没有能用的VGA显示器。。。

STM32F103C8T6实战:从入门到进阶的完整嵌入式开发指南 嵌入式系统开发中,ARM Cortex-M3内核的单片机长期占据核心地位,其原理涉及GPIO控制、中断管理、外设时序等基础概念。掌握这些底层机制,是构建稳定产品与高效代码的关键。STM32作为主流MCU系列,凭借成熟生态与平衡性能,成为工程师从入门到量产的热门选择。实际项目中,基于HAL库的快速配置、FreeRTOS实时任务调度、LVGL图形界面移植,以及通过ESP01S实现网络通信,均能在小资源芯片上落地。这些技术组合覆盖了智能家居、工业传感、交互终端等广泛场景。围绕经典芯片STM32F103C8T6,系 阅读详情

相关推荐

【雕爷学编程】Arduino 手册之USB Keyboard(鼠标)

Arduino的USB Keyboard(鼠标)是一种利用Arduino的原生USB功能,将其模拟成一个USB键盘或鼠标的方法,可以实现对电脑的控制和输入。但在实际应用中,请注意遵循相关的法律法规,在合法和合理的范围内使用Arduino的USB Keyboard(或鼠标)功能。4)Arduino的USB Keyboard(鼠标)可以使用一些特殊的按键代码,如KEY_LEFT_CTRL, KEY_LEFT_ALT, KEY_RETURN等,来实现一些组合键或功能键的输入。

雕爷学编程 4210

FPGA基础入门【12】开发板USB鼠标控制

FPGA基础入门【11】开发板USB-UART串口通信配置 The Auxiliary Function microcontroller (Microchip PIC24FJ128) provides the Nexys4 DDR with USB Embedded HID host capability. After power-up, the microcontroller is in con...

qimoDIY的博客 2万+

【信息科学与工程学】【控制科学】第十二篇 微型计算机控制技术01

更精确的经典模型:I1在第5周期WB结束,I2最早可在第6周期进入EX,但I2在ID阶段就需要R1,因此I2的ID需在第6周期,而I1的WB在第5周期,所以I2的ID可以紧接在第6周期,但中间仍有一个stall(因为I1的EX结果要等到MEM之后才能转发给ID?有优先级继承后,Task_L被提升优先级,不会被Task_M抢占,阻塞时间缩短为Task_L剩余执行时间(9ms),仍可能超过10ms,但可通过调整任务周期或使用中断处理缓解。电感L=10μH,输出电容C=100μF,ESR=5mΩ。

weixin_49199313的博客 8640

为SoC-FPGA添加TFT显示屏和USB键盘

1.前言 &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; 手里有一块DE1-SoC开发板(导致我吃了八百个月的土),按照友晶的培训手册和小梅哥的《基于Cyclone V SoC FPGA的嵌入式系统设计教程》初步搭建起了SoC-FPGA平台,并且在上面跑了一些简单的例程。 &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp

Verdvana的博客 2663

FPGA 键盘实现

我是做FPGA的,正在学习中,这次做的是一个基于vivado编写的在basys3开发板上实现键盘控制数码管显示的实验

FPGA基础入门-开发板USB键盘控制工程文件

与教程--FPGA基础入门【13】开发板USB键盘控制,教你做硬核键盘侠--相应的源代码。 根目录包含: 1. 相关文档,nexys4ddr_rm.pdf是开发板文档;PS2Mouse.pdf是介绍PS2接口的文档 2. src/包含所有源代码 3. usb_keyboard/包含Vivado 工程文件,其中的bit文件可以直接用来烧写开发板

32键简易电子琴

基于nexys4 ddr开发板,在vivado 2019.2环境下,编写verilog语言实现32键简易电子琴。主要介绍原理。

to_pu2h的博客 1513

FPGA+USB68013 HID键盘模拟

FPGA+USB68013 HID键盘模拟 通过FPGA来模拟键盘 在硬件平台上已实现,altera环境,verilog语言

FPGA学习—按键控制

FPGA学习系列

m0_51703925的博客 3919

基于FPGA的键盘鼠标的源代码.

基于FPGA的键盘鼠标的源代码.基于FPGA的键盘鼠标的源代码.

基于Nexys4开发板的电子琴设计说明1

1. 项目内容概括:利用 PS/2 键盘、音响和 Nexys4 开发板完成一架电子琴的设 2. 键位设置:采用 3 组全音阶,即加入半音,模拟电子琴的黑白键 3

接口芯片设计实战:从物理层到量产稳定的硬核要点

接口芯片是嵌入式系统设备互联互通的物理基石,其本质是模拟与数字混合的信号链器件。理解I²C的总线电容约束、SPI的CS时序容限、USB的眼图质量要求、RS-485的终端匹配原理以及CAN的地偏移抗扰机制,是保障通信可靠性的前提。这些技术细节直接决定信号完整性、EMC兼容性与宽温域稳定性,进而影响工业控制、车载电子、智能终端等场景的量产良率与长期可靠性。本文聚焦接口芯片在真实PCB环境下的电气行为、参数漂移规律与验证方法,覆盖I²C上拉电阻选型、USB共模噪声抑制、CAN FD时序收敛等高频工程痛点,为硬件工

weixin_33842304的博客 356

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

Xilinx FPGA PCIe | XDMA IP 核 / 应用 / 测试 / 实践

……

u013669912的博客 7941

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6264

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

树莓派周末实战:38个项目从入门到专家分级指南

嵌入式开发和物联网实践中,快速验证硬件与软件协同是核心挑战。树莓派作为低成本Linux开发板,凭借丰富GPIO接口和成熟生态,成为工程师和爱好者从零构建原型的首选平台。其技术价值在于:通过传感器读取、协议通信(如MQTT)和轻量级部署(如Docker),开发者能在短时间完成从物理信号到云端服务的完整链路,从而深入理解嵌入式系统原理。典型应用场景涵盖家庭自动化、远程监控、边缘AI推理等,这些项目不仅驱动真实需求,还能有效提升工程调试能力。然而,项目选型不当常导致业余时间被浪费。本文整理了一份聚焦周末可完成的3

weixin_33834910的博客 208

LVGL在RTOS下的线程安全实践:从卡死到流畅的界面切换

本文探讨LVGL在RTOS环境下的线程安全实践,重点分析FreeRTOS多任务同步机制,包括互斥锁、任务通知和消息队列方案。通过实际案例展示如何避免界面卡顿和系统死锁,实现从卡死到流畅的界面切换,为嵌入式GUI开发提供可靠的适配解决方案。

uran的专栏 1113

串口通信七关节实战指南:从UART帧结构到RS-485抗干扰

串口通信是嵌入式系统与工控设备最基础的物理层交互方式,其核心在于UART异步传输机制与RS-232/RS-485等电平标准的协同实现。理解帧格式(起始位、数据位、校验位、停止位)和波特率误差容限(±2.5%),是保障字节流可靠收发的前提;而TTL电平适配、RS-485差分抗扰、硬件流控(RTS/CTS)等设计选择,则直接决定长距离、强干扰场景下的通信鲁棒性。本文聚焦产线级实操经验,覆盖示波器波形分析、自动波特率检测、环回测试等调试方法,帮助工程师快速定位‘乱码’‘丢包’‘无响应’等高频问题,适用于单片机开发

weixin_34005042的博客 344

paddle 43 用onnxruntime实现ppyoloe模型的部署(含python和c++版本)

PP-YOLOE+是PP-YOLOE模型的升级版,PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比。paddle官方只给出了基于paddle框架的部署案例,为了更好的部署,为此实现将paddle模型转换为onnx模型,然后在python下实现onnxruntime部署。后续会补充c++ onnxruntime部署

a486259的博客 1915

YOLOv11【第三章:高阶应用与落地篇·第1节】一文搞懂,YOLOv11-Seg 实例分割:Mask 原型生成与系数预测原理解析!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1249

AI芯片选型新标准:能效比TOPS/W取代主频

在AI推理加速场景中,传统CPU主频已无法反映真实性能——它衡量单线程节奏,却忽视数据搬运瓶颈与功耗约束。真正决定边缘智能落地效果的是能效比(TOPS/W),即每瓦特功耗所能提供的INT8级万亿次运算能力。该指标融合了计算单元并行度、内存带宽利用率、片上缓存效率及硬件编译器优化水平,直接关联设备续航、散热设计与BOM成本。尤其在手机、无人机、工业相机等供电与空间受限场景中,高TOPS/W意味着更低发热、更长续航与更高部署密度。本文聚焦AI芯片能效比的本质定义、实测方法与避坑要点,帮助工程师摆脱厂商宣传陷阱,

weixin_34268843的博客 354

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 137

【亲测免费】 FPGA-USB-Device 项目教程

``` FPGA-USB-Device/ ├── RTL/ │ ├── fpga_examples/ │ │ ├── fpga_top_usb_audio.v │ │ ├── fpga_top_usb_camera.v │ │ ├── fpga_top_usb_disk.v │ │ ├── fpga_top_usb_keyboard.v │ │ ├── ...

gitblog_01047的博客 980

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》(Semiconductor devices - Discrete devices - Part 8: Field-effect transistors)。该标准详细规定了场效应晶体管(FETs)的测试方法,涵盖静态和动态特性测试,适用于多种类型的FET,包括结型场效应晶体管(JFETs)、绝缘栅场效应晶体管(MOSFETs,增强型和耗尽型)等。3. 标准其他部分(简要概述)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 576

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Windows】外接USB键盘报“无法找到驱动”——手动指定驱动

记录和分享一次笔记本外接USB键盘时,报“无法找到驱动”的解决过程(win7系统): 1、检查硬件是否损坏: (1)usb鼠标/键盘在其它电脑上是否能正常使用 ----可以 (2)电脑的usb接口是否能正常使用 ----可以 2、在“设备和打印机”中手动为设备指定驱动(人体学输入设备-usb输入设备) (1)“设备和打印机”--设备属性--硬件属性 (2)驱动程序--更新驱动程序 (3)选择“浏览计算机以查找驱动程序软件”--从计算机的设备软件程序列表中选择--人体学输入设备--...

喜东东的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: FPGA基础入门【12】开发板USB鼠标控制
下一篇: FPGA基础入门【14】开发板VGA视频输出控制
起魔
博客等级 码龄8年 557粉丝 25原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值