Verilog:时序逻辑电路建模

一些时序逻辑电路的行为级建模的例子

移位寄存器的Verilog建模

对于双向移位寄存器74HCT194,其建模时要实现的核心功能在于,的四种值时的数据的不同操作,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module shift74x194_beh(
input S0,S1,
input Dsl,Dsr,
input CP,CR,
input [0:3]D,
output reg [0:3]Q
);
always @(posedge CP,negedge CR)
if(!CR)Q<=4'b0000;
else
case({S1,S0})
2'b00: Q<=Q; //输出保持不变
2'b01: Q<={Dsr,Q[0,2]}; //右移
2'b02: Q<={Q[1,3],Dsl}; //左移
2'b03: Q<=D; //并行置数
endcase
endmodule

计数器的Verilog建模

带有使能端和同步置数端的可逆二进制计数器

参数n设置位数,Up_down为1/0控制计数器递增/递减

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module updowncount #(parameter n=4)
(
input Load,Up_down,En,CP,
input [n-1:0]D,
output reg [n-1:0]Q
);
integer direction;

always @(posedge CP)
begin
if(Up_down)
direction<=1;
else
direction<=-1;
if(Load)
Q<=D;
else if(En)
Q<=Q+direction;
else
Q<=Q;
end
endmodule
带有异步清零功能的D触发器构成的4位二进制计数器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module D_FF(
output reg Q,
input D,CP,Rd
);
always @(negedge CP,negedge Rd)
begin
if(!Rd)Q<=0;
else Q<=D;
end
endmodule

module rippecounter(
output Q0,Q1,Q2,Q3,
input CP,CR
);
//实例化引用触发器模块
D_FF FF0(Q0,~Q0,CP,CR);
D_FF FF1(Q1,~Q1,Q0,CR);
D_FF FF2(Q2,~Q2,Q1,CR);
D_FF FF3(Q3,~Q3,Q2,CR);
endmodule
带有使能端和异步清零的模10计数器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module m10_counter(
output reg [3:0]Q,
input CE,CP,CR
);
always @(posedge CP,negedge CR)
begin
if(!CR)Q=4'b0000;
else if(CE)
begin
if(Q>=4'b1001)
Q<=4'b0000
else Q<=Q+1'1;
end
else Q<=Q;
end
endmodule

需要注意的是,电路的功能描述和具体的硬件电路结构是无关的,从这个模10计数器的建模中可以看出这一点

状态转换图的Verilog建模

以检测连续输入序列的电路为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module Mealey_sequence_detector(
input A,CP,CR,
output reg Y
);
reg [1:0]current_state,next_state;//中间变量
parameter S0=2'b00,S1=2'01,S2=2'b11;
always @(negedge CP,negedge CR)//时序电路
begin
if(~CR) current_state<=S0;
else current_state<=next_state; //状态转换
end
always @(current_state,A)//组合电路
begin
case(current_state)//准备下一状态
Y=0;
S0:begin next_state=(A==1)?S1:S0; end
S1:begin next_state=(A==1)?S2:S0; end
S3:if(A==1) begin next_state=S2; end
else begin Y=1;next_state=S0; end
default: begin next_state=S0; end
endcase
end
endmodule