本章概述
本章将介绍:
- 自动优化多输入—输出逻辑电路布尔方程的方法。
- 给出几个例子,说明如何编写组合、时序逻辑的可综合模型(也就是那些:可用综合工具来生成所描述的功能的门级电路所实现的模型)。
6.1 综合简介
电路模型可根据抽象程度和观测级别来分类。有三种常见的抽象级别:架构级、逻辑级、物理级。
架构级:架构级的描述包含了必须由电路执行的、将输入序列转换为特定输出序列的一些操作,但不将操作与时钟关联。使用“架构”这一名词,是因为这些操作基本上可以由那些不同结构的、互连的、同步的功能单元来实现。这里设计的关键在于如何从架构描述中,提取一个能实现所需功能的算法。
逻辑级:逻辑级的模型描述了,能够由电路实现的一组变量和一组布尔函数。逻辑模型的寄存器资源、功能模块架构和时序均是其描述的一部分。这里设计任务就是,将布尔逻辑转换成可以满足功能的组合门电路和存储寄存器的最优化的网表
电路设计从高级别的抽象开始,最后结束于物理实现。
6.2 组合逻辑的综合
6.3 带锁存器的时序逻辑的综合
6.4 三态器件和总线接口的综合
6.5 带有触发器的时序逻辑综合
6.6 显示状态机的综合
显式状态机有一个已经明确定义的寄存器和一个能在输入的作用下控制状态转换的逻辑。显式状态机推荐使用两个行为来描述,一个边沿敏感行为(描述状态的同步转移),另一个电平敏感行为(描述下一个状态和输出的组合逻辑)。
6.6.1 BCD码/余3码转换器的综合
建议在所有case语句中都包含default语句,否则将会出现锁存器。
BCD码/余3码转换器的功能可以参照P53页3.6节。之前是利用人工方法进行设计,现在是讨论Verilog描述的编码转换器的建模及其综合过程。
在描述显式状态机的下一个状态和输出的组合逻辑的电平敏感行为时,要对所有可能的状态译码。
如果case语句的分支中,没有包含所描述状态机所有的下一状态和输出逻辑,那么下一状态和输出的组合逻辑将被综合成带锁存器的输出。要想避免这一情况,可以在描述下一状态的电平敏感行为一开始的时候就给下一状态赋以默认值。
同样,给一个状态机的输出赋以默认值也可以避免综合为锁存的输出。
综合工具对状态机的建模附加了一些约束条件:
- 显式状态机的状态寄存器必须当作一个整体进行赋值,即不允许综合工具为状态寄存器变量进行位选择和部分选择复制;
- 所有寄存器都要赋值;
- 异步控制信号(如set和reset)在事件控制表达式中必须为标量;
- 赋给状态寄存器的值必须为一个常数(如state_reg=start_state)或者是经静态求值后可得到常数值的一个变量(即状态转移图必须指定确定的关系)。
显式状态机的描述也包括一个明确声明的类型为reg的状态寄存器变量。只有这样的寄存器才可以用来表示状态机,它意味着状态寄存器的每一个赋值语句必须要给整个寄存器赋值,而不是给某位或某一部分赋值。这种对寄存器过程赋值的约束确保了特定状态转移图与行为的对应。
6.6.2 设计举例:Mealy型NRZ码/Mancherster线性码转换器的综合
module NRZ_2_Mancherster_Mealy
(
output reg B_out,
input B_in ,
input clock,
input reset_b
)
reg[1:0] state,neat_state;
parameter S_0 = 2'd0,
S_1 = 2'd1,
S_2 = 2'd2, //2'd3是未用到的位组合状态
dont_care_state = 2'bx,
dont_care_out = 1'bx;
always@(negedge clk or negedge reset_b) begin
if(reset_b == 0) begin
state <= S_0;
end else begin
state <= next_state;
end
end
always@(state,B_in) begin
B_out = 0; //默认赋值
case(state) //注意:状态寄存器是部分译码的
S_0 : begin
if(B_in == 0) begin
next_state = S_1;
end else if(B_in == 1) begin
next_state = S_2;
B_out = 1 ;
end
end
S_1 : begin
next_state = S_0;
B_out = 1 ;
end
S_2 : begin
next_state = S_0;
end
default : begin
next_state = dont_care_state;
B_out = dont_care_out ;
end
endcase
end
endmodule
6.6.3 设计举例:Moore型NRZ码/Manchester线性码转换器的综合
module NRZ_2_Mancherster_Mealy
(
output reg B_out,
input B_in ,
input clock,
input reset_b
)
reg[1:0] state,neat_state;
parameter S_0 = 2'd0,
S_1 = 2'd1,
S_2 = 2'd2,
S_3 = 2'd3;
always@(negedge clk or negedge reset_b) begin
if(reset_b == 0) begin
state <= S_0;
end else begin
state <= next_state;
end
end
always@(state,B_in) begin
B_out = 0; //默认赋值
case(state) //完全译码
S_0 : begin
if(B_in == 0) begin
next_state = S_1;
end else begin
next_state = S_3;
end
end
S_1 : begin
next_state = S_2;
end
S_2 : begin
B_out = 1;
if(B_in == 0) begin
next_state = S_1;
else begin
next_state = S_3;
end
end
S_3 : begin
next_state = S_0;
B_out = 1 ;
end
endcase
end
endmodule
应该再去看看Moore状态机和Mealy状态机的区别以及状态机的定义
6.6.4 设计举例:序列检测器的综合
6.7 寄存器逻辑
6.8 状态编码
6.9 隐式状态机、寄存器和计数器的综合
7.0 复位