马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
温馨提示:明德扬2023推出了全新课程——逻辑设计基本功修炼课,降低学习FPGA门槛的同时,增加了学习的趣味性,并组织了考试赢积分活动
本案例的编号为:001500000167,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)
本文为明德扬原创及录用文章,转载请注明出处
大家好,近期我们会连载《FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。
《FPGA至简设计原理与应用》书籍连载索引目录
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989
读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。
注:手机浏览可能格式会乱,建议用电脑端进行浏览。
第二篇 FPGA至简设计原理
第一章 多用模板专注设计
本文档编号:001400000010
需要看对应的视频,请点击视频编号:001400000088
介绍了MDY最常用的至简设计verilog代码模板,以及如何调用和使用该模板的方法
进行工程设计的过程中,在亲手完成了部分工程的设计后就会发现其实大多数工程都有一定的“套路”。因此至简设计法制作了verilog代码模板,该模板包含了verilog最常用的代码,只要按照模板提示的步骤进行思考和填空,就能得到简洁、漂亮的代码。当然这种方法也会减少一定的错误率,毕竟相比一个字符一个字符的输入,一定是部分字符填空更加简单便捷且错误率低。
有人认为至简设计法模板仅仅是为了节省敲代码的时间,这种想法其实是错误的。至简设计法旨在用一套固有的思想方法来应对不同的设计,力求使用最简洁的语言,最直接的算法得到最省资源的代码。同样,至简设计法的模板更多地是将至简设计法的设计经验转化到模板当中,每个模板看起来毫无关系,但其实都是工程设计中必不可少的步骤。这种方法也会时刻提醒设计者按照规范的思路进行编码,不会中途“开小差,走跑偏”,利用模板完整的将整个工程串起来才是至简设计法的目的。
第1节 至简设计法模板总表
下表为至简设计法现有可供使用的模板,后续还会不断的进行完善补充。为了方便查阅,下面列出模板总表,随后会依次单独演示相应模板的使用方法。使用这些模板需要按照提示正确安装至简设计法提供的GVIM软件,也可以前往至简设计法网址:XXXXXXX进行下载使用。本书只能通过文字以及截图的形式进行描述和演示,可以登陆至简设计法官网观看使用视频,网址为:XXXXXXXXXXXX。
命令 | | | 可以调出verilog模块的模板,包括模块的常用部分,在相应位置补充就可以非常方便地完成设计。 | | “时序”的拼音。可以调出时序逻辑的模板。绝大部分情况下时钟和复位信号都无须修改。 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin end else begin end end | | “组合”的拼音。可以调出组合逻辑的模板。 always @(*)begin end | | “计数器”拼音的缩写。可以调出至简设计法计数器模板。 | | “状态机”拼音的缩写。可以调出至简设计法四步法状态机模板。 | | | | 定义reg类型代码时使用。其中x是指位宽数字,目前支持1,2,3,4,8,16,32。 当x为1时,即Reg1,可以调出以下语句: reg; 当x为其他值时,如Reg8时,可以调出以下语句: reg [7: 0]; | | 定义wire类型代码时使用。其中x是指位宽数字,目前支持1,2,3,4,8,16,32。 当x为1时,即Wire1,可以调出以下语句: wire; 当x为其他值时,如Wire8时,可以调出以下语句: wire [7: 0] ; | | 定义input类型代码时使用。其中x是指位宽数字,目前支持1,2,3,4,8,16,32。 当x为1时,即Input1,可以调出以下语句: input; 当x为其他值时,如Input8时,可以调出以下语句: input[7: 0]; | | 定义output类型代码时使用。其中x是指位宽数字,目前支持1,2,3,4,8,16,32。 当x为1时,即Output1,可以调出以下语句: output; 当x为其他值时,如Output8时,可以调出以下语句: output[7: 0]; | | 用于调用测试文件中initial段的语句。语句中补充了#1延时,请注意不要删除。 initial begin #1; end | 第2节 模板演示
为便于理解,下面将依次对各模板进行单独演示。
2.1 模块设计模板
在编辑模式下输入“Module”,注意首字母“M”需要大写,如下图所示:
1
图1 调用模块设计模板 按下“回车”键后编辑栏会出现模块设计模板,此处主要是为结构设计提供参考,如下图所示,将其补充完整即可。 图2 模块设计模板调用结果 2.2 时序逻辑模板
(1)常用时序always模板
在编辑模式下输入“Shixu”,注意首字母“S”需要大写,如下图所示. 图2.2-3 调用时序模板 按下“回车”键后编辑栏会出现最常用的时序always模板,如下图所示,此模板中时钟和复位代码一般无需改变,只需要填写相应条件将代码补充完整即可。 图4 时序模板调用结果 (2)存在条件的时序always模板
在时序语句中经常会存在若干嵌套条件,在这种情况下,调用时可以在“Shixu”后面加上条件的数量。如存在2个条件时,应在编辑模式下输入“Shixu2”。同样的,首字母“S”需要大写,如下图所示。
5
图5 调用2个条件的时序模板 按下“回车”键后编辑栏会出现2个条件的时序always模板,如下图所示。同样在此模板中时钟和复位代码一般无需改变,只需要填写相应条件将代码补充完整即可。 图6 2个条件的时序模板调用结果 同样的,如果要调用3个条件的时序always模板,应在编辑模式下输入“Shixu3”,如下图所示。 图7 调用3个条件的时序模板 按下“回车”键后编辑栏会出现3个条件的时序always模板,如下图所示。同样的,此模板一般只需填写相应条件将代码补充完整即可。 图2.2-8 3个条件的时序模板调用结果 2.3 组合逻辑模板
(1)组合逻辑always模板
在编辑模式下输入“Zuhe”,注意首字母“Z”大写,如下图所示。
9
图9 调用组合逻辑模板 按下“回车”键后编辑栏会出现1个组合逻辑always模板,如下图所示,将其补充完整即可。 图10 组合逻辑模板调用结果 (2)有条件的组和逻辑always模板
当存在若干嵌套条件的情况下,进行调用时可以在“Zuhe”后面加上条件的数量。如要调用有2个条件的组合逻辑模板,在编辑状态下输入“Zuhe2”,首字母“Z”大写,如下图所示。 图11 调用2个条件的组合逻辑模板 按下“回车”键后编辑栏会出现有条件的逻辑always模板,如下图所示,将其补充完整即可。 图12 2个条件的组合逻辑模板调用结果 2.4 计数器模板
(1)1个计数器模板
在编辑模式下输入“Jsq”,注意首字母“J”需要大写,如下图所示。
13
图13 调用1个计数器模板 按下“回车”键后编辑栏会出现1个计数器模板,如下图所示。在此模板中需要考虑计数器的加1条件以及最终加数的大小,将add_cnt和end_cnt代码补充完整即可。 图2.2-14 1个计数器模板的调用结果 (2)多个计数器模板
当需要调用多个计数器时,可以在“Jsq”后加上调用计数器的个数,如需要调用两个计数器模板,应在编辑模式下输入“Jsq2”,首字母“J”大写,如下图所示。 图15 调用2个计数器模板 按下“回车”键,编辑栏会出现2个计数器模板,如下图所示,考虑相应条件后将代码补充完整即可。 图16 2个计数器模板调用结果 同样,如果要3个计数器模板则要在编辑模式下输入“Jsq3”,如下图所示。
17
图17 调用3个计数器模板 按下“回车”键,编辑栏会出现3个计数器模板,如下图所示,考虑相应条件后将代码补充完整即可。 图2.2-18 3个计数器模板调用结果 (3)增加1个计数器模板
调用计数器模板还有另外一种方法,这种方法可以在已有的计数器模板后加入新的计数器模板。如下图所示,在命令模式下输入“:call MDYJSQ()”,此处需注意大小写的转换。 图19 增加1个计数器模板 按下“回车”键,可以看到编辑栏同样会出现1个计数器模板,如下图所示,在此模板中同样需要考虑后将相应代码补充完整即可。同样,如果此时已经存在计数器cnt0,也可以利用该方法新增1个计数器,新的计数器会自动命名为cnt1。 图2.2-20 增加1个计数器模板的调用结果 2.5 状态机模板
(1)一般的状态机模板
在编辑模式下输入“Ztj”,注意首字母“Z”需要大写,如下图所示。
21
图21 调用状态机模板 按下“回车”键后编辑栏会出现状态机模板,如下图所示。 图22 状态机模板调用结果 (2)具有多个状态多个跳转条件的状态机模板
需要调用多个状态多个条件的状态机模板时,可以在相应代码后加入状态数量、名称以及跳转条件以实现调用。如需要调用具有3个状态且有5个跳转条件的状态机模板,则在命令模式下输入“:call MDYZTJ(3,”S1”,”S2”,”S3”,12,13,23,32,31)”,如下图所示,注意大小写区分。其中“3”代表状态的数量,”S1”,”S2”,”S3”分别为三个状态的名称,“12,13,23,32,31”代表跳转条件,如“12”代表从状态1跳转到状态2,“13”代表状态1跳转到状态3,以此类推。 图23 调用具有5个跳转条件的状态机模板 按下“回车”键后编辑栏会出现具有3个状态且有5个跳转条件的状态机模板,如下图所示。 图2.2-3个状态5个跳转条件的状态机模板的调用结果 2.6 测试文件模板
在编辑模式下输入“Test”,注意首字母“T”需要大写,如下图所示。
25
图25 调用测试文件模板 按下“回车”键后编辑栏会出现测试文件模板,如下图所示。可以在此基础上完成模块例化,从而实现文件测试。 图26 调用测试文件模板 2.7 reg类型代码模板
以位宽为4为例,如果要调用位宽为4的reg类型代码的模板,需在编辑模式下输入“Reg4”,注意首字母“R”需要大写,如下图所示。 图27 调用位宽为reg型模板 按下“回车”键后编辑栏会出现位宽为4的reg型代码定义,如下图所示。 图28 位宽为reg型模板调用结果 2.8 wire类型代码模板
以位宽为32为例,如果要调用位宽为32的wire类型代码的模板,需在编辑模式下输入“Wire32”,注意首字母“W”需要大写,如下图所示。
29
图2.2-29 调用位宽为wire型模板 按下“回车”键后编辑栏会出现位宽为32的wire信号定义,如下图所示。 图2.2-30 位宽为32的wire型模板调用结果 2.9 输入信号定义模板
以位宽为8的输入信号为例,在编辑模式下输入“Input8”,注意首字母“I”需要大写,如下图所示。 图31 调用位宽为8的输入信号模板 按下“回车”键后编辑栏会出现位宽为8的输入信号定义,如下图所示。 图32 位宽为8的输入信号模板调用结果 同样,若输入信号位宽为16时,在编辑模式下输入“Input16”,如下图所示。
33
图33 调用位宽为16的输入信号模板 按下“回车”键后编辑栏会出现位宽为16的输入信号定义,如下图所示。 图2.2-16的输入信号模板调用结果 2.10 输出信号定义模板
以位宽为16的输出信号为例,在编辑模式下输入“Output16”,注意首字母“O”需要大写,如下图所示。 图2.2-35 调用位宽为16的输出信号模板 按下“回车”键后编辑栏会出现位宽为16的输出信号定义,如下图所示。 图2.2-36 位宽为16的输出信号模板调用结果 同样的,若调用位宽为32的输出信号模板,需在编辑状态下输入“Output32”,如下图所示。
37
图2.2-37 调用位宽为32的输出信号模板 按下“回车”键后编辑栏会出现位宽为32的输出信号定义,如下图所示。 图38 位宽为32的输出信号模板调用结果 2.11 initial语句模板
调用initial语句模板需在编辑模式下输入“Initial”,注意首字母“I”需要大写,如下图所示。 图39 调用initial语句模板 按下“回车”键后编辑栏会出现用于调用测试文件中initial段的语句,如下图所示。语句中补充了#1延时,请注意不要删除。 图2.2-40 initial语句模板调用结果
|