【HDLbits刷题笔记 】05-verilog语法-更多verilog功能

条件三元运算符(Conditional ternary operator)

Verilog 有一个三元条件运算符 ( ? : ) 很像 C:

(条件 ? if_true : if_false)

这可用于根据一行上的条件(多路复用!)选择两个值之一,而无需在组合始终块中使用 if-then。

例子:
(0 ? 3 : 5) // This is 5 because the condition is false.
(sel ? b : a) // A 2-to-1 multiplexer between a and b selected by sel.

always @(posedge clk) // A T-flip-flop.
q <= toggle ? ~q : q;

always @(*) // State transition logic for a one-input FSM
case (state)
A: next = w ? B : A;
B: next = w ? A : B;
endcase

assign out = ena ? q : 1'bz; // A tri-state buffer

((sel[1:0] == 2'h0) ? a : // A 3-to-1 mux
(sel[1:0] == 2'h1) ? b :
c )

一点练习

给定四个无符号数字,找到最小值。无符号数字可以与标准比较运算符(a < b)进行比较。使用条件运算符制作双向最小电路,然后组合其中的几个以创建 4 路最小电路。您可能需要一些用于中间结果的线向量。

归约运算符(Reduction operators)

您已经熟悉两个值之间的按位运算,例如 a & b 或 a ^ b。有时,你想创建一个宽门,对一个向量的所有位进行操作,比如(a[0]和a[1]和a[2]和a[3]...),如果向量很长,这会变得乏味。

归约运算符可以对向量的位执行 AND、OR 和 XOR,从而产生一位输出:

& a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf)

| b[3:0] // OR: b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0)

^ c[2:0] // XOR: c[2]^c[1]^c[0]

这些是只有一个操作数的一运算符(类似于 NOT 运算符 ! 和 ~)。您还可以反转这些门的输出以创建NAND,NOR和XNOR门,例如(~& d[7:0])。

现在您可以重新访问4 输入门100 输入门.

一点练习

奇偶校验通常用作通过不完美通道传输数据时检测错误的简单方法。创建一个电路,该电路将计算 8 位字节的奇偶校验位(这将向该字节添加第 9 位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有 8 个数据位的 XOR。

Reduction:Even wider gates

构建一个具有 100 个输入的组合电路,在 [99:0] 中。

有 3 个输出:

  • out_and:100输入AND门的输出。

  • out_or:100输入OR门的输出。

  • out_xor:100输入异或门的输出。

组合电路for循环(Combinational for-loop):Vector reversal 2

给定一个 100 位输入向量 [99:0],反转其位顺序。

4.7 Verilog 循环语句 | 菜鸟教程 (runoob.com)

Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。

四种循环的表达式如下

while

while (condition) begin

end

for

for(initial_assignment; condition ; step_assignment) begin

end

repeat

repeat (loop_times) begin

end

forwever

forever begin

end

组合电路for循环(Combinational for-loop):255-bit population count

“总体计数”电路对输入向量中的“1”数进行计数。为255位输入向量构建一个人口计数电路。

generate for循环(Generate for-loop):100-bit binary adder 2

通过实例化 100 个完整加法器来创建 100 位二进制纹波进位加法器。加法器将两个 100 位数字和一个进位相加,以产生 100 位和并执行。为了鼓励您实际实例化全加器,还要在纹波进位加法器中输出每个全加器的带出。cout[99] 是最后一个完整加法器的最终结转,也是您通常看到的外转。

Generate for-loop:100-digit BCD adder

您将获得一个名为 bcd_fadd 的 BCD 一位数加法器,该加法器将两个 BCD 数字相加并结转,并生成总和和结转。

module bcd_fadd (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );

实例化 100 个副本bcd_fadd以创建 100 位 BCD 纹波进位加法器。您的加法器应添加两个 100 位 BCD 数字(打包到 400 位向量中)和一个携带,以生成 100 位的总和并执行

值得注意的是

4i+1的表述在verilog中是错误的
4*i+1中乘号不可省略

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿茶冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值