1.边沿捕获器
举例来说,一个在CLK时钟驱动下,对输入信号IN进行上跳沿捕获的电路,它的Verilog代码如下所示,
module top(
CLK , // input clock
IN , // input
OUT ); // output
input CLK; input IN; output OUT;
reg d1R, d2R; // 电路中的D触发器输出端
reg OUT; // 组合逻辑输出信号,作为输出端口
// 生成移位寄存的D触发器,我们要明确,下面代码的写法会生成d1R和d2R两个D触发器。
// 并且d1R和d2R级联构成IN信号的移位寄存器。这是EDA工具不会篡改的事实。
always @ (posedge CLK) begin
d1R <= IN ;
d2R <= d1R ;
end
// 判断上跳沿的组合逻辑,我们要明确,下面的代码是一个以d1R、d2R信号作为输入,
// 以OUT信号作为输出的组合逻辑,并且代码中指出了OUT信号与d1R、d2R信号的逻辑
// 关系(好比是真值表),但是究竟用怎样的逻辑门实现(好比是卡诺图的画圈)
// 那是EDA工具要关心的事情。
always @ (d1R or d2R) begin
if((d2R == 0)&&(d1R == 1)) // 新值为1,旧值为0,跳变发生
OUT = 1'b1;
else
OUT = 1'b0;
end
endmodule
// endmodule top
另外`对于Quartus工具EDA工具进行编译之后,Tools -> Netlist Viewer -> RTL Viewer

就会提取出RTL结构如图所示,我们可以观察EDA工具解析出的RTL是否和我们预想的一致,这是一种重要的验证手段。
2.实例化电路模块并互联
Verilog代码的重要功能之一是实例化电路模块,并且对这些模块进行布线连接,每个被实例化的Verilog module 就如同某个型号的芯片, 每对该module的一次实例化,就如同使用了一次该芯片。同样,把各个实例化的module的信号连接起来,就如同在电路元件之间用导线进行互联一样。
以下代码演示了在顶层模块中,把一个加法器实例化了2次。
2个加法器实例对象的输入输出分别与顶层模块的输入输出相连
// 顶层模块
module top(
IN ,
OUT0 ,
OUT1 );
input [4-1:0] IN ;
output[4-1:0] OUT0;
output[4-1:0] OUT1;
wire [4-1:0] W_add0_out;
wire [4-1:0] W_add1_out;
// 第1次实例化, 加法器子模块
add U0_add(
.IN0 (IN ),
.IN1 (4'h1 ),
.OUT (W_add0_out));
// 第2次实例化, 加法器子模块
add U1_add(
.IN0 (IN ),
.IN1 (4'h2 ),
.OUT (W_add1_out));
// 端口接线互联
assign OUT0 = W_

本文详细介绍使用Verilog进行数字电路设计的基础知识,包括边沿捕获器、电路模块实例化、多路选择器、交叉开关及优先编码器的设计方法。通过具体代码示例,展示如何在Quartus工具中编译、观察RTL视图并进行波形仿真。
3416

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



