【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
相关推荐
XiaoChaoZhiNeng15 小时前
基于Zynq SDIO WiFi移植二(支持2.4/5G)
5g·fpga·zynq·sdio
apple_ttt17 小时前
从零开始讲PCIe(6)——PCI-X概述
fpga开发·fpga·pcie
水饺编程18 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
linux·嵌入式硬件·fpga开发
apple_ttt19 小时前
从零开始讲PCIe(5)——66MHZ的PCI总线与其限制
fpga开发·fpga·pcie
最好有梦想~21 小时前
FPGA时序分析和约束学习笔记(2、FPGA时序传输模型)
fpga开发
IM_DALLA1 天前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL76
学习·fpga开发
诚实可靠小郎君95271 天前
FPGA IO延迟的约束与脚本
fpga开发·fpga·数字电路
日晨难再2 天前
AMBA:APB的历史(从APB1到APB5)
arm开发·arm·硬件工程·fpga·数字ic
GGGLF2 天前
FPGA-UART串口接收模块的理解
fpga开发
北京太速科技股份有限公司2 天前
太速科技-495-定制化仪器户外便携式手提触摸一体机
fpga开发