verilog语言与VHDL_vhdl程序设计

verilog语言与VHDL_vhdl程序设计今年开始接触更改产品的FPGA代码,感觉公司虽然搞了很多年了,但是FPGA这块缺乏一些“软件工程”上的概念导入。如果对于Altera/Xilinx公司,如果做IP库,可能需要考虑各种编译器的兼容性,不能引入太多的“高级”语法,但是,对于一个公司而言,我认为代码的可维护性是放在第一位的,是在编译器兼容性之类之上的要求。1.VHDL总体而言,VHDL提供了如下一些语法特性,用于简化代码:1.1record和type定义例如对于KM1024i喷头控制,我们可以定义如下: –喷头控

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

今年开始接触更改产品的FPGA代码,感觉公司虽然搞了很多年了,但是FPGA这块缺乏一些“软件工程”上的概念导入。

如果对于Altera/Xilinx公司,如果做IP库,可能需要考虑各种编译器的兼容性,不能引入太多的“高级”语法,但是,对于一个公司而言,我认为代码的可维护性是放在第一位的,是在编译器兼容性之类之上的要求。

1. VHDL

总体而言,VHDL提供了如下一些语法特性,用于简化代码:

1.1 record和type定义

例如对于KM1024i喷头控制,我们可以定义如下:

	-- 喷头控制信号
	type KM_HEAD_CTRL_TYPE is record
		load	: std_logic;
		lat		: std_logic;
		gsclk	: std_logic;
		stb		: std_logic;
		plstm2	: std_logic;
		plstm1	: std_logic;
	end record;
	type KM_HEADs_CTRL_TYPE is array (natural range <>) of KM_HEAD_CTRL_TYPE;
	-- 喷头数据信号
	type KM_HEAD_DATA_TYPE is record
		sa		: std_logic_vector(2 downto 0);	-- sa(n)=sa_n, 
		dclk	: std_logic;
	end record;
	type KM_HEADs_DATA_TYPE is array (natural range <>) of KM_HEAD_DATA_TYPE;

有了上面的定义之后,接口可以为如下的方式:

entity KM1024i_8head_v1 is
	port (
		......

		hd_data			: out KM_HEADs_DATA_TYPE(0 to MAX_HEAD_NUM*CHNL_PER_HEAD-1);
		hd_ctrl			: out KM_HEADs_CTRL_TYPE(0 to MAX_HEAD_NUM*CHNL_PER_HEAD-1);

		......
	);
end KM1024i_8head_v1;

接口简化了很多,原先的接口,非常长的一堆信号列表。

1.2 generate语句

我们的FPGA主要在喷头控制上,典型特点就是一块板子上,驱动很多的喷头,典型的是4H和8H,但是甚至有16H的,原先的代码人肉重复,但是在引入generate语句之后,可以大幅度减少代码,甚至可以不同喷头数的板子,代码仅仅需要改几行即可。

PRINT_HEAD_GEN : for i in 0 to 7 generate
	HEAD_OPR : opr_setting
	port map (
		sys_clk		=> sys_clk,
		sys_rst		=> sys_rst,
		reg			=> opr_hd(i),
		ctrl		=> opr_op(i),
		cmd_trig	=> opr_trig(i),
		pon_trig	=> pon_trig
	);

	HEAD_CTRL : head_controller
	port map (
		sys_clk		=> sys_clk,
		sys_rst		=> sys_rst,

		head		=> i_hd_ctrl(i),
		f_fire		=> f_fire,
		gs_level	=> gs_level_hd(i),
		fire_dis	=> fire_dis_any,
		fire_skip	=> data_crc_err and fire_dis_on_err,

		grp_select	=> grp_select_hd(i),
		grp_seg_num	=> grp_seg_num_hd(i),
		grp_seg_desc=> grp_seg_desc_hd(i)
	);
end generate;

2. Verilog

Verilog语言没有类似于于VHDL的record的定义,也没有C语言的struct。但是,SystemVerilog是支持这些的,所以我们把标准切到SystemVerilog,以支持这些语法特性。以下以Max5183芯片驱动为例:

2.1 struct和enum

// DAC MAX5183 的控制信号
typedef struct {
	logic				clk;
	logic				cs_n;
	logic	[9:0]		data;
	logic 				pwr_down;
	logic				ref_en_n;
	logic				da_en;
} max5183_t;

typedef enum logic[1:0] { ST_OUT_D1, ST_LAT_D1, ST_OUT_D2, ST_LAT_D2 } da_state_t;

这是控制信号接口和状态机状态定义。

2.2 generate语句

这个是Verilog支持的,和VHDL的generate类似,例如,某个板子里面用到了6个fifo,可以这样定义:

genvar gi;
generate for (gi = 0; gi < 6; gi = gi+1) begin: fifo_inst_lp
data_fifo data_fifo_inst (
		.clock		(sys_clk				),
		.data		(fifo_inst_data[gi]		),
		.rdreq		(fifo_inst_rd[gi]		),
		.aclr		(fifo_aclr[gi[0]]		),
		.wrreq		(fifo_inst_wr[gi]		),
		.empty		(fifo_inst_empty[gi]	),
		.full		(fifo_inst_full[gi]		),
		.q			(fifo_inst_q[gi]		));
end endgenerate

3. 总结

虽然说,FPGA代码和一般的软件代码,有截然不同的内涵,但是,毕竟“硬件”已经“软件”化了。引入软件工程的一些概念,对于增加FPGA代码的可维护性和开发效率,是非常有必要,非常有意义的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191167.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【计算机网络(微课版)】第3章 数据链路层 课后习题及答案

    【计算机网络(微课版)】第3章 数据链路层 课后习题及答案3-1数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与“数据链路接通了”的区别何在?(1)数据链路与链路的区别在于——数据链路除链路外,还必须有一些必要的规程来控制数据的传输。因此,数据链路比链路多了实现通信规程所需要的硬件和软件。(2)“电路接通了”表示链路两端的结点交换机已经开机,物理连接已经能够传送比特流了。但是,数据传输并不可靠。在物理连接…

    2022年7月21日
    19
  • html跳转指定位置(html登录页面跳转到不同页面)

    锚标签和href属性HTML使用(锚)标签来创建连接另一个文档的链接。锚可以指向网络上的任何资源:一张HTML页面,一幅图像,一个声音或视频文件等等。用来创建锚。href属性用于定位需要链接的文档,锚的开始标签和结束标签之间的文字被作为超级链接来显示。锚标签和Name属性Name属性用于创建被命名的锚(namedanchors)。当使用命名锚(name

    2022年4月14日
    181
  • oracle存储过程语法与使用

    oracle存储过程语法与使用oracle存储过程的基本语法1.基本结构  1CREATEORREPLACEPROCEDURE存储过程名  2IS  3BEGIN  4NULL;  5END;行1:CREATEORREPLACEPROCEDURE是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程,如果存在就覆盖它;行2:  IS关键词表明后面

    2022年7月17日
    20
  • ContextLoaderListener类和contextConfigLocation参数[通俗易懂]

    ContextLoaderListener类和contextConfigLocation参数[通俗易懂]一、web.xml中经常有如下配置 &amp;lt;listener&amp;gt;&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt; &amp;lt;/listener&amp;gt;&amp;lt;context-param

    2022年6月26日
    29
  • NPN PNP开关电路[通俗易懂]

    NPN PNP开关电路[通俗易懂]   在设计电路板时需要用3.3v开关5v电源,所以这时候用到了NPN-PNP开关电路。我最开始的设计是这样的(npn采用的是9013,pnp采用的是8550):   开始没发现问题。真正调试的时候发现NPNQ1管烫的非常厉害。后才才发现原因:应该在QI集电极和Q2基极之间加上一个电阻。这是因为当向图中这样连接时VCC通过Q2直接加在了Q1的ce两端,Q2的be电压很小,相当于有一大…

    2025年12月10日
    5
  • 圣杯布局与双飞翼布局

    圣杯布局与双飞翼布局圣杯布局和双飞翼布局都是实现的三栏布局 两边的盒子宽度固定 中间盒子自适应 也就是我们常说的固比固布局 它们实现的效果是一样的 差别在于其实现的思想 圣杯布局的出现是来自于 alistpart 上的一篇文章 InSearchofth 比起双飞翼布局 它的起源不是源于对页面的形象表达 在西方 圣杯是表达 渴求之物 的意思 而双飞翼布局 源与淘宝的 UED 通过缩放页面就可以发

    2026年1月29日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号