Verilog RTL 新手代码设计 (边沿捕获器、实例化电路模块并互联、多路选择器、交叉开关、优先编码器)

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

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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值