【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; // 三态门

((sel1:0 == 2'h0) ? a : (sel1: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。有时,您需要创建一个对一个向量的所有位进行操作的逻辑门,如(a0&a1&a2&a3...),如果向量很长的话,也会很麻烦。归约运算符可以对向量的位进行AND、OR和XOR运算,产生一位输出:

& a3:0 // AND: a3&a2&a1&a0. Equivalent to (a3:0 == 4'hf)

| b3:0 // OR: b3|b2|b1|b0. Equivalent to (b3:0 != 4'h0)

^ c2:0 // XOR: c2^c1^c0

这些是只有一个操作数的单目运算符(类似于NOT运算符!和~)。您还可以反转这些门的输出来创建NAND、NOR和XNOR门,例如(~&d7: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
相关推荐
IT信息时代22 分钟前
FPGA技术未来竞争发展出路
fpga开发
昆山森启智能科技有限公司3 小时前
FPGA控制器
fpga开发
昆山森启智能科技有限公司3 小时前
基于深度学习GPU(ORIN NX)+FPGA双光谱视频处理模块
人工智能·深度学习·fpga开发
LCMICRO-133108477464 小时前
国产长芯微LD151完全P2P替代ADP151,是一款超低噪声、低压差线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·电子工程师·线性稳压器·adp151
X_xcccc18 小时前
2026高端FPGA选型指南与核心供应商解析
fpga开发
Terasic友晶科技1 天前
【教程】Agilex 5 SOC FPGA的HPS端如何响应FPGA端中断(二)——修改Quartus工程(GHRD工程)
fpga开发·terasic·agilex 5 soc·ghrd工程
sramdram1 天前
FPGA系统SRAM外扩芯片选型与工程应用要点
fpga开发·sram·fpga系统·外扩芯片·sram外扩芯片
明德扬1 天前
FPGA下载成功但上电不运行怎么查?配置Flash、启动模式与电源时序
fpga开发·fpga
努力搬砖的小H1 天前
FPGA应用技巧之DDR3读写自检方案设计与IP仿真总结
经验分享·功能测试·fpga开发·modelsim·ddr3
bingcheby1 天前
PS通过AXI总线控制PL的LED灯实验之四---编程下载调试
驱动开发·fpga开发·iar