Verilog的基本用法


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.数制的字母表示

字母代表含义
h十六进制
d十进制
o八进制
b二进制
例子:
数字表达式:<位宽><进制><数字>

eg. 4’b1110 表示4位二进制数1110

10’d0表示10位宽的数值0,0000000000

10‘d15,则表示十进制15, 0000001111。


2.位拼接运算符:

z={x,y}z<={x,y}
若x=1110,y=0101,则z=11100101。


3.仿真精度 `timescale 1ns/1ps

先回忆一下秒数的进制转换:
1s = 103ms = 106us = 109ns = 1012ps
`timescale 仿真时间单位/时间精度


4. `define 的使用

参数定义常用的三种方法:
(1)define
(2)localparam
(3)parameter
define 与localparam和parameter最大的区别就是define 可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。


5. 异或运算符

在Verilog中^代表异或运算。


6. 小数的二进制表示

例:
( 1101.01 ) 2 = 1 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = 13.25 (1101.01)_2=1\times2^3+1\times2^2 +0\times2^1+1\times2^0+0\times2^{-1}+1\times2^{-2} = 13.25 (1101.01)2=1×23+1×22+0×21+1×20+0×21+1×22=13.25


7. 单端信号转差分信号

采用OBUFDS原语:

   OBUFDS OBUFDS_inst (
      .O(O),   // 1-bit output: Diff_p output (connect directly to top-level port)
      .OB(OB), // 1-bit output: Diff_n output (connect directly to top-level port)
      .I(I)    // 1-bit input: Buffer input
   );

在这里插入图片描述


8. bt1120格式中的同步码 EAV 、SAV

EAV(10bit)SAV(10bit)EAV(8bit)SAV(8bit)
有效区域2742009D80
消隐区域2D82ACB6AB

在这里插入图片描述


9. 原码、反码、补码

  • 原码: 原码的最高位为符号位,其余位均为数值位。
  • 反码: 正数的反码等于原码;负数的原码符号位不变,数值位按位取反即为负数的反码。
  • 补码: 正数的原码、反码、补码均相等;负数的反码+1即为补码;

10. 二进制数的加减乘除

10.1 二进制数的加减法

二进制数的加减法Verilog编写方法:

  1. 将要进行加减的数据全部转换为补码。
  2. 选取位宽最大的那个数据的位宽+1作为计算结果的位宽。
  3. 将要进行加减运算的补码拓展符号位(正数为0,负数为1)至计算结果的位宽。
  4. 计算结果中的最高位即为符号位,其余位则为计算结果数据位。(此时的数据仍为补码,可根据需求将补码转换为原码输出即可)。

举例如下:
(-10)+(-2)+3

  • -10的原码为1_1010,其反码为1_0101,则其补码为1_0110 ;
  • -2的原码为1_10,其反码为1_01,则其补码为1_10 ;
  • 3的原码为0_11,其反码、补码均为0_11 ;
  • 最大位宽为5,故选取最终计算结果的位宽为6;
  • 将-10的补码拓展至6位,即11_0110 ;
  • 将-2的补码拓展至6位,即1111_10 ;
  • 将3的补码拓展至6位,即0000_11 ;
  • 即(-10)+(-2)+3=11_0110+1111_10+0000_11=1_10111(补码) ,计算过程如下图所示 ;
  • 将1_10111转换为原码即为-9 。

在这里插入图片描述

10.2 二进制数的乘法

二进制数的乘法Verilog编写方法:

  1. 将所有乘数全部转换为补码。
  2. 计算结果的位宽为乘数的位宽之和。
  3. 将乘数的补码拓展符号位(正数为0,负数为1)至计算结果的位宽。
  4. 计算结果位宽中的最高位即为符号位,其余位则为计算结果数据位。(此时的数据仍为补码,可根据需求将补码转换为原码输出即可)。

举例如下:
(-2)*3

  • -2的原码为1_10,其反码为1_01,则其补码为1_10 ;
  • 3的原码为0_11,其反码、补码均为0_11 ;
  • -2的补码的位宽为3位,3的补码的位宽也为3位,故最终计算结果的位宽为3+3=6;
  • 将-2的补码拓展至6位,即1111_10 ;
  • 将3的补码拓展至6位,即0000_11 ;
  • 即(-2)3=1111_100000_11=10_111010(补码) ,计算过程如下图所示 ;
  • 因为计算结果的位宽为6位,因此只需取10_111010的低6位作为最终结果即可,即111010 。
  • 此时的111010 仍为补码,转换为原码即为100110,即-6。

在这里插入图片描述


11. &、&&以及单目运算符(&)的区别

  • &:按位与,即按位进行与。
  • &&:逻辑与
  • 单目运算符(&):如下所示
 reg [2:0] A;
 B= &A;B=((A[0]&A[1])&A[2])

12. “+:”、“-:”语法

reg [0 +: DATA_WIDTH] data;代表从0开始升序位宽为DATA_WIDTH。
即data[DATA_WIDTH-1:0]

  • +::位宽转换(升序)
********************Define***********************
reg [15:0] test_big_vect;
reg [0:15] test_little_vect;
*********************Question********************
test_big_vect[0 +:8]
test_little_vect[0 +:8] 
*********************Answer:***********************
test_big_vect[0 +:8] => test_big_vect[7:0]
test_little_vect[0 +:8] => test_little_vect[0:7]
  • -::位宽转换(降序)
********************Define***********************
reg [15:0] test_big_vect;
reg [0:15] test_little_vect;
*********************Question********************
test_big_vect[15 -:8]
test_little_vect[15 -:8] 
*********************Answer:***********************
test_big_vect[15 -:8] => test_big_vect[15:8]
test_little_vect[15 -:8] => test_little_vect[8:15]

13. `ifdef语法

`ifdef IMG_1080P
    parameter IMAGE_WIDTH_VALID  = 'd1920;
    parameter IMAGE_HEIGHT_VALID = 'd1080;
`elsif IMG_720P
    parameter IMAGE_WIDTH_VALID  = 'd1280;
    parameter IMAGE_HEIGHT_VALID = 'd720;
`else
    parameter IMAGE_WIDTH_VALID  = 'd1920;
    parameter IMAGE_HEIGHT_VALID = 'd1080;
`endif

14. bmp文件格式

bmp以小端方式存储,即低地址存放低位数据,高地址存放高位数据。且Windows有“补零”的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则在该位图每一行的十六进制码末尾“补”1至3个字节的“00”。

位置字节数描述
1-22头文件字段,为0x4D42
3-64整个.bmp的大小
7-104保留字段,为0
11-144图片信息的开始位置
15-184DIB header的大小,为0x28
19-224图片宽度
23-264图片高度
27-282色彩平面的数量,为1
29-302每个像素所占用的bit数
31-344采用何种压缩方式,通常为0
35-384原始位图数据的大小,对于不压缩的图片为0
39-424横向分辨率(像素/米)
43-464纵向分辨率(像素/米)
46-504调色板中的颜色数量,通常为0
51-544重要的颜色数量,通常为0,表示每种颜色都重要

在这里插入图片描述

  • 由于是小端模式,所以刚开始的两个字节为0x4D42

  • 表示整个.bmp文件大小的4个字节为0x005EEC36,即十进制的6220854,与文件常规属性里面显示的一致。
    在这里插入图片描述

  • 接下来的4个字节为保留字节,为0

  • 0x00000036即十进制的54,代表第54字节开始为有效的图像数据。


15. for循环的用法

Verilog中for循环的语法如下:

 for(循环变量赋初值;循环需要满足的条件;循环变量的增值) begin
	执行语句;
 end

例:

reg [10:0] cnt=0;
integer ii;

initial begin
    for ( ii=0 ;ii<15 ;ii=ii+1 ) begin
        wait(rst_n);
        cnt=cnt+1;
        @(posedge clk);
    end
end

代码运行结果如下图所示:

在这里插入图片描述


16. $fseek的用法

 <integer> = $fseek(<file_desc>, <offset_value>, <operation_number>);
  • integer: 定义整型变量,用于$fseek的返回值。如果$fseek成功执行,返回0; $fseek执行失败,返回-1。
  • file_desc: 为打开的文件句柄。
  • offset_value: 相对于文件的参考指针,偏移的位置, 可以是正数,也可以是负数。
  • operation_number: 定位文件指针的位置。 0,文件的起始位置;1,文件的当前位置; 2 文件结束的位置。

17. $fread的用法

integer <integer>;
<integer> = $fread(<store><file_desc>); 
<integer> = $fread(<store><file_desc>, <start> );
<integer> = $fread(<store><file_desc>, <start>, <count> );
<integer> = $fread(<store><file_desc>, , <count> );
  • integer: 定义整型变量,用于$fread的返回值。如果$fread成功执行,返回0; $fread执行失败,返回-1。
  • store: 将二进制文件中的数据读取到寄存器或者二维数组中。
  • file_desc: 为打开的文件句柄
  • start: 为二维数组的起始地址
  • count: 从起始地址开始, 写入二维数组的数量。

例:

integer code;
reg [7:0] mem [4:0];
integer fd;

initial
begin
    fd = $fopen("tinput.bmp", "r");
    code = $fread(mem, fd);	//表示从二进制文件中读取数据,依次存放到mem[0],mem[1],mem[2],mem[3]。
    code = $fread(mem, fd,1); //表示从二进制文件中读取数据,依次存放到mem[1],mem[2],mem[3]。
    code = $fread(mem, fd,1,2); //表示从二进制文件中读取数据,依次存放到mem[1],mem[2]。
    code = $fread(mem, fd, ,3); //表示从二进制文件中读取数据,依次存放到mem[0],mem[1],mem[2]。
end

18. if条件表达式

reg[31:0] bus;
reg bus_is_active ;

always@(posedge clk or negedge rst_n) begin 
 	if(bus) begin
 		bus_is_active <=1'b1;
 	end
	else  begin 
  		bus_is_active <=1'b1;
 	end
 end

针对上述代码,只要bus的值不为0,则bus_is_active 即为1。


19. DDR芯片型号

在这里插入图片描述
MT41K512M16芯片在MIG IP核中没有型号,作为替代可以选择两块MT41K512M8作为替换,仅需在选择数据位宽时选择正确的数据位宽即可。即在MIG IP配置时选择DATA WIDTH=16即可。


20. vivado中多线程编译设置

Windows下的Vivado默认线程数为2,Linux系统下的默认线程数为8。
可以通过以下tcl命令来获取当前的最大线程数:

 get_param general.maxthreads

在这里插入图片描述
可以通过以下tcl命令更改最大线程数:

set_param general.maxthreads 8

该方法在重启Vivado后最大线程数都会回到默认的2个。可以通过以下方式解决:

  1. 新建vivado_init.tcl文件。
  2. vivado_init.tcl文件中输入以下命令,如下所示:
 set_param general.maxThreads 8

在这里插入图片描述

  1. vivado_init.tcl文件放入以下路径。
    在这里插入图片描述
  2. 重启vivado即可。
    在这里插入图片描述

21. vivado生成网表文件

首先生成例化用的.v文件,针对2018.1之后版本:

write_verilog -mode synth_stub E:/test/ttt.v

若不含Xilinx IP则可通过如下命令生成edf文件:

write_edif E:/test/ttt.edf

若含Xilinx IP则需通过如下命令生成edf文件:

write_edif -security_mode all E:/test/ttt.edf
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值