请教Verilog代码有关always块问题

舟_井 2024-07-09 00:07:44

    大佬们好,我想请教一下vivado中always块的一个问题,问题如下:

always @(*) begin
......
end

    在verilog中,always @(*)将代码块涉及到的信号均列为敏感表,综合为一个组合逻辑电路;但是在always块中仅可以对reg型变量进行赋值,这不会导致资源的过多占用吗?(寄存器类型是否比门电路更耗资源?)此外,笨人有点好奇含有reg型变量的组合逻辑综合出来应该是什么样的电路呢?希望大佬们不吝赐教,指出我的错误;如果方便,也请给出综合出的电路示意图(简单示意即可),感谢!

...全文
385 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
勇敢滴勇 2024-07-10
  • 打赏
  • 举报
回复 1

在Verilog中,always @(*)表示一个组合逻辑块,意味着综合工具会将代码块中涉及到的所有信号列为敏感信号,并将该代码块综合成一个组合逻辑电路。对于组合逻辑块中的赋值操作,只能对reg类型的变量进行赋值,这不会导致资源的过多占用。这里解释一下几个关键点:

always @(*)reg 型变量

  1. 组合逻辑块always @(*) 表示组合逻辑块,而非时序逻辑块。综合工具会根据组合逻辑块中的逻辑关系生成逻辑门电路,而不是触发器或寄存器。
  2. reg 型变量:在Verilog中,reg 并不一定代表物理上的寄存器。它只是表示一种变量类型,可以在过程语句(如always块)中进行赋值。在组合逻辑块中,reg 型变量只是一个表示方法,实际综合出来的电路不会包含触发器或寄存器,而是相应的组合逻辑电路。

组合逻辑电路的综合

组合逻辑电路综合出来的电路形式可能包含逻辑门(如与门、或门、非门等),这些逻辑门根据代码中的逻辑关系进行连接。例如:

always @(*) begin
    if (a & b) begin
        y = 1;
    end else begin
        y = 0;
    end
end

上述代码表示一个简单的与门逻辑,综合后的电路如下:

  • 输入:a, b
  • 输出:y
  • 逻辑关系:y = a & b

综合后的电路如下:

 a ----\
        AND ----> y
 b ----/

误解与解释

你的问题中提到的误解在于认为reg 类型变量会导致资源的过多占用。实际上,在组合逻辑块中使用reg 类型变量不会导致寄存器资源的浪费,因为它们只是在Verilog代码中用于赋值的变量类型,最终综合成的电路还是组合逻辑电路。

示例电路示意图

假设我们有以下Verilog代码:

module example(
    input wire a,
    input wire b,
    output reg y
);

always @(*) begin
    if (a & b) begin
        y = 1;
    end else begin
        y = 0;
    end
end

endmodule

综合出来的电路图示意如下:

   a ----\ 
          AND ----> y
   b ----/

这个电路图表示一个简单的与门电路,其中ab 是输入信号,y 是输出信号。

结论

  • always @(*) 块用于定义组合逻辑电路。
  • reg 型变量在组合逻辑块中仅作为赋值变量,不会导致寄存器资源的浪费。
舟_井 2024-07-12
  • 举报
回复
@勇敢滴勇 感谢!对reg类型变量的理解不到位了
勇敢滴勇 2024-07-16
  • 举报
回复
@舟_井 没事
舟_井 2024-07-09
  • 打赏
  • 举报
回复

有关资源占用,理解是,对于一些控制信号完全可以利用wire型变量(简单的组合逻辑)而不需要使用到寄存器进行存储?不知道这个理解是否正确?如有错误请指正,感谢!

26,911

社区成员

发帖
与我相关
我的任务
社区描述
FPGA开发者交流社区,交流FPGA应用,FPGA验证,Xilinx、Altera、Microchip、Lattice、国产高云、安路、紫光、复旦微等等。
嵌入式硬件fpga开发硬件架构 技术论坛(原bbs) 北京·朝阳区
社区管理员
  • whik1194
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧