HDLBits练习汇总-02-Verilog语言--向量部分(二)

简介: HDLBits练习汇总-02-Verilog语言--向量部分

Vector3(部分选择)


使用部分选择来选择向量的部分。串联运算符{a,b,c}用于通过将向量的较小部分串联在一起来创建更大的向量。

{3'b111,3'b000} => 6'b111000
{1'b1,1'b0,3'b101} => 5'b10101
{4'ha,4'd10} => 8'b10101010 // 4'ha和4'd10均为二进制的4'b1010

串联需要知道每个分量的宽度(或者您怎么知道结果的长度?)。因此,{1、2、3}是非法的,并导致出现错误消息:串联中不允许使用不定尺寸的常量。

可以在分配的左侧和右侧使用串联运算符。

input [15:0] in;
output [23:0] out;
assign {out[7:0], out[15:8]} = in;         // Swap two bytes. Right side and left side are both 16-bit vectors.
assign out[15:0] = {in[7:0], in[15:8]};    // This is the same thing.
assign out = {in[7:0], in[15:8]};       // This is different. The 16-bit vector on the right is extended to
                                        // match the 24-bit vector on the left, so out[23:16] are zero.
                                        // In the first two examples, out[23:16] are not assigned

A Bit of Practice


给定几个输入向量,将它们连接在一起,然后将它们分成几个输出向量。有六个5位输入向量:a,b,c,d,e和f,总共有30位输入。有四个8位输出向量:w,x,y和z,用于32位输出。输出应该是输入向量的串联,后跟两个1位:

image.png

module top_module (
    input [4:0] a, b, c, d, e, f,
    output [7:0] w, x, y, z );//
    assign {w,x,y,z} = { a, b, c, d, e, f,2'b11};
endmodule

矢量反转


给定8位输入向量[7:0],请反转其位顺序。

tips:

分配out [7:0] = in [0:7]; 由于Verilog不允许翻转向量位顺序,因此无法正常工作。

串联运算符可以节省一些编码,允许使用1个assign语句而不是8个。

module top_module( 
    input [7:0] in,
    output [7:0] out
);
    assign out = {in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]};
endmodule

复制运算符


所述并置(或者复制)运算符允许矢量串联起来以形成更大的载体。但是有时候您想将同一事物连接在一起很多次,而做类似分配a = {b,b,b,b,b,b,b}的事情仍然很乏味;。复制运算符允许重复一个向量并将它们串联在一起:

{num {vector}}

这种复制载体由NUM倍。num必须为常数。两组嵌套都是必需的。

Examples:

{5{1'b1}}           // 5'b11111 (or 5'd31 or 5'h1f)
{2{a,b,c}}          // The same as {a,b,c,a,b,c}
{3'd5, {2{3'd6}}}   // 9'b101_110_110. It's a concatenation of 101 with
                    // the second vector, which is two copies of 3'b110.

一个复制运算符的常见用法是将一个较小的数字符号扩展为一个较大的数字,同时保留其符号值。这是通过将较小数字的符号位(最高有效位)复制到左侧来完成的。例如,符号扩展4’B 0 101(5),以8位结果在8’b 0000 0101(5),而符号扩展4’B 1 101在(-3)至8位结果8’b 1111 1101(-3)。

建立一个将8位数字符号扩展为32位的电路。这需要串联24个符号位的副本(即,复制bit [7] 24次),然后是8位数字本身。

module top_module (
    input [7:0] in,
    output [31:0] out );//
    assign out = { {24{in[7]}} ,in };
endmodule

复制操作


给定五个1位信号(a,b,c,d和e),在25位输出向量中计算所有25个成对的一位比较。如果要比较的两位相等,则输出应为1。

image.png

如图所示,使用复制和串联运算符可以更轻松地完成此操作。

顶部向量是每个输入的5个重复的串联谁

底部向量是5个重复的输入

module top_module (
    input a, b, c, d, e,
    output [24:0] out );//
    // The output is XNOR of two vectors created by 
    // concatenating and replicating the five inputs.
    assign out = ~{{5{a}} ,{5{b}} ,{5{c}} ,{5{d}} ,{5{e}}} ^ { {5{a,b,c,d,e}} };
endmodule
目录
相关文章
|
3月前
|
程序员
R 语言教程 之 R 基础运算 1
本章介绍R语言的基础运算,包括赋值(使用`<-`或`=`)和主要的数学运算符,如加、减、乘、除、乘方、整除及求余等,并通过实例演示了这些运算符的使用方法和运算优先级。
77 6
|
3月前
R 语言教程 之 R 基础运算 2
《R 语言教程 之 R 基础运算 2》介绍了 R 语言中的关系运算符及其使用方法。通过示例展示了如何利用 >、<、==、!=、>=、<= 等运算符比较两个向量的对应元素,并返回布尔值结果。
42 3
|
3月前
R 语言教程 之 R 基础运算 4
本章《R基础运算》介绍了R语言中的简单运算,重点讲解了赋值运算符的使用方法,包括向左、向右及等于赋值,并通过实例演示了不同赋值方式的效果。
44 1
|
3月前
R 语言教程 之 R 基础运算 5
本章介绍R语言的基础运算,涵盖简单的算术运算及特殊运算符,如冒号(:)创建数字序列、%in%判断元素是否存在于向量中、%*%进行矩阵乘法等,并通过实例演示这些运算符的使用方法。
54 1
|
3月前
R 语言教程 之 R 基础运算 3
本章介绍R语言的基础运算,涵盖逻辑运算符的使用,包括按元素逻辑与(&)、逻辑或(|)、逻辑非(!)及仅比较首个元素的逻辑与(&&)和逻辑或(||)运算符。通过实例演示了这些运算符在向量上的应用及其返回的布尔值结果。
56 2
|
3月前
|
C语言
R 语言教程 之 R 基础运算 7
本章《R基础运算》介绍了R语言中的基本数学运算,包括取整、三角及反三角函数,以及正态分布等概率分布函数的使用方法。通过具体实例演示了这些函数在实际操作中的应用,如取整函数`round()`, `ceiling()`, `floor()`的特性,以及正态分布函数`dnorm()`, `pnorm()`, `qnorm()`, `rnorm()`的功能与区别。适合初学者快速掌握R语言的基础数学处理能力。
47 0
|
3月前
|
机器学习/深度学习
R 语言教程 之 R 基础运算 6
本章《R基础运算》介绍了R语言中的基本数学运算与函数,包括求平方根、自然指数、对数等常用函数,并通过实例展示了这些函数的具体应用。例如,`sqrt(4)`返回2,`exp(1)`返回约2.718282等。
51 0
|
8月前
|
存储 C语言
【学习笔记】verilog HDL之二:数据类型与表达式
本文介绍了Verilog语言中的常量、变量和表达式。Verilog有四种基本值:0、1、x(未知)和z(高阻)。整型常量有十进制和基数两种格式,实数型常量包括浮点数,字符串常量由双引号括起的字符序列构成。变量分为线网型和寄存器型,线网型包括wire、tri等11种类型,寄存器型有reg、integer、time等,其中reg可声明存储器。表达式中的操作数包括常数、参数、线网等8种类型,操作符包括算术、关系、逻辑等9种类型。
|
9月前
火山中文编程 -- 循环语句
火山中文编程 -- 循环语句
65 0
|
C语言
码蹄杯语言基础:公式与计算(C语言)
码蹄杯语言基础:公式与计算(C语言)
107 0