Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?
情境:
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的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?的更多相关文章
- verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系
这几个概念是不一样的 顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关. 并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执 ...
- Verilog HDL中阻塞语句和非阻塞语句的区别
在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”).正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要. Verilog语言中讲的阻塞赋值与非 ...
- Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)
出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM 综合软件:Quartus II 一.有优先级的if语句 if..else if.. else i ...
- Verilog中的阻塞与非阻塞
这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...
- Verilog之阻塞赋值非阻塞赋值
verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1. 阻塞赋值与非阻塞赋值: 2. 代码测试: 3. 组合逻辑电路和时序逻辑电路. 阻塞赋值与非阻塞赋值: 1. 阻塞赋值" ...
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...
- 用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法
转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...
随机推荐
- 计划任务cron,date,时间同步ntp,chrony
取出磁盘利用率最大值 ,写个脚本,做判断,只要快满了,就报警 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业 /etc/crontab 用户cron任务: ...
- linux文本处理工具-1
文件内容: cat ,more,less 文件截取:head,tail 按列抽取:cut 排序和统计:sort,wc ----------------------------------------- ...
- 转专业后补修C语言的一些体会(3)
1.指针:指针是C语言最为强大的工具之一,有着很多优点,比如可以改善子程序的效率,为动态数据结构提供支持,为C的动态内存分配系统提供支持,为函数提供修改变量值的手段.但指针的使用十分困难.会出现很多意 ...
- Ubuntu配置Python开发环境(PyCharm、Tensorflow)
安装JDK: https://www.cnblogs.com/wanghuixi/p/9837229.html 安装Anaconda: 安装PyCharm: https://www.cnblogs.c ...
- 几个原生js知识
1.document.documentElement 返回根节点 html. 2.原生方法获取一个对象的某个样式的值. function getStyle(obj, attr) { if(obj.cu ...
- 堆(c++)
5分钟速成堆 FBI⚠WARNING 本文要素过多 吐槽 堆是我迄今为止学过最简单的数据结构 我还没学会最小生成树.最短路时就学会了 堆实用高效,值得推荐 (如果你看完了这篇文章还不会,你可以直接Co ...
- Linux 命令中 which、whereis、locate 命令的用法
which 命令 which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置.它一般用来确认系统中是否安装了指定的软件. (1)命令格式 which 可执行文件名称 wherei ...
- win10上安装mysql8(installer方式)并创建用户开启远程连接
1.进去mysql官网,下载mysql安装工具: 2.运行下载的mysql-installer-community-8.0.17.0.msi,一次往下执行就好了,以下是几个注意的点: 后面还有个地方就 ...
- 借助工具解决DNS污染
我第一次接触到DNS污染,是在GitHub上面进行学习的时候,发现头像加载出问题,加载失败,而且文档里面的图片也无法显示...... 百度了很多内容,差不多都试了一下,最终选择了使用DNS工具去解决 ...
- 【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ
题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...