条件语句、循环语句.ppt

上传人:xin****828 文档编号:6574692 上传时间:2020-02-29 格式:PPT 页数:58 大小:233.05KB
返回 下载 相关 举报
条件语句、循环语句.ppt_第1页
第1页 / 共58页
条件语句、循环语句.ppt_第2页
第2页 / 共58页
条件语句、循环语句.ppt_第3页
第3页 / 共58页
点击查看更多>>
资源描述
1 第5章条件语句 循环语句 块语句与生成语句 2 5 1条件语句 if else语句 if语句是用来判定所给定的条件是否满足 根据判定的结果 真或假 决定执行给出的两种操作之一 VerilogHDL语言提供了三种形式的if语句 3 1 if 表达式 语句例如 if a b out1b out1 int1 elseout1 int2 4 3 if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 elseif 表达式m 语句m else语句n 5 注意 书上6点 在if和else后面可以包含一个内嵌的操作语句 如上例 也可以有多个操作语句 此时用begin和end这两个关键词将几个语句包含起来成为一个复合块语句 if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套 应当注意if与else的配对关系 else总是与它上面的最近的if配对 如果if与else的数目不一样 为了实现程序设计者的企图 可以用begin end块语句来确定配对关系 6 if index 0 for scani 0 scani0 begin display memory scani 0 endelse WRONG display error indexiszero 尽管程序设计者把else写在与第一个if 外层if 同一列上 希望与第一个if对应 但实际上else是与第二个if对应 因为它们相距最近 7 正确的写法应当是这样的 if index 0 beginfor scani 0 scani0 begin display memory scani 0 endendelse WRONG display error indexiszero 8 modulecounter16 q clk output 3 0 q inputclk reg 3 0 q always posedgeclk q q 1 b1 endmodule 一位16进制计数器 9 modulecounter16b q clk clr output 3 0 q inputclk clr reg 3 0 q 4 b0000 ModelSim仿真用 QuartusII不用初值always posedgeclkorposedgeclr beginif clr q 4 b0000 elseq q 1 b1 endendmodule 一位16进制计数器 增加清零端 10 modulecounter10b q clk clr output 3 0 q inputclk clr reg 3 0 q 4 b0000 ModelSim仿真用 QuartusII不用初值always posedgeclkorposedgeclr beginif clr q 4 b0000 elsebeginif q 4 b1001 q 4 b0000 elseq q 1 b1 endendendmodule 11 modulecounter10c q c clk clr output 3 0 q outputc inputclk clr reg 3 0 q 4 b0000 ModelSim仿真用 QuartusII不用初值regc 1 b0 12 always posedgeclkorposedgeclr beginif clr beginq 4 b0000 c 1 b0 endelse 13 beginif q 4 b1000 beginq q 1 b1 c 1 b1 endelseif q 4 b1001 beginq 4 b0000 c 1 b0 endelsebeginq q 1 b1 c 1 b0 endendendendmodule 14 case语句case语句是一种多分支选择语句 if语句只有两个分支可供选择 而实际问题中常常需要用到多分支选择 Verilog语言提供的case语句直接处理多分支选择 它的一般形式如下 1 case 表达式 endcase2 casez 表达式 endcase3 casex 表达式 endcasecase分支项的一般格式如下 分支表达式 语句缺省项 default项 语句 15 case括弧内的表达式称为控制表达式 case分支项中的表达式称为分支表达式 控制表达式通常表示为控制信号的某些位 分支表达式则用这些控制信号的具体状态值来表示 因此分支表达式又可以称为常量表达式 2 当控制表达式的值与分支表达式的值相等时 就执行分支表达式后面的语句 如果所有的分支表达式的值都没有与控制表达式的值相匹配的 就执行default后面的语句 3 default项可有可无 一个case语句里只准有一个default项 4 case语句各分支表达式间未必是并列互斥关系 允许出现多个分支取值同时满足case表达式的情况 这种情况下将执行最先满足表达式的分支项 然后跳出case语句 不再检测其余分支项目 16 5 执行完case分项后的语句 则跳出该case语句结构 终止case语句的执行 6 在用case语句表达式进行比较的过程中 只有当信号的对应位的值能明确进行比较时 比较才能成功 因此要注意详细说明case分项的分支表达式的值 7 case语句的所有表达式的值的位宽必须相等 只有这样控制表达式和分支表达式才能进行对应位的比较 一个经常犯的错误是用 bx bz来替代n bx n bz 这样写是不对的 因为信号x z的缺省宽度是机器的字节宽度 通常是32位 此处n是case控制表达式的位宽 17 moduletest case reg 1 0 select initialbeginselect 2 b01 case select 2 b01 display second2b01 2 b01 display third2b01 2 b01 2 b00 display 2b01 2 b11 display 2b11 default display default endcaseendendmodule 18 moduleexb5 1 reg 1 2 select reg 3 0 result always select begincase select 1 2 2 b00 result 0 2 b01 result 4 b0001 2 b0 x 2 b0z result 4 b0 x0z 2 b10 result 4 b0010 2 bx0 2 bz0 result 4 bx0z0 default result 4 bxxxx endcaseend 19 initialbeginselect 2 b00 100 select 2 b01 100 select 2 b00 100 select 2 b0 x 100 select 2 b00 100 select 2 b0z 100 select 2 bx0 100 select 2 b11 endendmodule 20 case语句与if else if语句的区别主要有两点 与case语句中的控制表达式和多分支表达式这种比较结构相比 if else if结构中的条件表达式更为直观一些 2 对于那些分支表达式中存在不定值x和高阻值z位时 case语句提供了处理这种情况的手段 VerilogHDL针对电路的特性提供了case语句的其它两种形式用来处理case语句比较过程中的不必考虑的情况 don tcarecondition 其中casez语句用来处理不考虑高阻值z的比较过程 casex语句则将高阻值z和不定值都视为不必关心的情况 所谓不必关心的情况 即在表达式进行比较时 不将该位的状态考虑在内 这样在case语句表达式进行比较时 就可以灵活地设置以对信号的某些位进行比较 21 22 例5 3reg 7 0 ir casez ir 8 b1 instruction1 ir 8 b01 instruction2 ir 8 b00010 instruction3 ir 8 b000001 instruction4 ir endcase 23 moduletest casex reg 1 0 select always select begincasex select 2 b01 display t2b01 time 2 b10 display t2b10 time 2 b00 display t2b00 time 2 b11 display t2b11 time default display tdefault time endcaseend 24 initialbeginselect 2 b00 100 select 2 b01 100 select 2 bzx 100select 2 b1x endendmodule 25 modulemux4 to 1b out i0 i1 i2 i3 s1 s0 output 1 0 out input 1 0 i0 i1 i2 i3 inputs1 s0 reg 1 0 out always s1ors0ori0ori1ori2ori3 begincase s1 s0 2 b00 out i0 2 b01 out i1 2 b10 out i2 2 b11 out i3 default out 2 bxx endcaseendendmodule 26 modulet mux4 to 1b reg 1 0 i0 i1 i2 i3 regs1 s0 wire 1 0 out mux4 to 1bu1 out i0 i1 i2 i3 s1 s0 initialforki0 2 b00 i1 2 b01 i2 2 b10 i3 2 b11 s0 1 b0 s1 1 b0 27 100s0 1 b1 100s1 1 b0 200s0 1 b0 200s1 1 b1 300s0 1 b1 300s1 1 b1 500s0 1 bz 500s1 1 bx joinendmodule 28 VerilogHDL设计中容易犯的一个通病是由于不正确使用语言 生成了并不想要的锁存器 always alord 有锁存器beginif al q d endalways alord 无锁存器beginif al q d elseq 0 end 29 有锁存器always sel 1 0 oraorb case sel 1 0 2 b00 q a 2 b11 q b endcase 无锁存器always sel 1 0 oraorb case sel 1 0 2 b00 q a 2 b11 q b default q b0 endcase 30 5 5循环语句 循环语句在VerilogHDL中存在着四种类型的循环语句 用来控制执行语句的执行次数 foreverrepeatwhilefor 31 forever regclock initialbeginclock 1 b0 forever 10clock clock end 产生周期为20个单位时间的时钟信号 32 repeat语句 repeat语句的格式如下 repeat 表达式 语句 或repeat 表达式 begin多条语句 end 33 实现乘法器moduletest repeat parametersize 8 longsize 16 reg size 1 opa opb reg longsize 1 result initialbeginopa 8 ha2 opb 8 h3f 100 opa 8 hf5 opb 8 hc6 end 34 always opaoropb begin multreg longsize 1 shift opa shift opb shift opa opa shift opb opb result 0 repeat size beginif shift opb 1 result result shift opa shift opa shift opa 1 endendendmodule 35 while语句while语句的格式如下 while 表达式 语句 或用如下格式 while 表达式 begin多条语句 end 36 对rega中值为1的位进行计数begin count1sreg 7 0 tempreg count 0 tempreg rega while tempreg beginif tempreg 0 count count 1 tempreg tempreg 1 endend 37 for语句 初始化memory型变量begin init memreg 7 0 tempi for tempi 0 tempi memsize tempi tempi 1 memory tempi 0 end 38 parametersize 8 longsize 16 reg size 1 opa opb reg longsize 1 result begin multintegerbindex result 0 for bindex 1 bindex size bindex bindex 1 if opb bindex result result opa bindex 1 end 39 对rega这个八位二进制数中值为1的位进行计数的另一种方法 begin count1sreg 7 0 tempreg count 0 for tempreg rega tempreg tempreg tempreg 1 if tempreg 0 count count 1 end 40 5 6命名块的禁用 Verilog通过关键字disable提供了一种终止命名块执行的方法 可用来从循环中退出 处理错误条件以及根据控制信号来控制某些代码段是否被执行 对块语句的禁用导致紧接在块后面的那条语句被执行 41 从矢量标志寄存器的低有效位开始查找第一个值为1的位moduleex5 13 reg 15 0 flag integeri 用于计数的整数initialbeginflag 16 b0010 0000 0000 0000 i 0 42 begin block1 while循环声明中的主模块是命名块block1while i 16 beginif flag i begin display EncounteredaTRUEbitatelementnumber d i disableblock1 在标志寄存器中找到了值为真 1 的位 禁用block1endi i 1 endendendendmodule 43 5 7生成块 生成语句可以动态地生成Verilog代码 使用生成语句能够大大简化程序的编写过程 Verilog中有3种创建生成语句的方法 循环生成条件生成case生成 44 循环生成语句例对两个N位总线变量进行按位异或 modulebitwise xor out i0 i1 参数声明语句 参数可以重新定义parameterN 32 缺省的总线位宽为32位 端口声明语句output N 1 0 out input N 1 0 i0 i1 声明一个临时循环变量 该变量只用于生成块的循环计算 Verilog仿真时该变量在设计中并不存在genvarj 45 用一个单循环生成按位异或的异或门 xor generatefor j 0 j N j j 1 begin xor loopxorg1 out j i0 j i1 j end 在生成块内部结束循环endgenerate 结束生成块endmodule 46 modulebitwise xor2 out i0 i1 parameterN 32 缺省的总线位宽为32位output N 1 0 out input N 1 0 i0 i1 genvarj 声明一个临时循环变量 异或门可以用always块来替代reg N 1 0 out generatefor j 0 j N j j 1 begin bitalways i0 j ori1 j out j i0 j i0 j endendgenerateendmodule 47 循环生成语句若干特点 1 在仿真开始之前 仿真器会对生成块中的代码进行确立 展平 将生成块转换为展开代码 然后对展开的代码进行仿真 因此 生成块的本质是使用循环内的一条语句来代替多条重复的Verilog语句 简化用户的编程 2 关键词genvar用于声明生成变量 生成变量只能用在生成块中 在确立后的仿真码中 生成变量是不存在的 3 一个生成变量的值只能由循环生成语句来改变 4 循环生成语句可以嵌套使用 不过使用同一个生成变量作为索引的循环生成语句不能相互嵌套 5 xor loop是赋予循环生成语句的名字 目的在于通过它对循环生成语句之中的变量进行层次化引用 因此 循环生成语句中各个异或门的相对层次名为 xor loop 0 g1 xor loop 1 g1 xor loop 31 g1 48 本模块生成一个门级脉动加法器moduleripple adder co sum a0 a1 ci 参数声明语句 参数可以重新定义 parameterN 4 缺省的总线位宽为4 端口声明语句output N 1 0 sum outputco input N 1 0 a0 a1 inputci wire N 0 carry 此处修改assigncarry 0 ci 49 genvari 用一个单循环生成按位异或门等逻辑generatefor i 0 i N i i 1 begin r loopwiret1 t2 t3 xorg1 t1 a0 i a1 i xorg2 sum i t1 carry i andg3 t2 a0 i a1 i andg4 t3 t1 carry i org5 carry i 1 t2 t3 end 生成块内部循环的结束endgenerate 生成块的结束assignco carry N endmodule 50 xor r loop 0 g1 r loop 1 g1 r loop 2 g1 r loop 3 g1 r loop 0 g2 r loop 1 g2 r loop 2 g2 r loop 3 g2 and r loop 0 g3 r loop 1 g3 r loop 2 g3 r loop 3 g3 r loop 0 g4 r loop 1 g4 r loop 2 g4 r loop 3 g4 or r loop 0 g5 r loop 1 g5 r loop 2 g5 r loop 3 g5上面生成的实例用下面这些生成的线网连接起来Nets r loop 0 t1 r loop 0 t2 r loop 0 t3r loop 1 t1 r loop 1 t2 r loop 1 t3r loop 2 t1 r loop 2 t2 r loop 2 t3r loop 3 t1 r loop 3 t2 r loop 3 t3 51 条件生成语句 本模块实现一个参数化乘法器modulemultiplier product a0 a1 参数声明 该参数可以重新定义parametera0 width 8 parametera1 width 8 本地参数声明 本地参数不能用参数重新定义 defparam 修改 也不能在实例引用时通过传递参数语句 即 参数1 参数2 的方法修改localparamproduct width a0 width a1 width 52 端口声明语句output product width 1 0 product input a0 width 1 0 a0 input a1 width 1 0 a1 有条件地调用 实例引用 不同类型的乘法器 根据参数a0 width和a1 width的值 在调用时 引用相对应的乘法器实例 generateif a0 width 8 a1 width 8 cal multiplier a0 width a1 width m0 product a0 a1 elsetree multiplier a0 width a1 width m0 product a0 a1 endgenerate 生成块的结束endmodule 53 modulecal multiplier product a0 a1 parametera0 width 7 parametera1 width 7 localparamproduct width a0 width a1 width output product width 1 0 product input a0 width 1 0 a0 input a1 width 1 0 a1 reg product width 1 0 product always a0ora1 beginproduct a0 a1 display Thisiscal multiplier endendmodule 54 moduletree multiplier product a0 a1 parametera0 width 8 parametera1 width 8 localparamproduct width a0 width a1 width output product width 1 0 product input a0 width 1 0 a0 input a1 width 1 0 a1 reg product width 1 0 product always a0ora1 beginproduct a0 a1 display Thisistree multiplier endendmodule 55 moduletest multiplier wire 7 0 product reg 3 0 a0 a1 initialbegina0 4 ha a1 4 hb 100 a0 4 h2 a1 4 h3 endmultiplier 4 4 u1 product a0 a1 endmodule 56 moduletest multiplier2 parametera0 w 8 a1 w 8 localparamp m a0 w a1 w wire p m 1 0 product reg a0 w 1 0 a0 reg a1 w 1 0 a1 initialbegina0 8 h0a a1 8 h0b 100 a0 8 h20 a1 8 h30 endmultiplier a0 w a1 w u1 product a0 a1 endmodule 57 case生成语句 本模块生成N位的加法器moduleadder co sum a0 a1 ci 参数声明 本参数可以重新定义parameterN 4 缺省的总线位宽为4 端口声明output N 1 0 sum outputco input N 1 0 a0 a1 inputci 58 根据总线的位宽 调用 实例引用 相应的加法器 参数N在调用 实例引用 时可以重新定义 调用 实例引用 不同位宽的加法器是根据不同的N来决定的 generatecase N 当N 1 或2时分别选用位宽为1位或2位的加法器1 adder 1bitadder1 co sum a0 a1 ci 1位的加法器2 adder 2bitadder2 co sum a0 a1 ci 2位的加法器 缺省的情况下选用位宽为N位的超前进位加法器default adder cla N adder3 co sum a0 a1 ci endcaseendgenerate 生成块的结束endmodule
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!