行为级建模有两种标志性的结构:
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
仿真结果如图所示
声明:该文只适用于学习,其内容包含来自书本的摘抄和总结,欢迎大家补充,共同学习进步。