Verilog学习笔记 HDLBits——Procedures

本文详细介绍了Verilog中的过程块(always@*和always@(posedge clk))在组合逻辑和时序逻辑中的应用,包括if、case语句的使用,并通过实例展示了如何构建逻辑门、多路复用器、优先编码器等基本逻辑电路。同时强调了避免产生锁存器的重要性,并给出了正确的编程实践。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

由于数字电路由用线路连接的逻辑门组成,因此任何电路都可以表示为一些模块和赋值语句的组合。然而,有时这并不是描述电路最方便的方式。过程块提供了描述电路的另一种语法。

组合电路: always @(*)
时序电路: always @(posedge clk)

组合逻辑always等价于assign语句,因此总有一种方法可以用两种方式表达组合电路。使用哪一种语法的选择主要是哪种语法更方便的问题。过程块内部代码的语法与外部代码不同。过程块拥有更丰富的语句集(例如,if-then, case),不能包含连续的赋值*,但也引入了许多新的非直观的错误。(*过程式连续赋值确实存在,但与连续赋值有所不同,且不可综合。)
Verilog中的Case语句几乎等价于一个if-elseif-else序列,它将一个表达式与其他表达式的列表进行比较。它的语法和功能与C中的switch语句不同

一、Procedures

1.Always blocks(combinational)

Practice: Build an AND gate using both an assign statement and a combinational always block. (Since assign statements and combinational always blocks function identically, there is no way to enforce that you’re using both methods. But you’re here for practice, right?..)
翻译:根据下图,分别用assign语句和always块两种方式来写一个与门 。
在这里插入图片描述

Solution(不唯一,仅供参考):

module top_module(
    input a, 
    input b,
    output wire out_assign,
    output reg out_alwaysblock
);
    assign out_assign = a&b;
    always @(*) begin
       out_alwaysblock = a&b; 
    end

endmodule


Timing Diagram
在这里插入图片描述

2.Always blocks(clocked)

阻塞赋值和非阻塞赋值:Verilog中有以下三种类型的赋值方式:

连续赋值:		(assign x=y;)	// 不能在过程块(always块)内使用;
过程阻塞赋值:	(x=y;)			// 只能在过程块内使用;
过程非阻塞赋值:	(x<=y;)			// 只能在过程块内使用。

Practice:Build an XOR gate three ways, using an assign statement, a combinational always block, and a clocked always block. Note that the clocked always block produces a different circuit from the other two: There is a flip-flop so the output is delayed.
翻译:构建异或门有三种方法:使用赋值语句、组合always块和计时always块。请注意,时序always产生的电路与其他两个不同:有一个触发器,因此输出延迟。
在这里插入图片描述

Solution(不唯一,仅供参考):

module top_module(
    input clk,
    input a,
    input b,
    output wire out_assign,
    output reg out_always_comb,
    output reg out_always_ff   );
    assign out_assign = a^b;
    always @(*) begin 
       out_always_comb = a^b; 
    end
    always @(posedge clk)begin
       out_always_ff = a^b; 
    end
endmodule

Timing Diagram

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值