36  条件运算符

题目描述

Verilog中有一个跟C语言中类似的三目条件运算符( ? : ),其语法格式为:
(condition ? if_true : if_false)
该表达式可以用于为其它信号赋值,例如:signal = condition ? if_true : if_false;
该语句等同于:
if(condition)  signal = if_true;
else         signal = if_false;
因涉及到3个操作数,并且能实现条件运算的功能,因此称为三目条件运算符。
下面是几个使用该运算符的例子:
(0 ? 3 : 5)     // 条件为假,因此表达式的值为5
(sel ? b : a)    // 二选一选择器
always @(posedge clk)         // 触发器
  q <= toggle ? ~q : q;
always @(*)                   // 有限状态机(FSM)
  case (state)
    A: next = w ? B : A;
    B: next = w ? A : B;
  endcase
assign out = ena ? q : 1'bz;  // 三态门
((sel[1:0] == 2'h0) ? a : (sel[1:0] == 2'h1) ? b : c ) //嵌套使用
试设计一计算最小值功能的Verilog模块,给定四个无符号数,求最小值。提示:
1. 可以综合使用比较运算符(< or >)和条件运算符(? :)。
2. 有必要的话,可以定义中心变量

输入格式

8bit a,b,c,d

输出格式

8bit min, 为 a,b,c,d的最小值

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min
);
    wire [7:0] min1,min2,min3;
    assign min1 = ( a > b ) ? b : a;
    assign min2 = ( c > d ) ? d : c;
    assign min3 = ( min1 > min2 ) ? min2 : min1;
    assign min = min3;
    
endmodule

37 归约运算符

题目描述

您已经熟悉了两个值之间的位运算,例如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])。
当传输数据使用的是一个不完美的渠道时,经常使用奇偶校验作为一种简单的方法来检测错误。创建一个将为8位字节计算奇偶校验位的电路(这将在字节中添加第9位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有8个数据位的异或。
那么,让我们进入正题:

输入格式

8位输入信号in

输出格式

1位输出信号parity=^in,可以直接通过归约运算符完成。 是的,你没有看错,真的有用的题干大概就这么一句……

【USTC】verilog 习题练习 36-40-LMLPHP

module top_module (
    input [7:0] in,
    output parity); 
	assign parity = ^in;
endmodule

38 D触发器

题目描述

D触发器是一种在时钟信号的边缘(通常是上升沿)存储位并定期更新的电路。在Verilog中,时序逻辑电路描述(一般语法为:always@(posedge clk))都会生成组合逻辑块加D触发器的电路结构。
D触发器是最简单的“组合逻辑后跟一个触发器”形式,其中组合逻辑部分只是一根导线。
【USTC】verilog 习题练习 36-40-LMLPHP
创建verilog模块,实现一个D触发器。

输入格式

时钟clk,1位的d

输出格式

1位的q

【USTC】verilog 习题练习 36-40-LMLPHP

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//
    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments
    always @(posedge clk) begin
        q <= d;
    end
endmodule

39 寄存器

题目描述

寄存器在本质上来说就是触发器,我们一般将由多个触发器构成的向量信号成为寄存器。试设计一个在时钟上升沿出发的8bit位宽的寄存器。

输入格式

一位宽线网型变量clk,时钟信号; 八位宽线网型变量d,寄存器输入信号;

输出格式

八位宽寄存器型变量q,寄存器输出信号

【USTC】verilog 习题练习 36-40-LMLPHP

module top_module (
    input 				clk,
    input [7:0] 		d,
    output reg [7:0] 	q
);
// 请用户在下方编辑代码
    always @(posedge clk) begin
        q <= d;
    end
//用户编辑到此为止
endmodule

40 有复位功能的寄存器

题目描述

创建一个带有复位信号(reset)的8bit位宽的寄存器,在触发信号(clk)的上升沿,当复位信号为高电平时,寄存器输出0,否则与输入信号d同步。
Hint:
在同一个always进程块中,同一触发信号只能使用一种边沿,即上升沿和下降沿不可同时使用。(例如:always@(posedge clk or negedge clk),这种写法是错误的)

输入格式

时钟信号clk, 同步复位信号reset, 8bit宽信号输入d

输出格式

8bit宽信号输出q

【USTC】verilog 习题练习 36-40-LMLPHP

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output reg [7:0] q
);
    //your code
    always @(posedge clk) begin
        if (reset) begin
            q <= 8'b0;
        end else begin
            q <= d;
        end
    end
endmodule
01-29 23:59