verilog 仿真文件clkmodelsim仿真 clk为什么一直为高阻?

modelsim仿真为什么一直为高阻?_百度知道
modelsim仿真为什么一直为高阻?
代码如下,里面的子模块应该没有错误,问过老师说可能是接线的问题或者是数据位数的问题,,库应该也没有问题,请帮我看下。
`timescale 1ns / 1ps
module dds(K, clk, reset, sine_data);
input [21:0] K;
output [...
我有更好的答案
首先检查检查tb给的激励信号是否符合要求,比如说时钟信号啊,reset信号(高电平还是低电平复位有效)然后看看有些信号是否给了初始值,设计中,有些信号要给初始值的,不然它默认输出是高阻态的!
采纳率:54%
为您推荐:
其他类似问题
您可能关注的内容
高阻的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。VHDL仿真,Verilog HDL仿真入门--ModelSim使用简介
我的图书馆
VHDL仿真,Verilog HDL仿真入门--ModelSim使用简介
仿真VHDL和Verilog HDL并没有什么区别,一般的软件两种语言也都支持,仿真的步骤和方法也都是一样的。
常用的软件有Model Sim和Quartus II。
Quartus II功能很强大!实际的工作经常用它,它提供了功能仿真和时序仿真两种方式,但是作为学习HDL
并不方便,因为它compile编译的时候很慢,对于复杂的逻辑更是要很长时间。好的一点是,Quartus
II编译后可以清楚的看到它使用了芯片的多少资源,各信号不同的延时等等。另外,Quartus II编译后也可以调用第三方的仿真工具,如Model
Sim进行仿真。
Sim只完成逻辑功能的仿真,并不考虑具体使用什么器件,学习HDL或者设计逻辑的时候compile一次所用的时间很短,便于调试找出逻辑的错误。所以初学仿真推荐使用Model
Sim。本文也只讲下用Model Sim仿真逻辑的方法。
以下部分基本是参照软件帮助简写的,只是原来是英文的而且说的比较繁琐一些,也更详细内容更多。详见Model Sim菜单Help--SE PDF
Documentation--tutorial。
仿真有两种方法。一种是Basic
Simulation,就是直接建立库,然后编译源文件。另一种是通过建立Project来仿真,建立Project时软件会为它建立一个库,然后的仿真是一样的。
Basic Simulation的流程图如下Basic Simulation的流程图如下
下面详细写一个例子的步骤
1. 建立库。选择菜单File&New&Library。建立新库就选a new library and a mapping to
it,library name 和library physical name 都填work(当然其它名也行)。如下图。下面详细写一个例子的步骤
1. 建立库。选择菜单File&New&Library。建立新库就选a new library and a mapping to
it,library name 和library physical name 都填work(当然其它名也行)。如下图。
&&& 确定后,在Work Space区的Library选项卡里就能看到新建的库work。
2. 编译VHDL或Verilog HDL源文件。 选择菜单Compile&Compile,在弹出的窗口中打开Model
Sim安装文件夹下的 /modeltech/examples/tutorials/vhdl/basicSimulation/ (里面是软件自带教程的例子逻辑,Verilog
HDL对应的例子在/examples/tutorials/verilog/basicSimulation里)。将里面的counter.vhd和tcounter.vhd一起选中,点击Compile,然后点击Done关闭弹出窗口。
&&& 这两个源文件就编译好了,在Work
Space区里的Library卡里可以看到库work下出现了两个编译完成的entity(或module),如下图。
3.&& 仿真。在Work
Space区的library选项卡中,展开库work前的加号,双击test_counter,载入到仿真。
&&&&&&&& 这时Work
Space区中新增了一些选项卡,弹出了Objects面板。
&&& 选择菜单View&Debug Windows&Wave调出波形窗口。
在Work Space面板的Sim选项卡中右击test_counter,选择Add&Add to
Wave。在波形窗口的列表里就能看到被添加到波形仿真的信号。
&&& 开始仿真。点击工具栏上的Run按钮 ,就看到了计数器各信号的波形。
&&& 默认仿真100ns。
&&& 如果点击Run All按钮
则会一直仿真下去,知道点击Break按钮
或在代码中遇到断点。
设置断点的方法是在代码文件的行号上单击,会出现红点。再单击变黑则断点无效。
&&& 要重新仿真,可以单击工具栏上的Restart
按钮,在弹出的窗口中可以设置要保留的内容然后单击Restart。
这些仿真涉及的按钮命令都可以在菜单Simulate中找到,仿真结束最后不要忘了选择菜单Simulate&End
Simulate。
Simulation流程图如下
&&& 同样是计数器的例子。
1. 建立project。选择菜单File&New&Project,任意填写Project
Name和存储路径,default library name保持默认的work不变,确定。
2. 直接在确定后弹出的窗口选择Add Existing File或在Work
Space面板的Project选项卡里右击选择Add to Project&Exitsting File。添加Model
Sim安装目录examples/tutorials/vhdl/projects下的counter.vhd和tcounter.vhd两个文件到project(Verilog
HDL的例子在examples/tutorials/verilog/projects下)。
&&& 这时可以看到Project里新添入的两个文件的status都是?。
3. 更改编译顺序(仅针对VHDL)。选择菜单Compile&Compile
Order,在弹出窗口中上下移动文件改变编译次序,或者点击Auto Generate让Model Sim来自动决定。
4. 在Work Space面板的Project选项卡里任意处右击,选择Compile&Compile
All,编译成功则源文件的status变为绿色对勾。双击载入simulation,波形仿真方法与Basic
Simulation相同。
仿真时,控制激励信号的方法有两种,一种是在源文件里用代码产生仿真的输入信号,如上面的例子(详见程序自带的例子文件的代码),另一种是在波形窗口中编辑输入信号的波形,或者载入已编辑好的波形文件来仿真。在下一篇日志里做了一些介绍。
[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢关于verilog仿真使用#和@的仿真结果不同的研究
最近仿真一段很奇怪的代码,testbench中分别使用#和@,但是输出波形不一致。
代码如下;
module jdshfks(
input clk,
input en ,
input rst_n,
input [3:0] a,
output reg [3:0] b
always@( posedge clk ) begin
if( !rst_n )
b &= 4'b0;
其功能:当en信号有效,输出等于输入。否则输出保持。
其测试代码如下:使用的是ise自带的isim仿真器仿真。
`timescale 1ns / 1ps
reg rst_n;
// Outputs
wire [3:0]
parameter period = 2'd2;
// Instantiate the Unit Under Test (UUT)
jdshfks uut (
.clk(clk),
.rst_n(rst_n),
always #(period/2) clk = ~
initial begin
rst_n = 0;
#10 rst_n = 1;
#period en = 1;
repeat(10)
#period a = ($random)%16;
代码中,使用#period延时一个时钟。
从波形图中,可看出,en在时钟上升沿变化为1,但是此时输出为输入,表示此时输入的en信号有效。但是实际上,此时判定的en信号是无效的,因为是在时钟上升沿时刻刚好变为1,则此刻认为的en信号值应该为时钟上升沿之前一点的en值。也就是为0,那么输出就不应该马上变化,而是要延迟一个时钟周期后再变化。
这个问题真是百思不得其解,采用modelsim仿真,结果也是这样。采用单步调试功能,发现en变化是有效的。即在时钟上升沿时刻的en值改变,此刻仿真认为的en的值为变化后的en值,为1,所以输出马上变化了。
改写testbench,采用@(posedge clk)替换延时一个时钟周期。
仿真代码如下:采用的还是ISE的isim仿真。
`timescale 1ns / 1ps
reg rst_n;
// Outputs
wire [3:0]
parameter period = 2'd2;
// Instantiate the Unit Under Test (UUT)
jdshfks uut (
.clk(clk),
.rst_n(rst_n),
always #(period/2) clk = ~
initial begin
// Initialize Inputs
rst_n = 0;
#10 rst_n = 1;
@(posedge clk) en = 1;
repeat(10)
@(posedge clk) a = ($random)%16;
其实就是将第一个的testbench的#period换成了@(posedge clk)
仿真结果如下所示:
可看出,此刻在时钟上升沿变化的en信号是无效的,输出不变,要等一个时钟周期后,输出才会等于输入,这与我们想的结果是一致的。。。
看来,仿真中,对于#和@这两个延时的仿真结果是有区别的,特别是对于在时钟上升沿时刻变化的信号,这应该是仿真器有关系的。采用@延时比较准确,因为这样仿真的结果才和预想的一样。因为在实际中,寄存器的输入判断,是判断在时钟边沿之前一刻的输入值。
关注微信公众号verilog很简单的分频,但ISE仿真出来是z,求解答_百度知道
verilog很简单的分频,但ISE仿真出来是z,求解答
module ff(CP,clk_out_UN,cnta
reg [27:0] cnta=28'b0;
reg clk_out_UN4=0;
output clk_out_UN;
output [27:0]
always @(posedge CP)
if(cnta==28'd2)
//if(cnta==28'd)////////////////////////...
我有更好的答案
你的计数器CNTA没有初值,这个在always中不知道执行的对不对,最好是加个复位信号活着赋个初值,这是第一;第二仿真出来是高阻z,也有可能是你激励文件的问题,活着是激励与FF模块连接的问题。
采纳率:59%
为您推荐:
其他类似问题
分频的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 verilog modelsim cpu 的文章

 

随机推荐