一、时序电路的建模方式
时序电路就是受时钟边沿信号影响的电路。也就是说,时序电路中必须要能感受到边沿信号的出现。Verilog内置的14个门级元件都不支持感受边沿信号,所以,仅通过门级描述不足以对时序电路进行建模。数据流描述的assign语句(持续赋值语句)如同导线将各端口和器件连接起来一样,形象地说,它只能负责端口与器件间的逻辑连接,能不能感受边沿信号还得取决于器件本身,显然也不足以对时序电路进行建模。行为描述可以根据电路功能来进行建模,Verilog中想要感受边沿信号,只需要在always后的敏感信号列表中列出边沿信号即可。由此可见,仅有行为描述能够独立地设计出时序电路。
二、时序电路的设计文件模板
1、一般模板
module moduleName(
// 时钟信号定义
// 输入信号列表
// 输出信号列表
);
// 内部变量列表
always @ (<边沿信号列表>) begin
// 行为建模描述
end
// 组合逻辑描述
endmodule
其中,时钟信号在定义的时候也属于输入信号,并且,输入输出信号的定义顺序可以随机打乱,不影响设计结果,上述代码仅为个人习惯。
内部变量列表主要是用来定义一些内部连线型和寄存器型变量。内部变量列表并不是必需的,具体情况要根据设计的电路来确定。
通常情况下,时序电路仅有一个时钟信号,它一定要写在always后的边沿信号列表的第一个位置。边沿信号列表中仅有第一个信号为边沿信号,其他位置虽然写法也是边沿信号,但都是通过电平信号异步影响电路逻辑。
从上述代码可以看出,在时序电路中也可掺杂组合逻辑,所以Verilog设计的过程中需要灵活变通,如果一个模块不能简单使用时序逻辑完成建模,就需要借助组合逻辑共同完成该模块的建模。组合逻辑描述并不是必需的,具体情况要根据设计的电路来确定。
2、具体示例
32位带复位信号的低使能PC:

module PC(
input wire clk,
input wire rst,
input wire n_EN,
input wire [31:0] PCin,
output wire [31:0] PCout
);
reg [31:0] mem;
always @ (posedge clk or posedge rst) begin
if (rst)
mem <= 0;
else begin
if (!n_EN)
mem <= PCin;
end
end
assign PCout = mem;
endmodule
三、注意事项
1、时序电路always模块的敏感列表中的所有信号都需要写成边沿信号的格式(即信号名前加上posedge或者negedge),但只有第一个位置的信号是时钟信号。
2、时序电路always模块中被赋值的变量依然是寄存器型。
3、时序电路always模块中一般全部采用非阻塞赋值(在边沿信号到来的时刻,所有赋值语句并发执行,不分先后)。
4、时序电路中的非阻塞赋值与持续赋值语句(assign)含义不同,非阻塞赋值是指在边沿信号到来的瞬间并发赋值,而assign是每时每刻都并发赋值。所以,在时序电路蕴含组合逻辑时,要将组合逻辑分离出来,在always模块外实现。
579

被折叠的 条评论
为什么被折叠?



