FPGA编程基础(一)--参数传递与寄存器使用

一、参数映射

参数映射的功能就是实现参数化元件。所谓的”参数化元件“就是指元件的某些参数是可调的,通过调整这些参数从而可实现一类结构类似而功能不同的电路。在应用中,很多电路都可采用参数映射来达到统一设计,如计数器、分频器、不同位宽的加法器以及不同刷新频率的VGA视频接口驱动电路等。

参数传递

参数传递就是在编译时对参数重新赋值而改变其值。传递的参数是子模块中定义的parameter,其传递方法有下面两种。

  • 时钟”#“符号

在同一模块中使用”#“符号。参数赋值的顺序必须与原始模块中进行参数定义的顺序相同,并不是一定要给所有的参数都赋予新值,但不允许跳过任何一个参数,即使是保持不变的值也要写在相应的位置。

module #(parameter1, parameter2) inst_name(port_map);

module_name #(.parameter_name(para_value), .parameter_name(para_value)) inst_name(port_map);

例:通过”#“字符实现一个模值可调的加1计数器

module cnt(
		input clk,
    input rst,
    output reg[15:0] cnt_o
    );
    //定义参数化变量
    parameter[15:0] Cmax = 1024;

		always @(posedge clk or negedge rst) begin
				if(!rst)
					cnt_o <= 0;
				else
					if(cnt_o == Cmax)
						cnt_o <= 0;
					else
						cnt_o <= cnt_o + 1;
		end

endmodule
module param_counter(
		input clk,
		input rst,
		output [15:0] cnt_o
    );

    //参数化调用,利用#符号将计数器的模值10传入被调用模块
    cnt #10 inst_cnt(
    		.clk(clk),
    		.rst(rst),
    		.cnt_o(cnt_o)
    		);
endmodule

  • 使用defparam关键字

defparam关键字可以在上层模块去直接修改下层模块的参数值,从而实现参数化调用,其语法格式如下:

defparam heirarchy_path.paramer_name = value;

这种方法与例化分开,参数需要写绝对路径来指定。参数传递时各个参数值的排列次序必须与被调用模块中各个参数的次序保持一致,并且参数值和参数个数也必须相同。

如果只希望对被调用模块内的个别参数进行更改,所有不需要更改的参数值也必须按对应参数的顺序在参数值列表中全部列出(原值拷贝)。

使用defparam语句进行重新赋值时必须参照原参数的名字生成成分级参数名。

例:通过”defparam“实现一个模值可调的加1计数器。

module param_counter(
		input clk,
		input rst,
		output [15:0] cnt_o
    );

    //参数化调用,利用#符号将计数器的模值10传入被调用模块
    cnt  inst_cnt(
    		.clk(clk),
    		.rst(rst),
    		.cnt_o(cnt_o)
    		);
     //同过defparam修改参数
     defparam inst_cnt.Cmax = 12;
endmodule

二、寄存器类型

寄存器变量,都有“寄存性”,即在接手下一次赋值前,将保持原值不变。寄存器型变量没有强度之分,且所有寄存器类变量都必须明确给出类型说明(无缺省状态),寄存器数据类型这里仅介绍两种常用类型。

  • reg:常用的寄存器型变量。用于行为描述中对寄存器类的说明,由过程赋值语句赋值;
  • Integer: 32位带符号整型变量

1、reg寄存器类型

寄存器数据类型reg是最常见的数据类型。寄存器可以取任意长度。reg型数据的缺省值是未知的,reg型数据可以为正值或负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当无符号值,即正值。如果一个4位的reg型数据被写入-1,在表达式中运算时,其值被认为是+15。例如:

reg [3:0] Comb;

Comb = -2; //Comb的值为14(1110),1110是-2的补码

2、integer寄存器类型

整数寄存器包含整数值。整数寄存器可以作为普通寄存器使用。使用整数型说明形式如下:

integer integer1, integer2,......integerN[msb:lsb];

integer Hist[3:6]; //一组四个寄存器

一个整数型寄存器可存储有符号数,并且算术操作符提供2的补码运算结果。整数不能作为向量访问。例如,对于上面的整数B的说明,B[6]和B[20:10]是非法的。一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取相应的位,如下:

reg [31:0] Breg;

integer Bint;

Breg = Bint;

上例说明了如果通过简单的赋值将整数装换为位向量。类型转型自动完成,不必使用特定的函数。从位向量到整数的转换也可以通过赋值完成。例如:

integer J;

reg [3:0] Bcq;

J = 6; //J的值为32‘b0000...00110

Bcq = J; //Bcq的值为4‘b0110

Bcq = 4‘d0101;

J = Bcq; //J的值为32’b0000...00101

J = -6; // J的值为32‘b1111...11010

Bcq = J ; //Bcq的值为4‘b1010

时间: 2024-10-10 05:18:51

FPGA编程基础(一)--参数传递与寄存器使用的相关文章

FPGA编程基础(二)--常用行为仿真描述

1.常用的行为仿真描述语句 利用循环完成遍历 for.while语句常用于完成遍历测试.当设计代码包含了多个工作模式,那么就需要对各种模式都机型遍历测试,如果手动完成每种模式的测试,则将造成非常大的工作量.利用for循环,通过循环下标来传递各种模式的配置,不仅可以有效减少工作量,还能保证验证的完备性,不会漏掉任何一种模式. (1) for循环仿真 可综合文件: module signedMul( input clk, input rstn, input [7:0] a, input [7:0]

Shell脚本编程基础

什么是Shell 操作系统最外层的程序,shell通过提示符让用户输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来,管理用户与操作系统之间的交互. Shell是一个用户跟操作系统之间的一个命令解释器.Shell是用户与Linux操作系统之间沟通的桥梁.用户可以输入命令执行,又可以利用 Shell脚本编程去运行. 为什么要用到shell shell是一个交互式程序,当用户输入一条命令,shell就解释一条,一次只处理一条命令.如果我们一些复杂操作,逐个敲命令工作量就会增大,因此,我

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要

[NodeJS]Node异步编程基础

零.前言 为什么要用Node? Node把非阻塞IO作为提高应用性能的方式.而在JS中,天生拥有着异步编程机制: 事件机制.同时JS中不存在多进程.这样当你执行相对较慢需要花费时间长的IO操作时并不会阻塞主进程的任务. 在NodeJS中流行两种响应逻辑的管理方式: 回调, 事件监听. 回调通常用来定义一次性响应的逻辑.事件监听器本质上也是一个回调,不同的是它跟事件相互关联. 一.使用回调来处理一次性事件 回调是一个函数,被当做参数传递给异步函数,描述了异步操作完成后要做什么. 案例: 创建一个简

编程基础及分支循环语句

编程基础 程序: 一组能让计算机识别和执行的指令 电子计算机 能够执行程序的机器 现代计算机: 艾伦·麦席森·图灵(Alan Mathison Turing,1912年6月23日-1954年6月7日),英国数学家.逻辑学家,被称为计算机科学之父,人工智能之父.图灵提出的著名的图灵机模型为现代计算机的逻辑工作方式奠定了基础 冯·诺依曼著名匈牙利裔美籍犹太人数学家.计算机科学家.物理学家和化学家,数字计算机之父.他提出了以二进制作为数字计算机的数制基础,计算机应该按照程序顺序执行,计算机应该有五大部

python网络编程基础(线程与进程、并行与并发、同步与异步)

python网络编程基础(线程与进程.并行与并发.同步与异步) 目录 线程与进程 并行与并发 同步与异步 线程与进程 进程 前言 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行.注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的

shell 脚本编程基础篇

一级标题 二级标题 1.编程基础 Linus:Talk is cheap, show me the code 程序组成 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结构:数据在计算机中的类型和组织方式 面向过程语言 做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如 果出现了情况B,做什么处理 问题规模小,可以步骤化,按部就班处理 以指令为中心,数据服务于指令 C,shell 面向对象语言 一种认识世界.分析世界的方法论.将万事万物抽象为各

1.5编程基础之循环控制_29:数字反转

/* 1.5编程基础之循环控制 29:数字反转 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个整数,请将该数各个位上数字反转得到一个新数. 新数也应满足整数的常见形式,即除非给定的原数为零, 否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入 输入共 1 行,一个整数N. -1,000,000,000 ≤ N≤ 1,000,000,000. 输出 输出共 1 行,一个整数,表示反转后的新数. 样例输入 样例 #1: 123 样例 #2: -380 样例输出 样

网络编程基础

网络编程基础 1.套接字概念 Linux环境下使用套接字进行进程之间的通信.用过套接字的接口,其他进程的位置对于应用程序来讲是透明的.相互通信双方端点都有一个套接字,双方如果要进行通信,通过套接字建立桥梁,双方就可以通信了. 类似文件一样,套接字也有一个套接字描述符,应用程序可以像操作文件一样操作套接字.在进行网络通信的过程中,用户感觉就是在操作文件一样,这是Linux将外部设备抽象为一个文件的好处. 2.字节序 不同主机的体系结构不同,所采用的数据存储方式不同.网络中,进程之间的通信是跨主机的