verilog中的wire

2023-10-29 12:20
文章标签 verilog wire

本文主要是介绍verilog中的wire,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、wire到底是什么?
    • 1.模块中wire连接输入输出
    • 2.wire的位宽
    • 3.申明一个wire
    • 4.wire位拼接
    • 5.wire位复制
  • 二、综合训练
  • 总结


前言

  在上一期中,我们讲解了verilog的基础语法。本文主要整理intel FPGA创新中心,FPGA初级工程师考试,verilog中wire数据类型考试的重点、难点。请同学们做好笔记!


一、wire到底是什么?

1.模块中wire连接输入输出

  verilog中的wire数据类型,可以看成是单向的物理连线。我们来看模块中,通过wire连接输入输出的情况。如下图1所示,通过单向的wire,从模块定义的入口,流向模块定义的出口。
在这里插入图片描述

图1. wire连接输入输出模块

  现在我们通过代码,实现图1中的连线,输入端in和输出端out,都没有声明数据类型,那么就默认其为wire数据类型。out=in表明:in作为驱动端,驱动着out改变信号,这就是连续赋值的物理意义。

module top_module( input in, output out );
assign out = in;
endmodule

  对应生活中的例子:你有两根线,现在你想把它们连接起来,但是线的距离不够打上一个结。于是,你需要一根额外的线,将它们连接起来。

在这里插入图片描述

图2. 物理连线

  我们来看看波形图,输入端作为驱动端,驱动着输出端改变。一般情况下,输入端需要有驱动源,比如时钟信号,输出随输入进行改变,如下图3。
在这里插入图片描述

图3. 图1模块仿真结果

  通过观察仿真信号,in和out信号是同步的,可以总结连续赋值:只要右边表达式任一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号。

2.wire的位宽

  在verilog中不申明位宽时,默认wire的位宽为1位。图4模块的输入是一个3位宽度的wire类型数据,从低位的0到高位的2,现在要把vec连续赋值给输出端outv,以及分别把vec[0]、vec[1]、vec[2]连续赋值给三个1位的输出端o0、o1、o2。
在这里插入图片描述

图4. 不同位宽wire模块
module top_module ( input wire [2:0] vec,output wire [2:0] outv,output wire o2,output wire o1,output wire o0  ); 
assign outv = vec;
assign o0 = vec[0];
assign o1 = vec[1];
assign o2 = vec[2];
endmodule

  从波形图中,vec是使用的十进制表示,vec与outv波形图肯定是一致的。我们再看看vec为2的时候o0、o1、o2情况是否正确,vec为2时的二进制为010,所以对应的o0为0、o1为1、o2为0,所以仿真的波形是没有问题的。
在这里插入图片描述

图5. 图4模块仿真结果

3.申明一个wire

  既然我们知道了wire数据类型以及wire的位宽,现在看看申明不同的wire。

wire [7:0] w;         // 8-bit 位宽的wire,没有指明是端口。
output wire [0:0] y;   // 1-bit 位宽的wire,指明为输出端口。
input wire [3:-2] z;  // 6-bit 位宽的wire 指明为输入端口,负值范围是允许的。
output [3:0] a;       // 4-bit 位宽的wire. 没有申明数据类型,默认为wire。
wire [0:7] b;         // 8-bit 位宽的wire,b[0] 是重要的bit位。

  注意:字节顺序是很重要,如[3:0]与[0:3]是不同的。当声明了[3:0]的一个wire类型,指明了高位3是符号位。

4.wire位拼接

{3'b111, 3'b000} => 6'b111000
{1'b1, 1'b0, 3'b101} => 5'b10101
{4'ha, 4'd10} => 8'b10101010     // 十进制和十六进制转二进制再拼接

  位拼接的时候必须指明位宽,如{1, 2, 3} 是不合法的,会报错误: unsized constants are not allowed in concatenations。

5.wire位复制

{5{1'b1}}           // 5'b11111 (or 5'd31 or 5'h1f)
{2{a,b,c}}          // 等同于{a,b,c,a,b,c}
{3'd5, {2{3'd6}}}   // 9'b101_110_110. 5-->101,6-->110,101和两个重复的110粘连起来。

  复制操作符的一个常见的场景是,将较小的位宽数字扩展为较大的位宽数字,同时保留其带符号的值。这是通过将较小位宽数字的符号位(最重要的位)复制到左边来实现的。例如,符号扩展4’b0101(5)到8位的结果是8’b00000101(5),而符号扩展4’b1101(-3)到8位的结果是8’b11111101(-3)。
  问题:构建一个将8位数字扩展到32位的电路。这需要连接符号位的24个副本(即,复制[7]位24次),然后是8位数字本身。注意:在有符号的二进制中最高位1表示负数,0表示正数。

module top_module (input [7:0] in,output [31:0] out );assign out = {{24{in[7]}},in[7:0]};//符号位复制24次,粘贴原来的数据比特
endmodule

二、综合训练

  问题描述:给定几个输入向量,将它们连接在一起,然后将它们分割成几个输出向量。有6个5位输入向量:a、b、c、d、e和f,总共有30位输入。对于32位的输出,有四个8位输出向量:w、x、y和z。输出应该是输入向量的连接,后面跟着两个1位,如图6所示。

在这里插入图片描述

图6. 位拼接示意图
module top_module (input [4:0] a, b, c, d, e, f,output [7:0] w, x, y, z );//assign w = {a,b[4:2]};//5位a加3位高位b,一共8位
assign x = {b[1:0],c,d[4]};//2位b加5位c加1位d,一共8位
assign y = {d[3:0],e[4:1]};//4位d加4位e,一共8位
assign z = {e[0],f,2'b11};//1位e加5位f加2位二进制11,一共8位
endmodule

在这里插入图片描述

图7. 综合训练仿真结果

总结

  以上是本期wire的重点、难点,后期将根据考试的真题进行更新。谢谢你的观看!

这篇关于verilog中的wire的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300616

相关文章

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

systemverilog、verilog的部分常用内部函数

1. $ceil 作用:将给定的实数或浮点数向上取整。示例:$ceil(3.2) 返回 4。 2. $floor 作用:将给定的实数或浮点数向下取整。示例:$floor(3.9) 返回 3。 3. $value$plusargs 作用:从命令行读取传递给仿真器的参数。格式:$value$plusargs("格式", 变量),格式 用来匹配命令行的参数,变量 是用来存储匹配到的值。示例:$

Verilog语法+:和-:有什么用?

Verilog语法+:和-:主要用于位选择,可以让代码更简洁。 一、位选择基础 在Verilog中,位选择可以通过直接索引来实现,例如: reg [7:0] data; wire select_a; wire [2:0] select_b;   assign select_a = data[3]; assign select_b = data[2:0]; 二、+: 和 -: 语法

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、

FPGA第 10 篇,Verilog 中的运算符和分支语句

前言 我们都知道 Verilog 作为一种硬件描述语言,不仅用于设计和仿真数字电路,还为开发者提供了强大的工具,用于控制和优化硬件的行为。其中运算符和分支语句是 Verilog 中的两大核心组成部分,它们负责执行逻辑操作、数学运算以及决定逻辑流的控制。 运算符 在 Verilog 中用于进行各种计算和逻辑操作,它们类似于软件编程中的运算符,但特定于硬件操作,涵盖了算术、逻辑、按位操作、移位操

verilog仿真激励

简介         本章节主要描述verilog激励仿真函数的介绍。 initial         主要针对寄存器初始化值,基本所有仿真都会使用到该语句,使用如下: initial beginsys_clk = 'd0; sys_rst_n = 'd0; #2000;sys_rst_n = 'd1; end repeat         重复有限次数地执行一段代码,使用如下:

51单片机-第十一节-DS18B20温度传感器(One_Wire单总线)

一、DS18B20温度传感器介绍: DS18B20是一种数字温度传感器。 测温范围:-55C - +125C 通信接口:1-Wire(单总线) 二、引脚及应用电路: 很简单,电源,接地,通讯接口。        三、内部结构: 总图: (1)备用电源 (2)器件地址 (3)控制器 (4)存储器 (5)存储器内部: B1,B2存储最低有效温度和最高有效温度。

verilog语法错误

1.写敏感列表always(@posedge or @negedge ext_rst_n),语法检查报错ERROR:HDLCompiler:806 - "E:\ISE14.6\Project\sp6\sp6ex1\source_code\sp6.v" Line 27: Syntax error near "(".仔细检查应为always @(posedge ext_clk_25m or neged

在使用VScode自动生成verilog testbench文件时,提示No module named 'chardet'

https://www.cnblogs.com/whylinux/p/9839162.html 解决方法为: pip install certifi pip install chardet pip install idna pip install urllib3

FPGA第 8 篇,硬件描述语言Verilog HDL,初识Verilog HDL

前言         我们都知道 FPGA 是一种高度可编程的集成电路,适用于实现各种数字逻辑功能,而 Verilog HDL是一种广泛使用的硬件描述语言(Hardware Description Language, HDL),主要用于数字电子系统的描述、仿真和综合,以及其他数字系统的逻辑设计。通过使用 Verilog,工程师可以高效地设计和验证 FPGA 电路,从而实现所需的数字系统功能。