情境:

  FPGA里面计数器需要复位(计数值置零),与计数器状态有关的行为是状态机控制的,即状态机为CLEAR_TIMER状态时,计数器才完成清零动作。

  清零有两个条件:(1)计数器值溢出(达到OVF门限);(2)清零信号有效(1有效)。这两个条件是独立的,没有先后关系的约束。

问题是:如何写Verilog语句,才使得这两个触发的优先级相同?

有两个思路:

一个是:

always@(posedge clk)begin
  if(!rst_n)begin
    stat_preload <= STAT_IDLE;
  end
  else begin
    //*** Combined Transition
    if((tim_cnt >= TIIM_OVF) || (1'b1 == tim_rst))begin // OR
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Status Latch
    end
  end
end

另一个:

always@(posedge clk)begin  
  if(!rst_n)begin
    stat_preload <= STAT_IDLE;
  end
  else begin
    //*** Separate Transition
    if(tim_cnt >= TIM_OVF)begin
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Stay
    end
    if(1'b1 == tim_rst)begin
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Stay
    end
  end
end

这两种写法的区别在于:第一种,状态转移语句放在两个条件参与的单个if选择结构里面;第二种,状态转移语句放在分别的两个if选择结构里面。

状态转移图中表现为这样的两种情况:

实现和测试:

上述两种的代码和综合结果如下:

module top(
rst_n,
clk,
X,
Y,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if(('b1 == X) || (1'b1 == Y))begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

module top(
rst_n,
clk,
X,
Y,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if('b1 == X)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == Y)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

综合器是Quartus 15.1内置的。

可以看到,第二种写法的综合结果让输入信号X没有驱动逻辑了,这样就与需求不符。

原因是什么?

第二种(分开if)情况下,虽然赋值语句都是非阻塞的<=,但是由于if语句放在顺序的begin::end结构内,所以判断和执行都是顺序处理的,状态转移和状态停留操作是一模一样的,所以X条件被省略了。

为了验证这个结论,在X,Y两个条件的基础上再加R,S两个条件,进行X,Y,R,S的顺序if,然后查看结果:

module top(
rst_n,
clk,
X,
Y,
R,
S,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y;
input wire R;
input wire S; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if('b1 == X)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == Y)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == R)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == S)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

显然,只有S条件有效了。

结论:顺序块begin::end中的语句是顺序执行的。

Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?的更多相关文章

  1. verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系

    这几个概念是不一样的 顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关. 并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执 ...

  2. Verilog HDL中阻塞语句和非阻塞语句的区别

    在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”).正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要. Verilog语言中讲的阻塞赋值与非 ...

  3. Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)

    出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM 综合软件:Quartus II 一.有优先级的if语句 if..else if.. else i ...

  4. Verilog中的阻塞与非阻塞

    这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...

  5. Verilog之阻塞赋值非阻塞赋值

    verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1. 阻塞赋值与非阻塞赋值: 2. 代码测试: 3. 组合逻辑电路和时序逻辑电路. 阻塞赋值与非阻塞赋值: 1. 阻塞赋值" ...

  6. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理:     阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...

  7. 用Java实现非阻塞通信

    用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...

  8. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  9. 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法

    转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...

随机推荐

  1. 关闭AnyConnect登录安全警告窗口

    一.问题描述:使用AnyConnect client连接时,如何关闭的安全警告窗口? 二.原因分析:   AnyConnect Server(ASA)和AnyConect client(PC)上没有受 ...

  2. WLC-WLC升级(以2504为例)

    1.WLC升级需要按照升级路径来操作,低版本到高版本的跨度太大,往往需要升级到中间版本,有时候还涉及到FUS. 2.我们升级,一般使用的笔记本上运行的TFTP/FTP  server. 需要注意:笔记 ...

  3. 学习笔记(20)- Google LaserTagger

    参考文章:推断速度达seq2seq模型的100倍,谷歌开源文本生成新方法LaserTagger 论文地址:https://research.google/pubs/pub48542/ 开源地址:htt ...

  4. 【K-means算法】matlab代码实例学习

    1. MATLAB函数Kmeans 使用方法:Idx=Kmeans(X,K)[Idx,C]=Kmeans(X,K) [Idx,C,sumD]=Kmeans(X,K) [Idx,C,sumD,D]=Km ...

  5. problem :无法显示activemq的管理界面

    点击 Manage ActiveMQ broker 无法显示admin界面 解决方法:修改activemq.xml 和 jetty.xml文件 把所有0.0.0.0修改为127.0.0.1 成功: 账 ...

  6. if,while,for循环

    目录 if条件 while循环 for循环 拓展知识点 if条件 if 条件: code elif 条件: code else: code # 三元运算符 x = 10 y = 20 print(y ...

  7. 如何用一个servlet处理多个请求

    一个servlet处理多个请求,原理:利用反射机制获取在selvlet类中的其他方法1.前端页面<%@ page language="java" contentType=&q ...

  8. hdfs dfs ls /列出了本地根目录下文件夹和文件Warning: fs.defaultFS is not set when running "ls" command

    [root@node01 customShells]# hdfs dfs -ls /Warning: fs.defaultFS is not set when running "ls&quo ...

  9. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

  10. mysql mvcc 的理解

    mvcc 全称 multiple version concurrency control 多版本并发控制,是数据库领域比较常用的一种非锁并发技术. mysql 的innodb中,在RR.RC级别会使用 ...