当前位置: 首页 > news >正文

FPGA基础代码复用

一、verilog中有关代码复用的语法

1、连接符“{}”

{4{1'b1}} 或者 {5'd6, 5'd8} 

2、参数(Parameter)型常量定义

parameter 参数名=表达式; 或者 localparam 参数名=表达式;

parameter DATA_WIDTH = 20; 

3、function函数定义

函数内部语句只能写组合逻辑。

function [7:0] adder;
input [6:0] a;
input [6:0] b;
beginadder = a + b;
end
endfunction  

4、for语句

for(表达式1;表达式2;表达式3) 语句

genvar i;  
for(i=0; i<10; i=i+1) 

5、generate-for语句

(1) 必须使用genvar定义一个正整数变量;

(2) for里面的内嵌语句,必须写在begin_end里面;

(3) begin_end需要定义名字。

 genvar i;generate  for(i=0; i<10; i=i+1)begin语句;end
endgenerate 

二、代码复用示例

1、使用函数定义

 module test(input wire [6:0] a,input wire [6:0] b,input wire [6:0] c,input wire [6:0] d,output reg [7:0] ab,output reg [7:0] bc,output reg  [7:0] cd;
);function [7:0] caler;
input [6:0] a;
input [6:0] b;
beginadder = {a, 1'b0} + b;
end
endfunction always(posedge clk) beginif(reset) begin{ab,bc,cd} <= 'b0;end else beginab <= caler(a,b);bc<= caler(b,c);cd <= caler(c,d);end
endendmodule

2、使用generate示例

(1)语句复用

 parameter DATA_WIDTH = 7;reg [DATA_WIDTH*10-1:0] a;reg [DATA_WIDTH*10-1:0] b;reg [DATA_WIDTH*10-1:0] c;genvar i;generate  for(i=0; i<10; i=i+1)beginalways(posedge clk) beginif(reset) beginc[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] <= 'b0;end else beginc[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] <= a[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] + b[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH];endendend
endgenerate

(2)模块复用

 parameter IN_WIDTH = 7;parameter OUT_WIDTH = 8;reg [IN_WIDTH*10-1:0] a;reg [IN_WIDTH*10-1:0] b;reg [IN_WIDTH*10-1:0] c;reg [IN_WIDTH*10-1:0] d;wire [OUT_WIDTH *10-1:0] ab;wire [OUT_WIDTH *10-1:0] bc;wire [OUT_WIDTH *10-1:0] cd;genvar i;generate  for(i=0; i<10; i=i+1)begintest(.clk(clk),.reset(reset),.a(a[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.b(b[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.c(c[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.d(d[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.ab(ab[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]),.bc(bc[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]),.cd(cd[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]));end
endgenerate

总的来说,使用generate确实对代码的整体结构,以及调试提供了很大的方便,各位可以在编写代码的过程中多多使用。

http://www.lryc.cn/news/61318.html

相关文章:

  • Hbase简介
  • 科海思除COD树脂,大孔树脂,除COD专用树脂
  • Qt 多线程 QThread、QThreadPool使用场景
  • 如何一招搞定PCB阻焊过孔问题?
  • 【代码随想录】刷题Day2
  • Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用
  • 计及调度经济性的光热电站储热容量配置方法【IEEE30节点】(Matlab代码实现)
  • “不要放过这个春天”解锁品牌春日宣传新玩法
  • 利用GPT2 预测 福彩3d预测
  • 类加载过程
  • 【C/C++】C++11 无序关联容器的诞生背景
  • h264编码原理
  • 网络工程师经常搞混的路由策略和策略路由,两者到底有啥区别?
  • 高精度气象模拟软件WRF实践技术
  • 总结827
  • 还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目
  • 总结下Spring boot异步执行逻辑的几种方式
  • 【开发日志】2023.04 ZENO----Composite----CompNormalMap
  • 春秋云境:CVE-2022-28525 (文件上传漏洞)
  • 【软件测试二】开发模型和测试模型,BUG概念篇
  • 短视频app开发:如何实现视频直播功能
  • [架构之路-174]-《软考-系统分析师》-5-数据库系统-7-数据仓库技术与数据挖掘技术
  • 销售高品质 FKM EPDM NBR 硅胶 O 形密封圈
  • Linux环境变量:不可或缺的系统组成部分
  • FFmpeg命令行解析
  • 机器学习——为什么逻辑斯特回归(logistic regression)是线性模型
  • 从输入URL到页面展示到底发生了什么
  • Qt connect传参方式及lambda函数传参方式详解
  • 如何在硬盘上恢复已经删除的照片?
  • Unity日记22(携程概念)