【USTC】verilog 习题练习 36-40

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的最小值

Matlab 复制代码
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,可以直接通过归约运算符完成。 是的,你没有看错,真的有用的题干大概就这么一句......

Matlab 复制代码
module top_module (
    input [7:0] in,
    output parity); 
	assign parity = ^in;
endmodule

38 D触发器

题目描述

D触发器是一种在时钟信号的边缘(通常是上升沿)存储位并定期更新的电路。在Verilog中,时序逻辑电路描述(一般语法为:always@(posedge clk))都会生成组合逻辑块加D触发器的电路结构。

D触发器是最简单的"组合逻辑后跟一个触发器"形式,其中组合逻辑部分只是一根导线。

创建verilog模块,实现一个D触发器。

输入格式

时钟clk,1位的d

输出格式

1位的q

Matlab 复制代码
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,寄存器输出信号

Matlab 复制代码
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

Matlab 复制代码
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
相关推荐
电子凉冰9 小时前
FPGA强化- HDMI显示器驱动设计与验证
fpga开发
讽刺人生Yan12 小时前
RFSOC学习记录(六)混频模式分析
学习·fpga·rfsoc
FPGA-李宇航12 小时前
RAM和ROM的定义和区别总结!!!
fpga开发
FPGA_小田老师15 小时前
FPGA状态机设计实战:从概念到可靠实现的完整指南
fpga开发·状态机·锁存器·寄存器·可乐售卖机·状态机实战
云雾J视界16 小时前
6G通信基站原型开发:Stratix 10 SoC片上128位AXI总线优化与400G加密引擎实现
fpga开发·soc·加密引擎·axi4总线·hyperflex架构·32核并行架构
江蘇的蘇18 小时前
UltraScale/+ FPGA实现万兆网的两种方式:GT核、10G Ethernet Subsystem核
fpga开发
骁的小小站1 天前
Verilator 和 GTKwave联合仿真
开发语言·c++·经验分享·笔记·学习·fpga开发
知识充实人生1 天前
时序收敛方法一:控制集优化
stm32·单片机·fpga开发
FPGA_ADDA1 天前
小尺寸13*13cmRFSOC47DR数模混合信号处理卡
fpga开发·信号处理·射频采集·rfsoc·高速adda·8发8收
讽刺人生Yan1 天前
RFSOC学习记录(五)带通采样定理
学习·fpga·rfsoc