《FPGA全程进阶---实战演练》第八章之程序架构格式说明

首先在书写程序时必须有的部分,就是模块module部分,整体的架构如图8.1所示。

图8.1 程序整体架构

首先要声明模块名,在module后面加上模块名,这里最好以所建立模块要实现的功能去命名此模块,因为这样在查阅时方便去寻找此模块的功能,一目了然。紧接着在方框内要列出所有的输入和输出信号,都要在方框中写出。作为一个整体的模块,凡事出现module的部分一定要加上endmodule才算完整,这是一个完整的模块。

在输入信号中,有两个信号是一定要加上去的,就是时钟信号和复位信号,要做到对整体设计可控,全局时钟信号和复位信号必须加上。在声明括号对输入和输出信号列写完毕之后,还要在module内部再次声明到底哪个是输入信号,哪个是输出信号,这就有了124行到128行的声明。在always语句中用到的一些变量需要定义为reg类型,也就是寄存器类型,方可在always中使用,wire类型不可以在always语句中使用。

我们在看别人写的代码时常常看到类似于130行到153行所示的结构,这是怎么回事?这是要做什么?这就要利用我们数电知识里面的组合逻辑和时序逻辑的比较了,在要求对变量存储的场合,需要时序逻辑,组合逻辑只能输出数据,但是不能存储。当然还有组合逻辑是电平触发,而时序逻辑是时钟沿触发。所以130行到153行构建了一个庞大的锁存器,构成时序逻辑电路。对于130行小括号内部的属于敏感型变量,即发生变化时,会带动整个always 语句进行更新变化。其中rst_n(这个是复位信号,可以按自己的习惯去定义。)也定义为边沿敏感型变量,但是在always语句中的内部又出现了rst_n,这是为什么呢?一个信号如果是时钟信号,那么必定不会出现在always语句中,可见rst_n不是时钟信号。那么综合器会不会认为rst_n是一个时钟信号呢?

对于边沿触发型时序模块的verilog设计,有以下规律可循:

(1)若敏感型变量定义为时钟信号,不要在always语句中再出现。

(2)若某信号定义为相对于时钟的电平敏感的异步控制信号,除了在敏感型变量表中列出,还要在always语句中指出其逻辑行为。

(3)若某信号是相对于时钟的同步控制信号,不能出现在敏感型变量表中。

由上面的程序结构,为rst_n指定了if语句,会导致所有未能进入敏感信号的变量都必须是相对于时钟同步的。可见这是独立于主时钟的时序或组合逻辑,属于第二种情况。

(4)敏感型变量表中不允许出现混合信号。

[email protected](posedge clk or rstn) 或 [email protected](posedge clk or  negedge rstn or a)

上述结构都是不允许的,在综合时会出现 双边沿敏感信号的错误。

(5)不允许在敏感型列表中出现除时钟和异步控制信号之外的其他信号,一般的逻辑控制信号不允许出现在敏感型列表中,[email protected](posedge clk or negedge a)

其中a的作用同rstn,但是a不能用于其他逻辑行为 。如q = a & b;

可见verilog 描述敏感型时序电路较多的依赖于语法的规定和表述的规则

If语句中对异步控制信号rst_n进行判断,然后对数据进行初始化,初始化完成之后在执行其他条件,else if......else,其中的begin....end是针对于条件语句中有多步执行程序时,构建成一个整体,隶属于else if语句或者else语句。

155行到157行对于用户所使用的输出信号进行赋值。以上是针对单个module的建立,若是只是建立单个module,在建立工程时必须将module的名字和工程名字一致,如图8.2所示,否则会出错。对于多个模块构建,需要建议一个顶层模块,然后将各个子模块进行连接,这时用到了wire变量,如图8.3所示,注意wire类型的LED信号,起到连接各个模块的作用。图8.4是多个模块的RTL视图部分,可以看到wire的作用。

图8.2 单个模块命名

图8.3 多个模块命名

图8.4 RTL视图

TESTBENCH格式说明

当逻辑部分创作完成后,需要对逻辑程序进行行为仿真,那么就需要写仿真程序。

`timescale 1 ns/ 1 ns

module led_source_tst();

//----------------------------------------------

//-----------description of input signal--------

reg clk;

reg rst_n;

//clk 和rst_n是全局的时钟和复位信号

//----------------------------------------------

//-----------description of output signal--------

wire [3:0]  led_out;

Wire .....

Wire .....

//在modelsim仿真时,.v文件中的input在modelsim中用reg类型,如clk是input,

//上面modelsim是用reg,.v文件中的输出,即output,在modelsim中是wire,这一点要牢记

//----------------------------------------------

//-----------description of each module-------------------------

led_source

#(.LED_WIDTH(4))

i1 (

// port map - connection between master ports and signals/registers

.clk(clk),

//.cnt1(cnt1),

//.flag_cnt1(flag_cnt1),

.led_out(led_out),

//.led_out_cnt1(led_out_cnt1),

.rst_n(rst_n)

);

//这一部分是对建立的.v文件中的模块声明部分,led_source就是.v文件中的模块名字

//------------------------------

//generate clock

localparam PERIOD = 20;               //50MHz

initial

begin

clk = 0 ;

forever #(PERIOD / 2) clk = ~clk;

end

//上面这一段是针对clk信号做的模拟仿真;

//------------------------------

//task reset

task task_reset;

begin

rst_n = 0 ;

repeat(2) @(negedge clk);

rst_n = 1 ;

end

endtask

//上面一部分是针对复位信号,也就是rst_n。

//一开始也是赋初值rst_n = 0 ;然后利用repeat重复执行命令;

initial

begin

$monitor($time,"led_value = %04b\n", led_out); //just test the changing of led_out  //value

task_reset;

end

//上面这一部分就是对上面的task模块进行调用和对输入信号进行仿真,当然这一部分并没有用到用   //户输入信号。

endmodule

图8.5是对于按键的仿真程序,将输入也定义为一个task,然后在101行到105行进行任务的调用,清楚明了。

图8.5 输入信号的调用

时间: 2024-10-19 00:50:26

《FPGA全程进阶---实战演练》第八章之程序架构格式说明的相关文章

《FPGA全程进阶---实战演练》第二章之焊接板子及调试注意事项

1.若是读者第一次做板子,强烈建议画完PCB板后将PCB图打印出来,然后对照你买的芯片将芯片放置对 应的位置,然后查看所有的封装格式适不适合,否则等你做出板子来后再试,为时晚矣.笔者虽然知道要这么 做,但是笔者第一次发给工厂做回来的PCB发现有一个芯片封装画大了,而且那个芯片还是贴片封装的,这让 笔者心痛不已,300多大洋就这么要毁于一旦了. 2.在参考别人的电路时一定要注意,你想用的芯片型号的电路适不适合你参考的电路图,若是完全一致,那么可以直接照抄照搬,若是不一样,这时候要非常注意电路的设计

《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK

大家在写程序的时候,可能会听闻,什么独热码,什么格雷码,什么二进制码等等,本节意在解释这几种编码之间的区别和优势以及用verilog怎么去实现,下面先介绍这几种编码的区别. 1 基础理论部分 1.1 独热码 独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制. 如,有十六个状态的独热码状态编码应该是:0000000000000001,0000000000000010,0000000000000100,000000

《FPGA全程进阶----实战演练》第二章之系统搭建

1 系统方案 对于设计一款硬件平台,首先要确定整体框架,确定各个模块所需要的芯片以及电压分配情况.图2.6是笔者曾经设计的硬件平台系统. 图2.6系统框图 对于选定一个系统方案之后,接下来做的要先去查看所选用的芯片的数据手册.那么查看手册一般有几点必须要注意,(1)FPGA的工作电压,确定若FPGA正常工作需要几档电压,好设计电源电路:(2)考虑功耗,这决定着需要多大功率的电源才能驱动芯片正常工作:(3)查看时钟网络的分布,这决定在进行逻辑设计时时钟分配的问题:(4)JTAG下载电路,这一部分是

《FPGA全程进阶---实战演练》第五章 基于74HC595的LED操作

1基础理论部分 1.1分频 分频,是的,这个概念也很重要.分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频.实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ的信号,3分频得到11MHZ的信号,10分频得到3.3MHZ的信号. 分频主要是相对于主晶振来说,用不到那么高的频率,开发板一般根据具体需要会加入晶振,一般若是功耗较高可选用50MHz,其他情况可以相对调整,如24MHz等等.那么分频的典型应用,二分频,四分频,八分频,还有任意分频. 对于分频,我们

《FPGA全程进阶---实战演练》第十章 VGA五彩缤纷

1基础理论部分 VGA(video graphics array)即视频图形阵列,是IBM在1987年随PS/2一起推出的使用模拟信号的一种视频传输标准.VGA相比与现在的视频传输接口来说已经过时,不过作为最低标准,基本上制造商都会接入此接口,图11.1是常见的VGA接口. 图11.1 VGA接口 对于VGA15个引脚的相关说明,如下图所示. 图11.2 VGA引脚说明 大家做实验的时候,可能会有一个误区,那就是做实验时直接把实验板的VGA接口接到笔记本电脑上,还兴高采烈的等待着显示图像,殊不知

《FPGA全程进阶---实战演练》第一章之FPGA介绍

1 什么是FPGA FPGA也即是Field Programmable Gate Array的缩写,翻译成中文就是现场可编程门阵列.FPGA是在PAL.GAL.CPLD等可编程器件的基础上发展起来的新型高性能产物,是作为专用集成电路(ASIC)领域中的一种半定制电路出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点.图1.1是Altera Cyclone V芯片. 图1.1 Altera Cyclone芯片 说到这里,不得不提ASIC,即专用集成电路(Application

《FPGA全程进阶---实战演练》第一章之如何学习FPGA

对于很多初学者,大部分都是急于求成,熟不知越是急于求成,最终越是学无所成,到头来两手空空,要学好FPGA,必须弄懂FPGA本质的一些内容. 1.FPGA内部结构及基本原理 FPGA是可以编程的,必须通过了解FPGA内部结构才能很好地理解为什么FPGA是可以编程的.学习FPGA不能像学习其他CPU芯片一样,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样.一条条的读,一条条的分析.要冲破软件编程的思想. 那么FPGA为什么是可以“编程”的呢?首先来了解一下什么叫“程”.启示“程

《FPGA全程进阶---实战演练》第九章之有趣的计数器

本小节我们做一个好玩的事情,就是计数器,还记得在做LED自加实验时我们就曾经提到过关于计数器的相关议题,那么这节我们就来讨论讨论. 探讨一下如下的问题:请用verilog记八个数的写法,分析这个可以更好的理解触发器的工作原理. 1. reg [3:0]cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 4'd0; else if (cnt < 4'd8) cnt <= cnt + 1'b1; else cn

《FPGA全程进阶---实战演练》第四章之Quartus II使用技巧

技巧1:“新”技能 hierarchies警告寻找 在编译之后,警告中“hierarchies”这个单词大家估计都很熟悉了,一看到这个警告,基本上就是例化时出现的问题.一般例化时,要是哪个连线没引出,没接上,或者是位宽不匹配就会出这个警告.而我们一般就会定位到例化文件,或者是观察RTL视图去寻找,但是工程一大可不是那么好找的啊! Warning: 1 hierarchies have connectivity warnings - see the Connectivity Checks repo