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

行为级建模有两种标志性的结构:
initial结构和always结构
initial结构与always结构在一个module可以出现很多次,与数据流建模assign一样。
一个module中所有的initial结构和always结构都是同时开始执行的,不以代码中出现的先后顺序区分。但这两种结构都不支持嵌套。
一、行为级建模语法
1、initial结构

initial a = 1;

initial begin
a = 1;
b = 2;
end

2、always结构

always   <时序控制方式> 执行语句
例:
always # a= ~a;

always @(敏感事件)
例
always @(posedge a, negedge b) begin
a = 1;
b = 1;
end

always @(*)   ///表示该always结构中所有的事件信息

例子:电平触发D锁存器

always@(clk or reset or d)begin
 if(reset)
 q = 0;
 else if(clk)
 q = d;
 else
end
 

带异步清零功能的D触发器

always@(posedge clk or negedge reset)begin
 if(! reset)
 q = d;
 else 
 q = d;
end
 

3、initial和always中有很多块使之成为一个整体
顺序快 begin····end
内容按顺序执行
并行快 fork···join
内容同时打开

begin
#10 a = 1;
#10 b = 1;
#10 c = 1;
end

fork
#10 a = 1;
#20 b = 1;
#30 c = 1;
join
两段代码的执行结果一致

 

块之间可以嵌套

例
begin
 a= 0;
 fork 
 #10 b = 1;
 #10 c = {a,b};
 join
 #10 d = {b,a};
 end

4、if语句

(1)   if (condition) statement;

(2)  if (condition) statement_1;
     else statement_2;

(3)  if (condition_1) statement_1;
     else if (condition_2) statement_2;
     else statement_3;
     

若if后的statement中有很多条,可通过使用begin···end
注:每个if都有else,即便else无返回值,写一条空语句,这样更容易理解代码
5、case语句

case (表达式)
分支1:语句1;
分支2:语句2;
default:默认项;
endcase 

6、循环语句

while(判断条件)
begin
	循环语句;
end

for(初始化条件 ; 判断条件 ; 变量控制)
begin
	循环语句;
end

repeat(次数)
begin
	循环体语句;
end

repeat (次数)@(posedge clock)
begin
	循环体语句
end
//循环n次上升沿


forever #10 clock = ~clock;
等价于
always #10 clock = ~clock; 

7、过程性赋值语句
阻塞性赋值 a = 1;
非阻塞性赋值 b = 1;

例
initial begin
	a = 0;
	b = 1;
	c = {
    
    a, b};
	d = {
    
    b, a};
	end
得到的值  a = 0,b = 1,c = 01,d = 10;
initial begin
 a <= 0;
 b <= 1;
 c <= {
    
    a, b};
 d <= {
    
    b, a};
 end
得到的值 a = 0,b = 1,c d 未知,取决于a b之前的数值

二、行为级建模
1、四位全加器
RTL仿真电路图
在这里插入图片描述

module add4(A,B,CIN,COUT,S);
input [3:0] A, B;
input CIN;
output [3:0] S;
output COUT;
reg COUT;
reg [3:0] S;
always @(*)begin
 {
    
    COUT, S} = A + B + CIN;
end
endmodule

仿真效果如图所示
在这里插入图片描述

2、简易ALU电路
RTL电路图如图所示
在这里插入图片描述

module ALU(out, a, b, select);
input [7:0] a, b; 
input [2:0] select;
output [7:0] out;
reg [7:0] out;
always @(*) begin
 case (select)
  3'b000: out = a; 
  3'b001: out = a + b;
  3'b010: out = a > b;
  3'b011: out = a * b;
  3'b100: out = a / b;
  3'b101: out = a % b;
  3'b110: out = a << 1;
  3'b111: out = a >> 1;
  default: out = 8'b00000000;
 endcase
end 
endmodule

仿真电路图如下图所示
在这里插入图片描述

3、十进制计数器

RTL 电路图如图所示

在这里插入图片描述

/*完成的功能主要是实现74ls160的功能
  reset                异步复位端,上升沿有效,完成复位功能
  load                 同步置数端,高电平有效,完成置数功能
  clock                时钟端口
  en                   使能端,优先级在reset,load之后,暂停计输
  D                    同步置数的数据输入端
  Q                    计数器数据输出端
  C                    进位输出端
*/
module counter160(clock, reset, load, en, D, Q, C);
input clock, reset, load, en;
input [3:0] D;
output [3:0] Q;
output C;
reg  [3:0] Q ;
always@(posedge reset or posedge clock)begin
 if(reset == 1)
 Q <= 4'd0;
 else if(load == 1)
 Q <= D;
 else if(en)
 Q <= Q;
 else if(Q == 9)
 Q <= 0;
 else 
 Q <= Q + 1;
end
assign C = (Q == 9);
endmodule

在这里插入图片描述
4、下降沿触发D触发器
RTL电路图

在这里插入图片描述

module mydff(Q, Qbar, D, clock);
input D, clock;
output Q, Qbar;
reg Q, Qbar;
always@(negedge clock) begin
 Q <= D;
 Qbar <= ~D;
end
endmodule

仿真结果如图所示
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/qq_24213087/article/details/107458331