提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
由于数字电路由用线路连接的逻辑门组成,因此任何电路都可以表示为一些模块和赋值语句的组合。然而,有时这并不是描述电路最方便的方式。过程块提供了描述电路的另一种语法。
组合电路: 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

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

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



