数字逻辑设计大程——以撒的结合(Verilog语言)
前言
在大二学习数字逻辑设计课程(即计算机组成课程的前引课)时,期末大程题目我和同组的github成员lwaekfjlk 决定写一款基于Verilog语言的游戏。原型是我们两人都非常喜爱的一款游戏——The Binding of Isaac: Rebirth。在三天三夜的奋战后,基本完成了预期目标。由于亲自编写了其中种种,我们深知新手初期使用Verilog语言有多困难。而可悲的是,这又是之后计算机组成课程和体系结构课程所需的!因此,我们将top部分源码放在这里,供同袍们参考。若想引用还请注明出处。
代码部分
/top模块`timescale 1ns / 1psmodule Top(input ps2_clk, //键盘时钟input ps2_data, //键盘数据input clk, //整体时钟input rstn, //复位按钮input [15:0]SW,//代表的是FPGA板上的按钮output hs, //VGAC的outputoutput vs, //VGAC的outputoutput [3:0] r, //VGAC的output代表的是一个(x,y)坐标处对应的RGB元素output [3:0] g,output [3:0] b,//demo中本身就有的输出,包括FPGA板上LED灯的输出output SEGLED_CLK,output SEGLED_CLR,output SEGLED_DO,output SEGLED_PEN,output LED_CLK,output LED_CLR,output LED_DO,output LED_PEN,inout [4:0]BTN_X,//代表按钮的X坐标和Y坐标inout [3:0]BTN_Y,output buzzer,//代表蜂鸣器的输出output reg [31:0] clkdiv,output reg [31:0] score);/reg [10:0] seed;initial beginseed <= 10'b1010100101;endalways@(posedge clk)beginseed <= seed ^ (~((seed>>1)));end//reg [31:0]clkdiv;//31位的一个数字,代表的是当前的时钟always@(posedge clk) beginclkdiv <= clkdiv + 1'b1;end
/assign buzzer = 1'b1;//设置蜂鸣器变量为1/wire [15:0] SW_OK;//代表的是防抖模块的输出按钮信号AntiJitter #(4) a0[15:0](.clk(clkdiv[15]), .I(SW), .O(SW_OK));//调用防抖模块wire [31:0] segTestData;wire [3:0]sout; Seg7Device segDevice(.clkIO(clkdiv[3]),.clkScan(clkdiv[15:14]),.clkBlink(clkdiv[25]),.data(score),.point(8'h0), .LES(8'h0),.sout(sout));//反正这部分必须有,因为这几个wire变量是整个程序的output端口assign SEGLED_CLK = sout[3];assign SEGLED_DO = sout[2];assign SEGLED_PEN = sout[1];assign SEGLED_CLR = sout[0];///VGA的总体信息可以这么理解,就是一个一个点的像素数据进行串行输入,然后每个时钟周期处理一个点的数据的显示,得到最终屏幕上的串行输出。由于时钟周期非常快所以一遍一遍地一个点一个点处理我们人眼是看不出来的wire [11:0] vga_data;//代表想要使用VGAC模块处理所需要的数据输入信息wire [11:0] vga_data_1;//代表背景图像IP核所输出的VGA信息wire [19:0] col_addr;//[9:0]代表当前正在处理的那个点的列的坐标wire [19:0] row_addr;//[8:0]代表当前正在处理的那个点的行的坐标wire [18:0] address;//代表输出背景图片时的地址wire [11:0] vga_data_object;//代表物体IP核调用之后产生的VGA信息wire [18:0] address_object;//代表物体的显示地址wire [9:0] data;//代表PS2协议键盘的数据输出wire [9:0] on_hc_1; wire [8:0] on_vc_1; wire [9:0] on_hc_2; wire [8:0] on_vc_2;wire [9:0] on_hc_3;wire [8:0] on_vc_3;wire [9:0] on_hc_4;wire [8:0] on_vc_4;wire [9:0] on_hc_5;wire [8:0] on_vc_5;wire [9:0] on_hc_6;wire [8:0] on_vc_6;wire [9:0] on_hc_7;wire [8:0] on_vc_7;wire [9:0] on_hc_8;wire [8:0] on_vc_8;wire [9:0] on_hc_9;wire [8:0] on_vc_9;wire [9:0] on_hc_10;wire [8:0] on_vc_10;wire [9:0] on_hc_11;wire [8:0] on_vc_11;wire [9:0] on_hc_12;wire [8:0] on_vc_12;reg [6:0] blood;reg [9:0] col_temp_1 ; //remember the col position reg [8:0] row_temp_1 ; //remember the row position reg [9:0] col_temp_2 ; //remember the col position reg [8:0] row_temp_2 ; //remember the row position reg [9:0] tmp_x;reg [9:0] tmp_x2;reg [9:0] tmp_x3;reg [9:0] tmp_x4;reg [9:0] tmp_x5;reg [9:0] tmp_x6;reg [9:0] tmp_x7;reg [9:0] tmp_x8;reg [9:0] tmp_x9;reg [9:0] tmp_x10;reg [8:0] tmp_y;reg [8:0] tmp_y2;reg [8:0] tmp_y3;reg [8:0] tmp_y4;reg [8:0] tmp_y5;reg [8:0] tmp_y6;reg [8:0] tmp_y7;reg [8:0] tmp_y8;reg [8:0] tmp_y9;reg [8:0] tmp_y10;reg [9:0] col_bullet;reg [8:0] row_bullet;reg [9:0] col_bullet2;reg [8:0] row_bullet2;reg [9:0] col_bullet3;reg [8:0] row_bullet3;reg [9:0] col_bullet4;reg [8:0] row_bullet4;reg [9:0] col_bullet5;reg [8:0] row_bullet5;reg [9:0] col_bullet6;reg [8:0] row_bullet6;reg [9:0] col_bullet7;reg [8:0] row_bullet7;reg [9:0] col_bullet8;reg [8:0] row_bullet8;reg [9:0] col_bullet9;reg [8:0] row_bullet9;reg [9:0] col_bullet10;reg [8:0] row_bullet10;reg [2:0] tmp_direction;reg [2:0] tmp_direction2;reg [2:0] tmp_direction3;reg [2:0] tmp_direction4;reg [2:0] tmp_direction5;reg [2:0] tmp_direction6;reg [2:0] tmp_direction7;reg [2:0] tmp_direction8;reg [2:0] tmp_direction9;reg [2:0] tmp_direction10;reg [2:0] direction;reg [2:0] direction1;reg [2:0] direction2;reg [2:0] direction3;reg [2:0] direction4;reg [2:0] direction5;reg [2:0] direction6;reg [2:0] direction7;reg [2:0] direction8;reg [2:0] direction9;reg [2:0] direction10;reg [32:0] cnt;reg [32:0] tmp_time;reg [32:0] tmp_time2;reg [32:0] tmp_time3;reg [32:0] tmp_time4;reg [32:0] tmp_time5;reg [32:0] tmp_time6;reg [32:0] tmp_time7;reg [32:0] tmp_time8;reg [32:0] tmp_time9;reg [32:0] tmp_time10;reg flag1;reg flag2;reg enable;reg enable0;reg enable1;reg enable2;reg enable3;reg enable4;reg enable5;reg enable6;reg enable7;reg enable8;reg enable9;reg enable10;reg changefigure;
// wire[31:0] score;integer t;integer s;integer first;//开始运行的第一次使用初始化标记initial beginfirst = 1;endassign on_vc_1 = row_temp_1;//remember the row position assign on_hc_1 = col_temp_1;//remember the col position assign on_vc_2 = row_temp_2;//remember the row position assign on_hc_2 = col_temp_2;//remember the col position assign on_vc_3 = row_bullet;assign on_hc_3 = col_bullet;assign on_vc_4 = row_bullet2;assign on_hc_4 = col_bullet2;assign on_vc_5 = row_bullet3;assign on_hc_5 = col_bullet3;assign on_vc_6 = row_bullet4;assign on_hc_6 = col_bullet4;assign on_vc_7 = row_bullet5;assign on_hc_7 = col_bullet5;assign on_vc_8 = row_bullet6;assign on_hc_8 = col_bullet6;assign on_vc_9 = row_bullet7;assign on_hc_9 = col_bullet7;assign on_vc_10 = row_bullet8;assign on_hc_10 = col_bullet8;assign on_vc_11 = row_bullet9;assign on_hc_11 = col_bullet9;assign on_vc_12 = row_bullet10;assign on_hc_12 = col_bullet10;vgac v0 (.vga_clk(clkdiv[1]),//当前的VGA独立时钟通道.clrn(SW_OK[0]), //即为我需要拨动的按钮.d_in(vga_data), //输入的时一个12位的数,每四位代表B,G,R,也就是说代表了输入显示模块的这个像素的RGB信息.row_addr(row_addr[8:0]), //代表了当前VGAC模块正在处理的像素单元的横纵坐标,行最多有2^8,列最多有2^9.col_addr(col_addr[9:0]), .r(r), //这下面都是VGAC模块的输出,r,g,b代表的是显示屏上一个像素点的输出.g(g), .b(b), .hs(hs), //这个代表的是经过VGAC模块处理之后的频幕上的像素位置.vs(vs));vgaRGB v1(.rgb_clk(clkdiv[1]),.vc(row_addr),.hc(col_addr),.on_vc_1(on_vc_1),.on_hc_1(on_hc_1),.on_vc_2(on_vc_2),.on_hc_2(on_hc_2),.on_vc_3(on_vc_3),.on_hc_3(on_hc_3),.on_vc_4(on_vc_4),.on_hc_4(on_hc_4),.on_vc_5(on_vc_5),.on_hc_5(on_hc_5),.on_vc_6(on_vc_6),.on_hc_6(on_hc_6),.on_vc_7(on_vc_7),.on_hc_7(on_hc_7),.on_vc_8(on_vc_8),.on_hc_8(on_hc_8),.on_vc_9(on_vc_9),.on_hc_9(on_hc_9),.on_vc_10(on_vc_10),.on_hc_10(on_hc_10),.on_vc_11(on_vc_11),.on_hc_11(on_hc_11),.on_vc_12(on_vc_12),.on_hc_12(on_hc_12),.sw(SW_OK[15]),.vga_data(vga_data),.blood(blood),.changefigure(changefigure),.first(first));//use the vgaRGB block ps2_ver2 ps2(.clk(clk),.rst(),.ps2_clk(ps2_clk),.ps2_data(ps2_data),.data_out(data),.ready());//use the ps2_ver2 block //对位置参数进行修改always @(posedge clkdiv[10]) begin if (blood == 0) beginfirst = 1;endif (data[7:0]==8'h5A && data[8] == 0 && first == 1) begincol_temp_1 <= 320; row_temp_1 <= 240; col_temp_2 <= 100; row_temp_2 <= 100; col_bullet <= col_temp_1+15;row_bullet <= row_temp_1+15;col_bullet2 <= col_temp_1+15;row_bullet2 <= row_temp_1+15;col_bullet3 <= col_temp_1+15;row_bullet3 <= row_temp_1+15;col_bullet4 <= col_temp_1+15;row_bullet4 <= row_temp_1+15;col_bullet5 <= col_temp_1+15;row_bullet5 <= row_temp_1+15;col_bullet6 <= col_temp_1+15;row_bullet6 <= row_temp_1+15;col_bullet7 <= col_temp_1+15;row_bullet7 <= row_temp_1+15;col_bullet8 <= col_temp_1+15;row_bullet8 <= row_temp_1+15;col_bullet9 <= col_temp_1+15;row_bullet9 <= row_temp_1+15;col_bullet10 <= col_temp_1+15;row_bullet10 <= row_temp_1+15;first = 0; direction1 <= 0;direction2 <= 0;direction3 <= 0;direction4 <= 0;direction5 <= 0;direction6 <= 0;direction7 <= 0;direction8 <= 0;direction9 <= 0;direction10 <= 0;direction <= 0;cnt <= 0;flag1 <= 0;flag2 <= 0;enable <= 1;enable1 <= 1;enable2 <= 1;enable3 <= 1;enable4 <= 1;enable5 <= 1;enable6 <= 1;enable7 <= 1;enable8 <= 1;enable9 <= 1;enable10 <= 1;changefigure = 0;blood <= 20;score <= 10;end//位置的初始化if (first == 1) begin end cnt <= cnt +1;//控制玩家1if (data[7:0]==8'h1c && data[8] == 0 ) begin if (col_temp_1 > 60 && col_temp_1 < 400) begin//这里的480并不是搞错了而是为了让子弹不出现bugif (cnt % 1000 == 0) col_temp_1 <= col_temp_1 - 3; direction <= 0;//左endelse begincol_temp_1 <= 62;direction <= 0;endend if (data[7:0]==8'h23 && data[8] == 0) begin if (col_temp_1 > 60 && col_temp_1 < 410)begin//这里的480并不是搞错了而是为了让子弹不出现bugif (cnt % 1000 == 0) col_temp_1 <= col_temp_1 + 3; direction <= 1;//右endelse begincol_temp_1 <= 400;direction <= 1;endend if (data[7:0]==8'h1d && data[8] == 0) begin if(row_temp_1 > 60 && row_temp_1 < 400)beginif (cnt % 1000 == 0) row_temp_1 <= row_temp_1 - 3; direction <= 2;//上endelse beginrow_temp_1 <= 70;direction <= 2;endend if (data[7:0]==8'h1b && data[8] == 0 ) begin if (row_temp_1 > 60 && row_temp_1 < 420)beginif (cnt % 1000 == 0) row_temp_1 <= row_temp_1 + 3; direction <= 3;//下endelse beginrow_temp_1 <= 400;direction <= 3;end end//控制玩家2 if (data[7:0]==8'h6b && data[8] == 0 ) begin if (col_temp_2 > 60 && col_temp_1 < 400)begin//这里的480并不是搞错了而是为了让子弹不出现bugif (cnt % 1000 == 0) col_temp_2 <= col_temp_2 - 1; endelse begincol_temp_2 <= 60;endend if (data[7:0]==8'h74 && data[8] == 0 ) begin if (col_temp_2 > 60 && col_temp_1 < 400)begin//这里的480并不是搞错了而是为了让子弹不出现bugif (cnt % 1000 == 0) col_temp_2 <= col_temp_2 + 1;endelse begincol_temp_2 <= 400;endend if (data[7:0]==8'h75 && data[8] == 0 ) begin if (row_temp_2 > 60 && row_temp_2 < 400)beginif (cnt % 1000 == 0) row_temp_2 <= row_temp_2 - 1; endelse beginrow_temp_2 <= 60;endend if (data[7:0]==8'h72 && data[8] == 0) begin if (row_temp_2 > 60 && row_temp_2 < 400)beginif (cnt % 1000 == 0) row_temp_2 <= row_temp_2 + 1; endelse beginrow_temp_2 <= 400;endend changefigure = 0;//第一个子弹//每一百个时钟周期if (cnt % 2000 == 0) beginif (enable2 == 1) begintmp_y2 <= row_temp_1;tmp_x2 <= col_temp_1;tmp_time2 <= cnt;tmp_direction2 <= direction;enable2 <= 0;//固定子弹的一些初始参数endif (tmp_direction2 == 2) beginrow_bullet2 <= row_bullet2 - 10;endif (tmp_direction2 == 3) beginrow_bullet2 <= row_bullet2 + 10;endif (tmp_direction2 == 0) begincol_bullet2 <= col_bullet2 - 10;endif (tmp_direction2 == 1) begincol_bullet2 <= col_bullet2 + 10;endif (col_bullet2 >= 400 || col_bullet2 <= 0 || row_bullet2 > 400 || row_bullet2 < 0 ||((col_bullet2 - col_temp_2) < 50 && (col_temp_2-col_bullet2 ) > 50 && (row_bullet2 - row_temp_2) < 50 && (row_temp_2 - row_bullet2) > 50) ) begin col_bullet2 <= col_temp_1+15;row_bullet2 <= row_temp_1+15;tmp_direction2 <= direction;changefigure = 1;enable2 <= 1;endif ((col_bullet2 - col_temp_2) < 50 && (col_temp_2-col_bullet2 ) > 50 && (row_bullet2 - row_temp_2) < 50 && (row_temp_2 - row_bullet2) > 50) beginblood <= blood -1;score <= score +1;endend//第二个子弹//每一百个时钟周期else if (cnt % 2000 == 600) beginif (enable == 1) begintmp_y <= row_temp_1;tmp_x <= col_temp_1;tmp_time <= cnt;tmp_direction <= direction;enable <= 0;//固定子弹的一些初始参数endif (tmp_direction == 2) beginrow_bullet <= row_bullet - 7;endif (tmp_direction == 3) beginrow_bullet <= row_bullet + 7;endif (tmp_direction == 0) begincol_bullet <= col_bullet - 7;endif (tmp_direction == 1) begincol_bullet <= col_bullet + 7;endif (col_bullet >= 400 || col_bullet <= 0 || row_bullet > 400 || row_bullet < 0 ||((col_bullet - col_temp_2) < 50 && (col_temp_2-col_bullet ) > 50 && (row_bullet - row_temp_2) < 50 && (row_temp_2 - row_bullet) > 50) ) begin col_bullet <= col_temp_1+15;row_bullet <= row_temp_1+15;tmp_direction <= direction;changefigure = 1;enable <= 1;endif ((col_bullet - col_temp_2) < 50 && (col_temp_2-col_bullet) > 50 && (row_bullet - row_temp_2) < 50 && (row_temp_2 - row_bullet) > 50) beginblood <= blood -1;score <= score +1;endend//让怪兽二随机跑if(cnt % 3000 == 0) beginif (col_temp_2 >= 0 && col_temp_2 <= 400 && row_temp_2>=0 && row_temp_2 <= 400) begin if (col_temp_1 < col_temp_2) begincol_temp_2 <= col_temp_2 - 3 ;endif (col_temp_1 >= col_temp_2) begincol_temp_2 <= col_temp_2 + 3 ;endif (row_temp_1 > row_temp_2) beginrow_temp_2 <= row_temp_2 + 3 ;endif (row_temp_1 <= row_temp_2) beginrow_temp_2 <= row_temp_2 - 3 ;endif (direction == 0 && (row_temp_1 - row_temp_2 < 1 && row_temp_2 - row_temp_1 < 1) && (col_temp_2 < col_temp_1)) begin//左col_temp_2 <= col_temp_2 -1;endif (direction == 1 &&(row_temp_1 - row_temp_2 <1 && row_temp_2 - row_temp_1 < 1) && (col_temp_2 > col_temp_1)) begin//右col_temp_2 <= col_temp_2 +1;endif (direction == 2 &&(col_temp_1 - col_temp_2 < 1 && col_temp_2 - col_temp_1 > 1) && (row_temp_2 < row_temp_1)) begin//上row_temp_2 <= row_temp_2 -1;endif (direction == 3 &&(col_temp_1 - col_temp_2 < 1 && col_temp_2 - col_temp_1 > 1) && (row_temp_1 < row_temp_2)) begin//下row_temp_2 <= row_temp_2 +1;endif (cnt % 300000 == 0)beginif (col_temp_1 < col_temp_2) begincol_temp_2 <= col_temp_2 - 10;endif (col_temp_1 >= col_temp_2) begincol_temp_2 <= col_temp_2 + 10;endif (row_temp_1 > row_temp_2) beginrow_temp_2 <= row_temp_2 + 10;endif (row_temp_1 <= row_temp_2) beginrow_temp_2 <= row_temp_2 - 10;endendif (cnt % 303000 == 0)beginif (col_temp_1 < col_temp_2) begincol_temp_2 <= col_temp_2 - 10;endif (col_temp_1 >= col_temp_2) begincol_temp_2 <= col_temp_2 + 10;endif (row_temp_1 > row_temp_2) beginrow_temp_2 <= row_temp_2 + 10;endif (row_temp_1 <= row_temp_2) beginrow_temp_2 <= row_temp_2 - 10;endendif (cnt % 306000 == 0)beginif (col_temp_1 < col_temp_2) begincol_temp_2 <= col_temp_2 - 10;endif (col_temp_1 >= col_temp_2) begincol_temp_2 <= col_temp_2 + 10;endif (row_temp_1 > row_temp_2) beginrow_temp_2 <= row_temp_2 + 10;endif (row_temp_1 <= row_temp_2) beginrow_temp_2 <= row_temp_2 - 10;endendif (cnt % 309000 == 0)beginif (col_temp_1 < col_temp_2) begincol_temp_2 <= col_temp_2 - 10;endif (col_temp_1 >= col_temp_2) begincol_temp_2 <= col_temp_2 + 10;endif (row_temp_1 > row_temp_2) beginrow_temp_2 <= row_temp_2 + 10;endif (row_temp_1 <= row_temp_2) beginrow_temp_2 <= row_temp_2 - 10;endendendelse if(col_temp_2 < 60 )begincol_temp_2 <= 65;endelse if(col_temp_2 >400)begincol_temp_2 <=350;endelse if(row_temp_2 < 60 )beginrow_temp_2 <= 65 ;endelse if(row_temp_2 >400 )beginrow_temp_2 <= 390;endend if(col_temp_1<col_temp_2+30 && col_temp_1>col_temp_2-30 && row_temp_1<row_temp_2+30 && row_temp_1>row_temp_2-30)beginif(col_temp_2<180 && col_temp_2>40 && row_temp_2<180 && row_temp_2>40)begincol_temp_1 <= 300; row_temp_1 <= 300;endelse begincol_temp_1 <= 100; row_temp_1 <= 100;endif (blood >= 19) blood <= 20;else beginblood <= blood + 2;score <= score - 2;endendend /
//以下是与主板和七段数码管有关的显示部分reg [9:0] x;reg [8:0] y;assign segTestData = {7'b0,x,8'b0,y};wire [15:0] ledData;assign ledData = SW_OK;ShiftReg #(.WIDTH(16)) ledDevice (.clk(clkdiv[3]), .pdata(~ledData), .sout({LED_CLK,LED_DO,LED_PEN,LED_CLR}));
endmodule
后记
完成本次大程后,我们成就感非常高。同时我也得到了一个最大的收获:硬件体系方向不适合我。快跑!
数字逻辑设计大程——以撒的结合(Verilog语言)相关推荐
- 数字逻辑设计大作业-乒乓球游戏模拟器
乒乓球游戏模拟器 前言 设计内容 工作原理 系统方框图 输入输出定义 设计代码 顶层设计文件 核心状态机 分频模块(5hz) 随机数生成 分数处理及显示模块 前言 这是我的数逻大作业,选了一个看起来很 ...
- 【数字逻辑设计】核心知识归纳总结
数字逻辑设计 概述 二进制 组合逻辑设计 时序逻辑设计 SR锁存器 D锁存器 D触发器 四位寄存器 带使能端的触发器 带复位功能的触发器 非稳态电路 同步电路与异步电路 有限状态机 时序逻辑的时序 并 ...
- 【数字逻辑设计】Logisim构建多路选择器
多路选择器在数字逻辑设计中用途广泛,其逻辑表达式是: f = s ′ x 1 + s x 2 f = s'x1 + sx2 f=
- 数字逻辑计算机组成,数字逻辑设计与计算机组成pdf
数字逻辑设计与计算机组成 内容简介 本书从简单的数字逻辑电路设计基础开始,由浅入深,讲解组合逻辑和时序逻辑电路的设计技术.计算机组成的基本原理和计算机体系结构的相关概念,后深入探讨了现代计算机系统如何 ...
- 《数字逻辑设计与计算机组成》一 第2章 2.1 简介
第2章 Digital Logic Design and Computer Organization with Computer Architecture for Security 组合电路:小型设计 ...
- 数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)
文章目录 1.Verilog语言的设计思想和可综合特性 2. 组合电路的设计 2.1 数字加法器 2.2 数据比较器 2.3 数据选择器 2.4 数字编码器 2.4.1 3位二进制8线-3线编码器 2 ...
- 北工大数字逻辑期末大作业
个人所写 有参照(最后一个综合题有错)勿骂(yysy数字逻辑和数逻实验真的太难了 一. 1.在Logisim中打开给定的project.circ . 2.然后,点击"大作业逻辑图" ...
- 数字逻辑学习总结-MOOC数字逻辑设计
目录 ·指令周期 一.数字逻辑基础 1.十进制与原码.反码.补码之间的转换 2.移位 3.操作符 按位与运算 按位或运算 按位异或运算 另外: x|=y; x&=~y 二.逻辑门和逻辑代数 1 ...
- 数字逻辑 设计5000分频器
数字逻辑实验经常会用到分频的功能,接下来我们将设计一个5000分频器. 下面代码由两个进程process组成.第一个process定义一个0~4999的变量,当有clk脉冲的时候,判断如果该变量等于4 ...
最新文章
- linux 读写设备文件,linux-中块设备文件及字符设备文件的本质区别
- 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
- Java设计模式之行为型:访问者模式
- qt checkbox 选中事件_丽声事件 | 十堰市第五届全国青少儿播音主持等级考试圆满落幕...
- Android 实现多个输入框的对话框
- java nio is例子,Java Buffer isDirect()用法及代码示例
- android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base
- mysql master-user_【MySQL】MySQL5.6数据库基于binlog主从(Master/Slave)同步安装与配置详解...
- DataGridView绑定对象数组 c# 1614236580
- JavaScript中this的指向问题及面试题你掌握了吗?
- 《背影》----朱自清
- 在Window10下基于Anaconda安装Tensorflow以及Keras并基于Spyder进行验证
- 学计算机的能看出批图吗,P图P的好,女朋友满街跑,P图先学计算机,清华和这些学校少不了...
- JS URL传中文参数引发的乱码问题
- python购物车代码_(Python基础)简单购物车代码
- mysql grant教程_MySQL的Grant命令详解
- 关于使用实验室服务器的GPU以及跑上TensorFlow代码
- 【IPC】关于码流类型的理解
- usb接口问题折腾记
- 解决微信群服务管理难题,只需要一个助手