Verilog学习之时序控制、语句块(1)

embedded/2024/9/25 15:32:59/

推荐Verilog学习网址:

HDLbits

EDAPlayground

菜鸟教程

因为自己以前学过Verilog,现在要重新捡起来,所以就记录了一下不熟悉的部分。

时序控制

代码来自菜鸟教程4.3 Verilog 时序控制 | 菜鸟教程

1.时延控制

常规时延

#10  value1 = value_test;

内嵌时延

value1 =  #10   value_test;

value_test的当前值(而不是#10后的值),在#10后,赋给value1

`timescale 1ns/1nsmodule test ;reg  value_test ;reg  value_general, value_embed, value_single ;//signal sourceinitial beginvalue_test        = 0 ;#25 ;      value_test        = 1 ;#35 ;      value_test        = 0 ;        //absolute 60ns#40 ;      value_test        = 1 ;        //absolute 100ns#10 ;      value_test        = 0 ;        //absolute 110nsend//(1)general delay controlinitial beginvalue_general     = 1;#10 value_general  = value_test ; //10ns, value_test=0#45 value_general  = value_test ; //55ns, value_test=1#30 value_general  = value_test ; //85ns, value_test=0#20 value_general  = value_test ; //105ns, value_test=1end//(2)embedded delay controlinitial beginvalue_embed       = 1;value_embed  = #10 value_test ; //0ns, value_test=0value_embed  = #45 value_test ; //10ns, value_test=0value_embed  = #30 value_test ; //55ns, value_test=1value_embed  = #20 value_test ; //85ns, value_test=0endalways begin#10;if ($time >= 150) begin$finish ;endendendmodule

2.事件触发

1. @        敏感列表

e.g.        always@(clk)        //clk的上升沿与下降沿触发

              always@(posedge clk or negedge rst)        //clk的上升沿,rst的下降沿

              always@(posedge clk ,   negedge rst)

              always@(*)

2. event       (触发->)

event     start_receiving ;
always @( posedge clk_samp) begin-> start_receiving ;       //采样时钟上升沿作为时间触发时刻
endalways @(start_receiving) begindata_buf = {data_if[0], data_if[1]} ; //触发时刻,对多维数据整合
end

 

3.边沿触发

4.电平触发

initial beginwait (start_enable) ;      //等待 start 信号forever begin//start信号使能后,在clk_samp上升沿,对数据进行整合@(posedge clk_samp)  ;data_buf = {data_if[0], data_if[1]} ;      end
end

块语句

1.顺序块        begin end

2.并行块        fork  join

3.嵌套块

4.命名块

代码来自菜鸟教程4.4 Verilog 语句块 | 菜鸟教程

        begin:模块名

                int i;        // module名.模块名.i        就可以调用此变量

        end

模块名可以嵌套

`timescale 1ns/1nsmodule test;initial begin: runoob   //命名模块名字为runoob,分号不能少integer    i ;       //此变量可以通过test.runoob.i 被其他模块使用i = 0 ;forever begin#10 i = i + 10 ;       endendreg stop_flag ;initial stop_flag = 1'b0 ;always begin : detect_stopif ( test.runoob.i == 100) begin //i累加10次,即100ns时停止仿真$display("Now you can stop the simulation!!!");stop_flag = 1'b1 ;end#10 ;endendmodule

5.disable

disable可以终止命名块的执行,可以用来从循环中退出、处理错误等。

`timescale 1ns/1nsmodule test;initial begin: runoob_d //命名模块名字为runoob_dinteger    i_d ;i_d = 0 ;while(i_d <= 100) begin: runoob_d2# 10 ;if (i_d >= 50) begin       //累加5次停止累加disable runoob_d3.clk_gen ;//stop 外部block: clk_gendisable runoob_d2 ;       //stop 当前block: runoob_d2endi_d = i_d + 10 ;endendreg clk ;initial begin: runoob_d3while (1) begin: clk_gen  //时钟产生模块clk=1 ;      #10 ;clk=0 ;      #10 ;endendendmodule

disable在always或forever中使用时只能退出当前回合,下一次语句还是会在always或forever中执行。

casex/casez

casex 用 "x" 来表示无关值,casez 用问号 "?" 来表示无关值。

两者的实现的功能是完全一致的,语法与 case 语句也完全一致。

但是 casex、casez 一般是不可综合的,多用于仿真

repeat

repeat (循环次数) begin        //循环次数必须是常量

end

过程连续赋值

4.8 Verilog 过程连续赋值 | 菜鸟教程

过程连续赋值是过程赋值的一种。这种赋值语句能够替换其他所有 wire 或 reg 的赋值,改写了 wire 或 reg 型变量的当前值。

与过程赋值不同的是,过程连续赋值的表达式能被连续的驱动到 wire 或 reg 型变量中,即过程连续赋值发生作用时,右端表达式中任意操作数的变化都会引起过程连续赋值语句的重新执行

assign-deassign

assign(过程赋值操作)与 deassign (取消过程赋值操作)

赋值对象只能reg型

module dff_assign(input       rstn,input       clk,input       D,output reg  Q);always @(posedge clk) beginQ <= D ;       //Q = D at posedge of clockendalways @(negedge rstn) beginif(!rstn) beginassign Q = 1'b0 ; //在复位信号为 0 时,Q 端被 assign 语句赋值,始终输出为 0。endelse begin        //cancel the Q value overlaydeassign Q ;  //复位信号为 1 时,Q 端被deassign语句取消赋值,在时钟上升沿被重新赋值endendendmodule

force-release

force (强制赋值操作)与 release(取消强制赋值)

赋值对象可以是 reg 型变量,也可以是 wire 型变量。

因为是无条件强制赋值,一般多用于交互式调试过程,不要在设计模块中使用

当 force 作用在寄存器上时,寄存器当前值被覆盖;release 时该寄存器值将继续保留强制赋值时的值。之后,该寄存器的值可以被原有的过程赋值语句改变。

当 force 作用在线网上时,线网值也会被强制赋值。但是,一旦 release 该线网型变量,其值马上变为原有的驱动值

在 Verilog 中,端口隐式的声明为 wire 型变量。

模块例化

generate

可以对同一个模块进行重复例化

defparam

可以用关键字 defparam 通过模块层次调用的方法,来改写低层次模块的参数值。

defparam 一般也不可综合。

defparam     u_ram_4x4.MASK = 7 ;
ram_4x4    u_ram_4x4(.CLK    (clk),.A      (a[4-1:0]),.D      (d),.EN     (en),.WR     (wr),    //1 for write and 0 for read.Q      (q)    );
//在ram_4x4模块中,定义了parameter MASK = 3;

将新的参数值写入模块例化语句

(推荐该方法)

module  ram#(  parameter       AW = 2 ,parameter       DW = 3 )(input                   CLK ,input [AW-1:0]          A ,input [DW-1:0]          D ,input                   EN ,input                   WR ,    //1 for write and 0 for readoutput reg [DW-1:0]     Q);endmodule//例化:
ram #(.AW(4), .DW(4))u_ram(.CLK    (clk),.A      (a[AW-1:0]),.D      (d),.EN     (en),.WR     (wr),    //1 for write and 0 for read.Q      (q));

在编译器看来,如果有模块在端口声明时的参数,那么实体中的参数将视为 localparam 类型,使用 defparam 将不能改写模块实体中声明的参数。


http://www.ppmy.cn/embedded/29931.html

相关文章

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初&#xff0c;随着互联网的快速发展和信息量的急剧增加&#xff0c;人们开始感受到了获取和管理信息的挑战。以下是搜索引擎发展的主要阶段和关键事件&#xff1a; 早期搜索引擎&#xff08;1990s&#xff09;&#xff1a; 1990年&am…

VTK 的可视化方法:流线、流管、流面、流带

VTK 的可视化方法&#xff1a;流线、流管、流面、流带 VTK 的可视化方法&#xff1a;流线、流管、流面、流带三种相似的可视化方法流线生成使用的类实例&#xff1a;单一流线实例&#xff1a;流管实例&#xff1a;多条流线实例&#xff1a;流面实例&#xff1a;流带完整代码 VT…

C语言 循环语句 (2) do-while 循环语句

上文 C语言 循环语句 (1) 讲述循环概念演示while语句 我们讲述了循环的基本概念 且 演示了 while 循环语句 那么 本文 我们继续 我们来看 第二个循环语句 do-while 语句 语句结构如下图 先是 关键字 do 然后 执行循环结构 然后 while 表达式判断 执行流程图如下图 它的结…

速盾:cdn真的抗打吗?

CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;旨在提供高速、可靠的内容传输服务。它通过将内容存储在位于全球各地的服务器上&#xff0c;使用户可以从最近的服务器获取内容&#xff0c;从而提高访问速度和性能。然而&#xff0c;尽管…

Node.js -- MongoDB

文章目录 1. 相关介绍2. 核心概念3. 命令行交互3.1数据库命令3.2 集合命令3.3 文档命令 4. 数据库应用场景4.1 新增4.2 删除4.3 更新4.4 查询 5. 图形化工具Robo 3T 1. 相关介绍 一、简介 Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库&#xff0c;官方地址https://…

Nuxt3路由跳转

学习这篇文章之前&#xff0c;需要具备使用Nuxt3框架搭建基础项目 ,如果有这个基础可以跳过.直接看下面的声明式路由跳转 声明式路由跳转 创建两个基础文件 ~/pages/index.vue 和 ~/pages/About.vue ⚠️一定要是index.vue不能够大写Index.vue&#xff0c; 否则报错. <!--…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作&#xff0c;今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作&#xff0c;有助于更好理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

RISC-V异常处理相关内容

异常处理相关内容 异常处理相关内容异常处理准备工作异常处理函数Opensbi系统调用的注册异常处理相关内容 异常处理准备工作 这里需要特殊强调的是异常处理构建的相关内容: 这里会将a4寄存器中的值存储到CSR_MTVEC这个状态寄存器,也就是异常处理程序的的入口;如果遇到异常…