modelsim 10.7 基础仿真verilog的记录
本帖适合初识verilog者
我的modelsim版本:![]()
操作参考视频链接:点击跳转
你可以在这里获取相关工程代码:点击跳转
新建工程:
首先新建工程:指定项目名及其地址

然后添加文件:确定文件名,指定文件类型,此处为verilog,注意所有的命名,路径都不要有中文,甚至空格最好也不要有

比如我这里添加两个verilog文件:点击Compile->Compile All后,如果语法没有问题,就会出现图中的绿色小勾

接下来就可以开始仿真了:

为了方便查看波形,做如下选择:

然后点击ok,然后在这里右键,添加波形:add wave

然后在这里run simulation:

现在你就可以看到波形了:

然后在这里可以end simulation:

具体Verilog代码:
jk_code.v代码:
module JK_code(q,j,k,clk,rst);
output q;
input j,k,clk,rst;
reg q;
always @(posedge clk or negedge rst)begin
if(~rst)
begin
q<=0;
end
else
begin
case({j,k})
2'b00:q<=q;
2'b01:q<=0;
2'b10:q<=1;
2'b11:q<=~q;
endcase
end
end
endmodule
jk_code_test.v代码:
module tb_JKcodetest;
reg clk;
reg rst;
reg j;
reg k;
wire q;
JK_code uut(q,j,k,clk,rst);
always begin
#5 clk = ~clk;
end
initial begin
clk=0;
rst=1;
j=0;
k=0;
#10 rst=0;
#10 rst=1;
#10 j=0;k=0;
#10 j=0;k=1;
#10 j=1;k=0;
#10 j=1;k=1;
#10 j=0;k=0;
#20 $stop;
end
endmodule
代码解析:
首先JK_code.v定义了一个可以综合的JK触发器,也就是说可以被转为真实的硬件逻辑门,
module JK_code(...):定义了一个叫JK_code的硬件模块,这是verilog设计的基本单元
(q,j,k,clk,rst)是模块的端口列表,定义了与外部的所有连接
output q;就是指的输出端
input j,k,clk,rst;指的输入端,包括控制输入端,时钟信号,复位信号
reg q;就是将输出端口声明为reg类型,也就意味着这个值会被存储起来
always @(...)是时序逻辑过程块。posedge clk是指上升沿触发(clk:0->1),negedge rst是指下降沿触发(rst:1->0)
if(~rst)意味着复位信号一旦出现,即rst:1->0;就立即执行接下来的逻辑,不受时钟clk控制
如果没有复位信号,则always块就由clk上升沿触发,本模块描述的逻辑就是在每个时钟的上升沿,触发器的状态q应该如何根据输入j和k来更新
always块作为时序逻辑,其中的赋值是非阻塞赋值,意味着赋值操作在本次always块执行结束后才生效
case({j,k})是为了根据不同的输入组合执行不同的操作,如果j=1,k=0;则就{j,k}就拼接为2'b10,然后执行对应的操作
接下来说明测试模块的代码:jk_code_test.v
这段代码不可以被综合,只是用来生成激励信号,用来测试jk_code是否正确,测试模块通常没有输入输出端口,因为这是整个仿真环境的顶层
内部信号声明:reg clk,rst,j,k;这些是需要测试平台主动产生的信号
wire q;是测试平台为了观察功能代码的输出,测试平台不需要驱动q,所以声明为wire类型,wire类型通常用于连接
JK_code uut(q,j,k,clk,rst);实例化JK_code为uut(q,j,k,clk,rst);括号里是端口映射,顺序必须和JK_code内部的定义保持一致
always begin #5 clk = ~clk;是经典的时钟的生成办法,always表示这个块会无限循环执行,#5表示暂停5个时间单位
initial begin ... end;initial块只在仿真开始时执行一次,通常用于设置初始状态和生成测试序列clk=0;rst=1;... 设置所有信号的初始值
#10 rst=0;等待10个时间单位(一个时钟周期),然后将rst置为0,触发复位,,,
$stop表示暂停仿真
Verilog总结:

更多推荐



所有评论(0)