这里,
第 1 项为 quartus 软件主包,为必装选项;
第 2 项为 quartus 软件 64 位系统支持
包,如果你的系统是 64 位的,就需要安装此包,若为 32 位的即可不用勾选,
第 3 项为 quartus的帮助选项,建议安装。
第 4 项为 modelsim –altera 的初学者版本,如果只是基础的学习和仿真,不涉及到相当多的代码内容,安装初学者版本即可完全满足条件。
如果需要仿真很大的内容,就需要选择安装第 5 项,第 5 项使用需要 license,我们可以也可以选择破解,但是不容易破解成功,所以如果没实在的必要,就只安装初学者版本即可。
第 6 项为 dspbuilder,涉及到与 matlab 联合使用,进行相关数字信号处理的开发。
1.安装完成后复制MentorKG.exe和patch_dll.bat到Modelsim安装目录的win32aloem文件夹下
2.编辑patch_dll.bat文件,将内容改为:(路径需修改成自己的路径)
attrib -r D:\modeltech_10.1c\win32\mgls.dll
pause
attrib +r D:\modeltech_10.1c\win32\mgls.dll
pause
3.运行CMD,输入:
CD D:\modeltech_10.1c\win32
D:
attrib -r mgls.dll
attrib -r mgls64.dll
MentorKG.exe -patch .\
4.将生成的LICENSE.TXT复制到D:\modeltech_10.1c文件夹里(自己的路径)
5.添加环境变量
变量名:MGLS_LICENSE_FILE
变量值:D:\modeltech_10.1c\LICENSE.TXT(自己的路径)
设置端口
设置(修改mydds.mif中的数据)好后进行编译.
设置嵌入式逻辑分析仪的时钟管脚,采样深度,硬件连接和观察变量等.
设置图形显示
下载编译运行
运行结果
正弦波生成的c代码
#include
#include "math.h"
main()
{
int i,k;
for(i=0;i<256;i++)
{
k=128+128*sin(360.0*i/256.0*3.1415926/180);
printf("%d : %d;\n",i,k);
}
return 0;
}
文件链接:
module alternative(
input a,
input b,
input s,
output out
);
assign out = s ? a : b;
endmodule
新建.v文件用于设计仿真激励
`timescale 1ns/1ns //时间刻度
module alternative_testbench();
//定义激励源
reg s1,s2,s3;
wire led;
//配置模块并将激励输入模块
alternative alternative_simulation(
.a(s1),
.b(s2),
.s(s3),
.out(led)
);
//仿真
initial begin
s1 = 0; s2 = 0; s3 = 0;//改变激励
#100;//延时100个时间刻度
s1 = 1; s2 = 0; s3 = 0;//改变激励
#100;//延时100个时间刻度
s1 = 0; s2 = 1; s3 = 0;//改变激励
#100;//延时100个时间刻度
s1 = 1; s2 = 1; s3 = 0;
#100;
s1 = 0; s2 = 0; s3 = 1;
#100;
s1 = 1; s2 = 0; s3 = 1;
#100;
s1 = 0; s2 = 1; s3 = 1;
#100;
s1 = 1; s2 = 1; s3 = 1;
#100;
$stop;
end
endmodule
新建脚本文件
添加脚本文件
配置modelsim路径
开始功能仿真,(下面那个是时序仿真)
放大窗口
module <模块名> (<端口列表>)
<I/O说明>
<内部信号声明>
<功能定义>
endmodule
module led (
/* 端口列表 */
input clk, //输入端口
output [3:0]follow_led //输出端口4个
);
endmodule
always @(<敏感信号表达式>)
begin
//过程赋值
//if语句
//case语句
//while、repeat、for语句
//task、function调用
end
//上升沿触发,高电平清0有效
always @(posedge clk or posedge clear)
always @(posedge clk or negedge clear)
begin
if(!clear)//当clear==0时候,always会由事件驱动
qout=0;
else
qout=in;
end
initial语句主要面向功能模拟,通常不具有可综合性。
模拟0时刻开始执行,只执行一次
同一模块内的多个initial过程块,模拟0时刻开始并行执行。
initial与always语句一样,是不能嵌套使用的。即在initial语句中不能再次嵌套initial语句块。
initial
begin
语句1;
语句2;
......
end
对变量和存贮器初始化
initial
begin
reg1=0;
for(addr=0;addr<size;addr=addr+1)
memory[addr]=0;
end
always @(posedge clk)begin
if(count == 25'd24_999_999)
count <= 25'd0;
else
count <= count + 1'b1;
end
在Verilog语言中,主要有三大类数据类型
寄存器数据类型、线网数据类型和参数数据类型。
reg类型的数据只能在always语句和initial语句中被赋值。
初始化不能赋初值.
//关键字reg
reg [31:0] cnt;
//定义一个32位的寄存器
如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器,
如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;
wire flag;
wire [1:0] cnt;
parameter A = 4'b1010;
Verilog中的操作符按照功能可以分为下述类型。
result = (a >= b) ? a : b;
两种移位运算都用0米填补移出的空位。
左移时,位宽增加,右移时,位宽不变。
4’b1001 < < 2 = 6’b100100;
4’b1001 > > 1 = 4’b0100;
c ={ a, b[3:0]
//将a和b进行拼接,然后生成c
//假设a和b都是8位宽,那么c是12位宽.
//注释
/*
注释
*/
and #2 u1(q,a,b);
上述三种逻辑功能是并行的
注意
在always块中,逻辑是顺序执行的。
而多个always块之间是并行的。
Verilog HDL语言中,信号有两种赋值方式
所谓阻塞的概念是指,在同一个a Iways
块中,后面的赋值语句是在前一句赋值
语句结束后才开始赋值的。
所谓非阻塞的概念是指,在计算非阻塞赋值
的RHS以及更新LHS期间,允许其他的非阻塞
赋值语句同时计算RHS和更新LHS。
非阻塞赋值只能用于对寄存器类型的变量进
行赋值,因此只能用在initial块和a Iways
块等过程块中。
组合逻辑使用阻塞赋值.
时序逻辑使用非阻塞赋值.
在描述组合逻辑的always块中用阻塞赋值=,综合成组合逻辑的电路结构;种电路结构只与输入电平的变化有关系
在描述时序逻辑的always块中用非阻塞赋值<=,综合成时序逻辑的电路结构;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化;
注意:在同一个aIways块中不要既用非阻塞赋值又用阻塞赋值
不允许在多个always块中对同一个变量进行赋值!
if (a > b) begin
out = data;
end
if (a > b) out = data;
if (a > b) begin
out = data1;
end
else begin
out = data2;
end
if (a > b)
out = data;
else
out = data2;
if(表达式1)
语法1;
else if(表达式2)
语法2;
else if(表达式3)
语法3;
else
语法4;
if(表达式1)
语法1;
else if(表达式2)
语法2;
else if(表达式3)
语法3;
else begin
if(表达式1)
语法1;
else
语法2;
end
reg [7:0]sel; //1100_0011
casez(sel)
8'b1100_zzzz:语句1;
endcese
reg [7:0]sel; //1100_0011
casex(sel)
8'b1100_xxzz:语句1;
endcese
例化使用模块名作为关键字,然后重新起一个名字.
模块的可以被多次例化.
模块例化可以将需要使用的端口进行连接.