HDLbits进阶实战:解锁Verilog高阶特性与高效设计技巧
1. 条件运算符三目运算的妙用与陷阱Verilog中的条件运算符?:堪称硬件描述语言中的瑞士军刀它能在单行代码中实现if-else的逻辑判断。在HDLbits的Conditional练习题中我们需要找出四个8位输入中的最小值。用条件运算符可以写出这样的炫技代码assign min ((a b ? a : b) c ? (a b ? a : b) : c) d ? ((a b ? a : b) c ? (a b ? a : b) : c) : d;这种写法虽然紧凑但实际项目中我吃过它的亏。当设计需要综合成实际电路时这种嵌套条件运算符会导致组合逻辑层级过深影响时序收敛RTL可读性急剧下降后期维护困难综合工具可能生成非预期的优先级逻辑更推荐的做法是使用always块配合if-else语句或者分步计算中间结果。比如先比较a和b得到min_ab再比较min_ab和c得到min_abc最后比较min_abc和d。这样虽然代码行数增多但综合结果更可控也方便添加时序约束。注意在FPGA设计中组合逻辑深度最好控制在4级以内否则容易导致建立时间违例2. 归约操作符位运算的终极武器归约操作符是Verilog中处理位向量的利器它能将向量中的所有位进行某种逻辑运算后压缩成1位结果。在Reduction练习题中我们需要计算8位输入的奇偶校验位assign parity ^in; // 按位异或这个简单的运算符背后藏着硬件设计的智慧。当综合器看到归约操作时会自动生成最优化的树形结构逻辑。比如对于256位输入的奇偶校验用for循环需要255个时钟周期而用归约运算符能在单周期完成。在Gates100练习中我们进一步见识了归约操作符的威力assign out_and in; // 与归约 assign out_or |in; // 或归约 assign out_xor ^in; // 异或归约实际项目中我常用归约操作符来做总线使能信号生成enables错误检测^data作为简单校验状态机条件判断|alarm_flags3. 组合for循环硬件描述中的魔法Verilog中的for循环在综合时会自动展开这点与软件编程有本质区别。在Vector100r练习中我们需要将100位向量反转always(*) begin for(i 0; i 99; i i 1) begin out[i] in[99 - i]; end end综合器会将其展开为100条并行赋值语句。这种写法比手动写100条赋值语句更优雅但要注意循环边界必须是常量循环体内不能有时序控制语句综合后的电路规模可能超出预期在Popcount255练习中我们实现了一个255位的人口计数器统计1的个数always(*) begin out 8d0; for(i 0; i 254; i i 1) begin out out in[i]; end end这个例子揭示了组合for循环的另一个重要特性循环体内的操作必须是可综合的组合逻辑。我曾在一个项目中误在组合for循环里使用了非阻塞赋值导致仿真通过但综合结果异常。4. Generate for循环参数化设计的核心Generate for是Verilog中真正的硬件循环它在 elaboration 阶段就完成展开。在Adder100i练习中我们构建了一个100位行波进位加法器generate genvar i; for(i 0; i 99; i i 1) begin:adder if(i 0) begin assign {cout[0], sum[0]} a[0] b[0] cin; end else begin assign {cout[i], sum[i]} a[i] b[i] cout[i-1]; end end endgenerate这里有几个关键点必须使用genvar作为循环变量每个循环实例需要命名如adder可以包含条件生成if-else在Bcdadd100练习中我们更进一步实现了100位BCD加法器generate genvar i; for(i 0; i 99; i i 1) begin:adder if(i 0) begin bcd_fadd u_bcd_fadd(.a(a[3:0]), .b(b[3:0]), .cin(cin), ...); end else begin bcd_fadd ui_bcd_fadd(.a(a[4*i3:4*i]), .b(b[4*i3:4*i]), ...); end end endgenerateGenerate for在实际项目中最有价值的应用是总线接口的自动生成存储器bank的实例化可配置IP核的实现我曾用generate for实现过一个参数化的DMA控制器通过改变参数就能生成8位、16位、32位不同版本大幅提高了代码复用率。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2430945.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!