一、可综合电路
行为级可综合语法和数据流级语法合在一起被称为RTL级,该级别的模型是可以被综合成电路进而实现的。
1、module 和endmodule 作为模块声明的关键字,必然是可以被综合的。
2、输入input,输出output和双向端口inout的声明是可以被综合的。
3、变量类型reg、wire、integer都是可以被综合的。
4、参数parameter和宏定义define是可以被综合的。
5、所有的Verilog HDL 内建门都是可以使用的。
6、数据流级assign语句是可以被综合的。
7、行为级中敏感列表支持电平和边沿变化,类似posedge、negedge都是可以被综合的。
8、always、funtion是可被综合的,task中若不含延迟也是可被综合的。
9、顺序快begin···end可以被综合
10、if 和case语句可被综合
Verilog HDL中不可被综合的语法如下所示
1、初始话initial结构不可被综合,电路中不会存在这样的单元。电路中一旦通电就会自动获得初始值,除此以外时序电路可以用复位端完成初始化组合电路不需要初始化。
2、#带来的延迟不可综合,电路中同样不会出现这样简单的延迟电路,所有的延迟电路都要通过计时电路或交互信号来完成
3、并行块fork···join不可综合,并行块的语义在电路中不能被转化。
4、用户自定义原语UP不可被综合
5、时间变量time和实数变量real不能被综合
6、wait、event、repeat、forever等行为级语法不可被综合。
7、一部分操作符可能不会被综合,例如除法/操作和求余%操作

二、应用实例(移位除法器器模型)
移位除法器的模型,采用的算法类似于笔算除法,只是变为二进制而不是十进制,由于代码较长,采用层次化的方式进行设计,同时采用循环迭代的方式使用一个电路模块反复运算得到最后的结果。该模块的设计违背了流水的设计,但是大大的减少了面积,时间上会有相应延长。

顶层模块
RTL电路图

//div的顶层代码,其中包含两个子模块,分别是div_ctl用来生成控制信号,div_datapath用来进行迭代计算
module div (clk, reset, start, A, B, D, R, ok, err);
parameter n = 32;
parameter m = 16;input clk, reset, start;
input [n-1:0] A, B;
output [n+m-1:0] D;
output [n-1:0] R;
output ok, err;wire invalid, carry, load, run;div_ctl UCTL(clk, reset, start, invalid, carry, load, run, err, ok);//控制信号
div_datapath UDATAPATH(clk, reset, A, B, load, run, invalid, carry, D, R);//计算迭代信号
endmodule 

div_ctl RTL电路图

状态图

//子模块生成控制信号
module div_ctl(clk, reset, start, invalid, carry, load, run, err, ok);
parameter n = 32;
parameter m = 16;
parameter STATE_INIT = 3'b001;
parameter STATE_RUN = 3'b010;
parameter STATE_FINISH = 3'b100;
input clk, reset, start, invalid, carry;
output load, run, err, ok;
reg load, run, err, ok;
reg [2:0] current_state, next_state;         //当前标志,下一个标志
reg [5:0] cnt;                               //迭代次数标志always @(posedge clk or negedge reset)beginif(!reset)begincurrent_state <= STATE_INIT;cnt <= 0;endelse begincurrent_state <= next_state;if (run) cnt <= cnt + 1'b1;end
endalways @(posedge clk or negedge reset)beginif(!reset)beginerr = 0;endelse if(next_state == STATE_RUN)beginif(invalid) err <= 1;end
endalways @(current_state or start or invalid or carry or cnt)beginload <= 1'b0;ok <= 1'b0;run <= 1'b0;case (current_state)STATE_INIT:beginif(start) next_state <= STATE_RUN;else next_state <= STATE_INIT;load <= 1;endSTATE_RUN:beginrun <= 1;if(invalid) beginnext_state <= STATE_FINISH;endelse if(cnt == (n+m-1))begin                 //迭代47次next_state <= STATE_FINISH;endelse beginnext_state <= STATE_RUN;endendSTATE_FINISH:beginok <= 1;next_state <= STATE_FINISH;enddefault: beginnext_state <= STATE_INIT;endendcase
end
endmodule

div_path RTL电路

//子模块div_dataphth,用来迭代计算
module div_datapath(clk, reset, A, B, load, run, invalid, carry, D, R);
parameter n = 32;
parameter m = 16;
input load, run, clk, reset;
input [n-1:0] A, B;
output invalid, carry;
output [n+m-1:0] D;
output [n-1:0] R;reg carry;
reg [n+n+m-2:0] R0;
reg [m+n-1:0] D;
reg [n-1:0] B0;wire invalid,CO;
wire [n-1:0] DIFF, R;assign R = {carry, R0[n+n+m-2:n+m]};
assign invalid = (B0 == 0);sub sub(R0[n+n+m-2:n+m-1], B0, 1'b0, DIFF, CO);//实例化减法器always @(posedge clk)beginif(load)begin                               //初始阶段D <= 0;R0 <={{(n-1){1'b0}}, A, {m{1'b0}}};B0 <= B;carry <= 1'b0;end else if(run)begin                           //结束阶段if(CO && !carry)beginR0 <= {R0, 1'b0};D <= {D[n+m-2:0], 1'b0};carry <= R0[n+n+m-2];endelse begin                               //迭代阶段R0 <= {DIFF, R0[n+m-2:0], 1'b0};D <= {D[n+m-2:0], 1'b1};carry <= DIFF[n-1];end end
endendmodule

减法器RTL电路

module sub(A, B, CI, DIFF, CO);
parameter n = 32;
input [n-1:0] A, B;
input CI;
output CO;
output [n-1:0] DIFF;assign {CO,DIFF} = {1'b0, A} - {1'b0, B} - {{n{1'b0}}, CI};endmodule

仿真电路图如下图所示

三、状态机
1、状态机的简介
时序逻辑电路的设计核心在于如何在时钟的的控制下完成多种状态的变化,有数字电路的知识可知,时序电路的变化会遵循状态转换图,把状态转换图变为代码模块就可以编写成有限状态机。

有限状态机适合设计程序复杂但具有一定规律性的逻辑结构,有限状态机也常被缩写为FSM(Finite State Machine)。在使用有限状态机进行电路设计时,设计者要先根据所涉及的电路情况画好状态转换图,确认每个状态的输入/输出转换关系,然后依照状态机来编写代码。

有限状态机分为moore型和mealy型两种,也称为摩尔型和米利型。
moore型状态机的输出仅仅与当前状态有关,如下图所示

状态表如下图所示

mealy型状态机的输出不仅与当前状态有关,还与当前输出有关,如下图所示:

状态表如下图所示


2、两种红绿灯电路的状态机模型
2.1Moore型红绿灯
状态图如图所示

module trafficlight1(clock, reset, red, yellow, green);
input clock, reset;
output red, yellow, green;
reg red, yellow, green;
reg [1:0] current_state, next_state;
parameter red_state = 2'b00;
parameter yellow_state = 2'b01;
parameter green_state = 2'b10;
parameter delay_red = 4'd8;
parameter delay_yellow  = 4'd3;
parameter delay_green = 4'd11;
always @(posedge clock or posedge reset)beginif(reset)begincurrent_state <= red_state; end else begincurrent_state <= next_state;end
end
always @(current_state)begincase (current_state)red_state:beginred = 1;yellow = 0;green = 0;repeat (delay_red) @(posedge clock);next_state = yellow_state;end yellow_state:beginred = 0;yellow = 1;green = 0;repeat(delay_yellow)@(posedge clock);next_state = green_state;endgreen_state:beginred = 0;yellow = 0;green = 1;repeat(delay_green)@(posedge clock);next_state = red_state;end default:beginred = 1;yellow = 0;green = 0;repeat (delay_red)@(posedge clock);next_state = red_state;end endcase
end
endmodule

功能仿真电路

2.2meaiy型红绿灯
状态图如图所示

RTL电路图

//mealy型状态机红绿灯
module trafficlight(clock, reset, red, yellow, green, cnt);
input clock, reset, cnt;
output red, yellow, green;
reg red, yellow, green;
reg [1:0] current_state, next_state;
parameter RED_STATE = 2'b00, YELLOW_STATE = 2'b01,GREEN_STATE = 2'b10,delay_red = 4'd8,delay_yellow = 4'd3,delay_green = 4'd11;
always@(posedge clock or posedge reset)begin   //原态和新态的转换if(reset)begin current_state = RED_STATE;endelsebegincurrent_state = next_state;end
end
always @(current_state,  cnt)begin //当current_state 和cnt 变化后进行判断case(current_state)RED_STATE:beginred = 1;yellow = 0;green = 0;if (cnt == 1 )beginrepeat (delay_red)@(posedge clock);next_state = YELLOW_STATE;endendYELLOW_STATE:beginred = 0;yellow = 1;green = 0;repeat (delay_yellow)@(posedge clock);next_state = GREEN_STATE;endGREEN_STATE:beginred = 0;yellow = 0;green = 1;repeat (delay_green)@(posedge clock);next_state = RED_STATE;enddefault:beginred = 1;yellow = 0;green = 0;next_state = RED_STATE;endendcase
endendmodule

3、一段式状态机
这里应用一个序列检测电路来说明。模块中只包含一个always语句,用来检测输入的数值,当数值为0110时,标志检测成功。此时通过输出端输出一个信号,用来与之后的电路进行交互。
状态图如下图所示


RTL电路

module fam_seq1(clock, reset, x, z);
input reset, clock;
input x;
output z;
reg z;
reg [2:0] state;
parameter s0 = 3'd0,s1 = 3'd1,s2 = 3'd2,s3 = 3'd3,s4 = 3'd4;
always@(posedge clock or posedge reset)beginif (reset)beginstate <= s0;z <= 0;endelsebegincasex(state)s0:beginif(x == 1)beginstate <= s0;z <= 0;endelse beginstate <= s1;z <= 0;endend s1:beginif(x == 0)beginstate <= s1;z <= 0;end elsebeginstate <= s2;z <= 0;endend s2:beginif(x == 0)beginstate <= s1;z <= 0;end elsebeginstate <= s3;z <= 0;endends3:beginif(x == 0)beginstate <= s4;z <= 1;end elsebegin state <= s0;z <= 0;endends4:beginif(x == 0)beginstate <= s1;z <= 0;end elsebeginstate <= s2;z <= 0;endenddefault:beginstate <= s0;endendcaseend
end
endmodule

仿真图

一段式状态机的特点
(1) 仅有一段always结构,里面包含了状态转换、复位和输出。
(2)always结构的敏感列表是时钟沿,所以最后的输出结构是以寄存器形式输出的,既是时序逻辑输出,可以参考RTL电路图,最后一级的输出来自寄存器。
但是由于一个always结构中包含了所有的描述语句,再进行后期维护时不方便,如要修改或添加几个状态,改变一些输出等,可以把这个always结构中的一些语句单独提炼出来使其更具有可维护性和可读性 。
4、两段式状态机
同样是使用序列检测的模型进行两段式状态机的编写
状态图如图所示:

RTL电路如图所示

module fam_seq2(clock, reset, x, z);
input clock, reset, x;
output z;
reg z;
reg [2:0] current_state, next_state;
parameter s0 = 3'd0;
parameter s1 = 3'd1;
parameter s2 = 3'd2;
parameter s3 = 3'd3;
parameter s4 = 3'd4;
always@(posedge clock or posedge reset)begin//原态和新态之间的转换if (reset)begincurrent_state <= s0;endelsebegincurrent_state <= next_state;end
end
always@(current_state or x)begin //指定状态的变换,注意@(current_state or x)casex (current_state)s0:beginif(x == 1)beginnext_state <= s0;z <= 0; endelsebeginnext_state <= s1;z <= 0;endends1:beginif(x == 0)beginnext_state <= s1;z <= 0; endelsebeginnext_state <= s2;z <= 0;endends2:beginif(x == 0)beginnext_state <= s1;z <= 0; endelsebeginnext_state <= s3;z <= 0;endends3:beginif(x == 1)beginnext_state <= s0;z <= 0; endelsebeginnext_state <= s4;z <= 1;endends4:beginif(x == 0)beginnext_state <= s1;z <= 0; endelsebeginnext_state <= s2;z <= 0;endendendcase
end
endmodule

仿真图如下图所示

5、三段式状态机
仍然使用时序检测,只是将电路的输出与状态的转换分开,构成第三段


RTL 电路

module fam_seq3(clock, reset, x, z);
input clock, reset, x;
output z;
reg z;
reg [2:0] current_state, next_state;
parameter s0 = 3'd0;
parameter s1 = 3'd1;
parameter s2 = 3'd2;
parameter s3 = 3'd3;
parameter s4 = 3'd4;
always@(posedge clock or posedge reset)begin //原态和新态之间的转换if (reset)begincurrent_state <= s0; endelsebegincurrent_state <= next_state;end
end
always@(current_state or x)begin  //指定新态的变化casex (current_state)s0:beginif(x == 1)beginnext_state = s0;end elsebeginnext_state = s1;end end s1:beginif(x == 0)beginnext_state = s1;end elsebeginnext_state = s2;end end s2:beginif(x == 0)beginnext_state = s1;end elsebeginnext_state = s3;end end s3:beginif(x == 1)beginnext_state = s0;end elsebeginnext_state = s4;end end s4:beginif(x == 0)beginnext_state = s1;end elsebeginnext_state = s2;end end defaultbeginnext_state = s0;endendcase
end
always@(current_state or x)begin   //制定不同状态下的输出case(current_state)s0: z = 0;s1: z = 0;s2: z = 0;s3: beginif (x == 0)z = 1;elsez = 0;end s4: z = 0;default: z = 0;endcase
end
endmodule 

仿真电路图如下图所示

三段式状态机的形式比较固定,
第一段always用来完成原态和新态的转换,
第二段always用来完成确定新态的变化情况,
第三段always用来描述不同情况下的输出。
其中第一段是对时钟信号边沿敏感的,即使用时序逻辑电路,采用非阻塞赋值
第二段是对current_state或x敏感的,使用的是组合逻辑电路,采用的的是阻塞赋值,一般使用case语句和if语句完成输入值确定新态的过程。
但是第三段的问题较多,可以有五种信号的敏感而产生不同的输出情况。
6、三段式状态机第三段的仿真分析

对不同的信号敏感产生不同的输出情况
1、 always @(current_state or x)if (current_state == xxx and x == yyy)
2、always@(current_state)
3、always@(next_state)
4、always@(posedge clock)   case(current_state)
5、always@(posedge_clock)case(next_state)

接下来针对不同的情况分别分析2、3、4、5这四种情况

always@(current_state)begin   //制定不同状态下的输出case(current_state)s0: z = 0;s1: z = 0;s2: z = 0;s3: z = 0;s4: z = 1;default: z = 0;endcase
end

always@(next_state)begin   //制定不同状态下的输出case(next_state)s0: z = 0;s1: z = 0;s2: z = 0;s3: z = 0;s4: z = 1;default: z = 0;endcase
end

always@(posedge clock)begin   //制定不同状态下的输出case(current_state)s0: z <= 0;s1: z <= 0;s2: z <= 0;s3: z <= 0;s4: z <= 1;default: z <= 0;endcase
end

always@(posedge clock)begin   //制定不同状态下的输出case(next_state)s0: z <= 0;s1: z <= 0;s2: z <= 0;s3: z <= 0;s4: z <= 1;default: z <= 0;endcase
end


五种第三段的写法在实际电路中的变化过程

①always@(state or x)——这种形式当输入信号稳定且state稳定时就会产生输出,所以输出开始变化的位置和nstate应该是一样的,因为nstate也是等待输入稳定后就开始变成所需状态。换言之,输出信号会在clk上升沿之前产生。如果后级电路使用这个输出作为使能位,那前后级电路之间可以完成无缝对接。
②always@(state)——这种形式需要等到state发生变化时才能产生输出,state受时钟上升沿控制,变化稳定后产生有效的输出,参考图中输出②的位置,此时这个信号会在下一个周期时被后级电路使用,从而使后级电路的工作过程滞后一个周期。
③always@(nstate)——因为nstate的变化就发生在clk上升沿之前,所以当nstate稳定后,输出端的变化就开始了,知道最后产生一个稳定输出为止。只要时钟周期设计合理,这个输出也可以被即将到来的clk上升沿收集到,并在下一级电路中使用,所以效果和①相似,而采用③的方式时如果nstate变化较慢,也可能退后一个时钟周期。
④always@(posedge clk) + case(state)——因为state要等到上升沿
时才能开始变化,所以在第一个clk上升沿时产生的输出依然是上一个state情况,因为新的state还没有开始变化,等到第二个clk上升沿时产生的才是有效的输出,这个输出也会滞后一个周期,但是优点是受时钟控制,输出电路部分是时序电路,即最后的输出也是通过寄存器输出的,在时序电路中比较容易控制。
⑤always@(posedge clk) + case(nstate)——由于nstate在时钟上升沿之前就稳定了,所以如果case语句中对nstate进行判断,则输出变化的位置就是第一个clk的上升沿,如图所示。clk上升沿到来时,一方面state发生变化,另一方面输出值发生变化,既保证了信号的同步,也使用了时序电路作为输出。
Moore型状态机的第三段变化输出情况


①always@(state)——这种情况下输出会在state稳定后开始进行有效地输出变化,所以会发生在第一个clock边沿之后,如果是级联电路,本级电路进入到当前状态,下一级电路需要在一个时钟周期能接收到本级电路产生的输出信号。
②always@(nstate)——这种情况下输出信号产生依赖与nstate,所以会比①中变化的位置更慢一些,如果按这种情况在本时钟周期内到达稳定,输出信号也会被后级电路在一个周期接收到。
③always@(posedge clk) + case(state)——这种形式的好处是在于输出受时钟控制,但是case语句检测的是state,所以会在下一个时钟周期便演出产生输出,作为本级电路的输出信号没有问题,但是如果要和后级电路产生链接,需要在时序方面做好处理,因此此时后级电路可能需要再延迟一个时钟周期才能相应本级电路的输出
④always@(posedge clk) + case(nstate)——这种方式和mealy型类似,一方面可以产生时序电路输出,另一方面由case语句检测的是nstate,所以在下一个时钟信号来临时,一方面受第一段always控制,完成state<=nstate的赋值,state变为新态,另一方面输出也有nstate决定,所以产生的输出就是当前state的输出值。
四、应用实例
1、独热码状态机
状态图

RTL电路图

module one_hot_code(clock, reset, x, y);
input clock, reset;
input  x;
output y;
reg y;
reg [3:0] current_state,next_state;
parameter s0 = 4'b0001;
parameter s1 = 4'b0010;
parameter s2 = 4'b0100;
parameter s3 = 4'b1000;
always@(posedge clock or posedge reset)begin  //原态和新态之间转换if(reset)begincurrent_state <= s0;endelsebegincurrent_state <= next_state;end
end
always@(current_state or x)begin       //指定状态casex(current_state)s0:beginif (x == 1)beginnext_state = s1;endelse beginnext_state = s3;end end s1:beginif (x == 0)beginnext_state = s2;endelse beginnext_state = s0;end end s2:beginif (x == 0)beginnext_state = s3;endelse beginnext_state = s1;end end s3:beginif (x == 0)beginnext_state = s0;endelse beginnext_state = s2;end end default:beginnext_state = s0;end endcase
end
always@(posedge clock)begin         //指定状态输出case(current_state)s0:beginif(x == 0)beginy = 1;end else beginy = 0;end end s1: y = 0;s2: y = 0;s3: beginif(x == 0)beginy = 0;end else beginy = 1;end end default: y = 0;endcase
end
endmodule

仿真电路图

2、格雷码状态机
状态图

RTL电路

module gary_code (clock, reset, x, y1, y2, y3, y4);
input clock, reset, x;
output y1, y2, y3, y4;
reg y1, y2, y3, y4;
reg [1:0] current_state, next_state;
parameter s0 = 2'b00;
parameter s1 = 2'b01;
parameter s2 = 2'b11;
parameter s3 = 2'b10;
always @(posedge clock or posedge reset)beginif(reset)begincurrent_state = s0;end elsebegincurrent_state = next_state;end
end
always @(current_state or x)begincasex(current_state)s0:beginif(x == 1)next_state = s1;elsenext_state = s0;end s1:beginif(x == 1)next_state = s2;elsenext_state = s0;ends2:beginif(x == 1)next_state = s3;elsenext_state = s0;end s3:beginif(x == 1)next_state = s3;elsenext_state = s0;end default:next_state = s0;endcase
end
always@(posedge clock)beginif(current_state == s3 && x == 1)y1 = 1;elsey1 = 0;
end
always@(posedge clock)beginif(next_state == s3 && x == 1)y2 = 1;elsey2 = 0;
end
always@(current_state)beginif(current_state == s3 && x == 1)y3 = 1;elsey3 = 0;
end
always@(next_state)beginif(next_state == s3 && x == 1)y4 = 1;elsey4 = 0;
end
endmodule

仿真电路

声明:该文只适用于学习,其内容包含来自书本的摘抄和总结,欢迎大家补充,共同学习进步。

FPGA数字系统设计(8)——可综合电路及状态机相关推荐

  1. 《Verilog HDL与FPGA数字系统设计》书籍试读体验

    文章目录 前言 第一部分:数字系统基础 第二部分:数字系统设计实践 第三部分:可编程片上系统 总结 前言 最近参加一个面包板社区的图书试读活动:<Verilog HDL与FPGA数字系统设计&g ...

  2. FPGA数字系统设计(6)——时序逻辑电路设计

    用always@(posedge clk)描述 时序逻辑电路的基础--计数器(在每个时钟的上升沿递增1) 例1.四位计数器(同步使能.异步复位) // Module Name: counter_4bi ...

  3. FPGA数字系统设计(9)——信号产生

    信号的数字化需要3个步骤:抽样.量化和编码.抽样是指用每隔一定时间的信号样值序列来代替原来在时间上的连续信号,也就是在时间上将模拟信号离散化.量化使用有限个幅度值来近似原来连续变化的幅度值,把模拟信号 ...

  4. FPGA数字系统设计(4)——行为级建模

    行为级建模有两种标志性的结构: initial结构和always结构 initial结构与always结构在一个module可以出现很多次,与数据流建模assign一样. 一个module中所有的in ...

  5. reg类型变量综合电路_2014年PLD习题集(含参考答案)数字系统设计

    下载word有问题请添加微信号:xuecool-com或QQ:370150219处理(尽可能给您提供完整文档),感谢您的支持与谅解. 第1章习题 1.1 名词解释 PROM CPLD FPGA ASI ...

  6. 【 FPGA 】数字系统设计方法的演变

    前几天无意中打开了Vivado HLS这个设计工具,并看了几眼数据手册,大概是说有种更高抽象级别的设计方式,当然我是不知道的,也没有深究,今天看到<基于FPGA的数字信号处理>这本书,提到 ...

  7. Verilog语言与数字系统设计

    学习Verilog语言必要的基础知识 计算机导论 数字逻辑或数字电路与逻辑设计 计算机科学概论 拓展学习: 计算机组成原理 计算机体系结构 学习视频链接: 基于FPGA的Verilog语法基础课程(至 ...

  8. [渝粤教育] 西南科技大学 现代数字系统设计 在线考试复习资料2021版

    现代数字系统设计--在线考试复习资料2021版 一.单选题 1. SOPC的中文意思是(    ). A.电子设计自动化 B.硬件描述语言 C.片上可编程系统 D.片上系统 答案:看左边查询 2.XP ...

  9. [渝粤教育] 西南科技大学 现代数字系统设计 在线考试复习资料2021版(1)

    现代数字系统设计--在线考试复习资料2021版 一.单选题 1. SOPC的中文意思是(    ). A.电子设计自动化 B.硬件描述语言 C.片上可编程系统 D.片上系统 答案:看左边查询 2.XP ...

最新文章

  1. Thinkpad SL400 issue
  2. web前端 vue、react、angular三大框架对比 与jquery的对比
  3. Using the command line to manage files on HDFS--转载
  4. Runtime底层原理--Runtime简介、函数注释
  5. 在生产中配置和使用AWS EKS
  6. linux的任务计划6,Linux计划任务
  7. 洛谷 P4549 【模板】裴蜀定理
  8. 将您重定向的次数过多。_吃鸡:蹦蹦将迎来新皮肤?体验服全面加强,最高时速也不打滑...
  9. Unity实现人物旋转+移动
  10. 安消一体智能分析终端服务器
  11. 数据库服务器,sql
  12. 【Office】三件套之Word套路
  13. 批量修改文件夹下所有文件的名称
  14. java 得到汉字的拼音,Java获取汉字的拼音
  15. 2022年搭载国产芯片的手机推荐 这3款性能就不错
  16. python3将文本内容生成词云
  17. 用VBA提取字符串中的数字
  18. tassel软件使用linux,Linux系统下TASSEL5.0的安装及使用
  19. 可能改变世界的七个想法
  20. 电脑上使用计算机命令行,我的电脑运行命令_我的电脑什么运行命令

热门文章

  1. 22西电网信953上岸
  2. 西安电子科技大学953考研
  3. 直流电机_脉宽调制调速(PWM)
  4. Python代码实现快速排序
  5. php屏蔽手机号码,PHP正则表达式屏蔽电话号码中间段
  6. informa医药数据库
  7. android nfc后台,android NFC开发简单入门
  8. 万般皆下品惟有读书高,面试各种后的领悟
  9. 计算机为什么不重视SCI,科学网—要SCI-EI,但不唯SCI-EI ---读CCF新的会议杂志推荐目录有感 - 唐常杰的博文...
  10. 寻找字符串的最长不重复子串,计算复杂度O(n),两种实现