赞
踩
上次介绍了如何创建工程,这次来实现一个波形的产生,vivado用的是Verilog语言,语法很简单就不单独说了,慢慢在程序里很快就学会了,大概的介绍我粘在文章最后,想看就看不想看直接实操也行。
在创建的主程序中找到这个模块的括号,我把括号内容理解为这个模块的端口,如下面的程序所示,有一个时钟端口,一个复位端口,和一个输出端口,逗号隔开,最后一个不用加。红线是因为没对他们进行声明,我习惯在括号外进行声明,这样之后的例化可以直接复制(例化会在后面说)
下面对信号进行声明,时钟信号和复位信号肯定是需要输入的,输出信号输出,如图,这时候报错就没有了,1.input,output表示输入或输出。2.表示声明的名字,每个语句要加分号3.表示这个变量占多少个二进制数,本文这个是八位二进制数(0,1,2,3,4,5,6,7八位),也就是输出要小于等于255
接下来定义信号类型,设计中所有的信号类型定义,只有 reg 和 wire 两种,现在先知道,下面会说他两个的区别。定义的时候同样考虑信号的大小,不写的话默认为一位,如果不定义信号类型默认为wire型。
下面编写程序的主要模块,1.直接先照抄,表示时序逻辑。2.(posedge clk or negedge rst_n)叫做敏感列表 ,也就是说每逢时钟的上升沿和复位信号的下降沿,都要执行一遍这个程序。3.begin end 表示这之间是一个整体,里面的语句顺序执行。
中间为了方便我就直接把这个时钟和复位的值减了一下,其中可以发现,我使用了一个'<='进行赋值,这叫做非阻塞赋值,一个小技巧,这种赋值方式只用在 always@(posedge clk or negedge rst_n) 这里面,其他的用等号赋值,同时'<='所指的变量要用reg进行定义,也就是reg型,其他都是wire型。这样我们的主程序就写完了,ctrl+s保存。
下面我们开始写测试文件进行仿真,直接上代码你们看注释吧,基本每句都解释了
- module tb_project_2;
-
- reg clk ;//定义变量,下边clk被‘<=’指着,所以用reg型
- reg rst_n ;
- wire out ;//输出没被指着所以是wire型
-
- initial begin //照着写就行,initial里面就是信号的波形
- clk <= 0 ;//初始化时钟
- forever #10 clk <=~clk;//循环,每隔10个单位时钟反向一次,一单位时间在程序第一行
- end
- initial begin
- rst_n <= 0 ;
- #100 rst_n <= 1 ;//#100的意思就是经过100个单位执行下一条
- end
- project_2 tb( //例化,下面会解释
- clk ,
- rst_n ,
- out
- );
-
- endmodule

现在说一下例化,把主程序这块复制下来,
粘贴到测试程序中,加'空格'和'例化名',我都是随便写例化名,一般就写tb,例化可以把测试文件的三个端口和主程序的三个端口连接起来,还有一种更规范的写法。在下一个图
这样就完成了整个工程的程序书写,ctrl+s保存
下面运行一下试试
点这个Run Simulation,然后点run这个就行了,生成的波形文件放大,拉到最前边,可能因为每个上升沿执行clk-rst_n,out是这样,时钟和复位信号相减(这里输出我也不太明白)
下面是Verilog的一些语法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。