在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3824|回复: 17

[求助]看看这句赋值为什么不可以?(verilog)

[复制链接]
发表于 2004-5-17 22:17:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
module freqdiv(clock,num,rst,divout);
input clock,rst;
input [0:7]num;
output divout;
reg [0:7]count_p,count_n,half;
reg freq_p,freq_n;
assign divout=freq_p||freq_n;
initial  
begin
half=num;
half=(half>>1);
count_p=0;
count_n=0;
end
这是程序开始的一部分, initial的第一句half=num,仿真的时候始终不可以,总是跳过这里到了下一句的移位。是不是wire不能给reg赋值阿?我用half[7:0]=num[7:0]也不可以,改成非阻塞赋值也不可以。
num是输入的分频倍数,如果这样不可以的话,这里应该怎么写才能使输入的num能存到寄存器half中呢?
 楼主| 发表于 2004-5-17 22:19:24 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

贴出全部的程序:
`timescale 1ns/1ns
module freqdiv(clock,num,rst,divout);
input clock,rst;
input [0:7]num;
output divout;
reg [0:7]count_p,count_n,half;
reg freq_p,freq_n;
assign divout=freq_p||freq_n;
initial  
begin
half=num;
half=(half>>1);
count_p=0;
count_n=0;
end

always
@(posedge clock)
begin
if (rst)
begin
count_p=0;
count_n=0;
end
else
begin
if(count_p==num-1)
count_p<=0;
else
count_p<=count_p+1;
end
end
always
@(negedge clock)
begin
if (rst)
begin
count_p=0;
count_n=0;
end
else
begin
if(count_n==num-1)
count_n<=0;
else
count_n<=count_n+1;
end
end
always
@(clock)
begin
freq_p<=(count_p<=half)?1:0;
freq_n<=(count_n<=half)?1:0;
end
endmodule
是一个可控分频器。
testbench是
`timescale 1ns / 1ns
module freqdiv_tb;

//Internal signals declarations:
reg clock;
reg [0:7]num;
reg rst;
wire divout;

// Unit Under Test port map
freqdiv UUT (
.clock(clock),
.num(num),
.rst(rst),
.divout(divout));
initial
begin
clock=0;
rst=1;
num=5;
end
always
clock=#10 ~clock;
initial
begin
#30 rst=0;
#300 $stop;
end
initial
$monitor($realtime,,"ns %h %h %h %h ",clock,num,rst,divout);
endmodule
发表于 2004-5-17 22:35:49 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

initial  
begin
half=num;
half=(half>>1);
count_p=0;
count_n=0;
end
相当于 #0 half=num;half=(half>>1); 就是说在第0个时间单位同时对一个变量赋值两次,以后面一次为准是正常的。
另外,提醒一下,intial块是不可综合的,你最好用其他方法来实现这个功能。
 楼主| 发表于 2004-5-17 22:52:24 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

但是我在half=(half>>1)前面加上一个时延,比如#30,依然是不能赋值。:(
而且如果这种类型的语句,不用initial的话,能用什么结构呢?也就是初始时用wire对一个寄存器赋值一次,应该用什么结构呢?
发表于 2004-5-17 23:12:48 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

你用什么仿真器仿真的?
如果要硬件实现的话,最好用上电时rst信号给half赋初始值。
 楼主| 发表于 2004-5-17 23:43:58 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

也就是说在rst=1时给half赋值吗?
我用的是modelsim5.8c 就是不可以,很头疼。
发表于 2004-5-18 09:48:12 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

你如果只是仿真玩的话,改成这样:
initial  
begin
#1 half=num;count_p=0;count_n=0;
#30 half=(half>>1);
end
因为你的num也是在0时刻赋值的。
实际用就是在rst=1的时候让half=num;
 楼主| 发表于 2004-5-18 09:58:34 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

谢谢楼上的,问题已解决,我把前面的initial改成了这样:
`timescale 1ns/1ns
module freqdiv(clock,rst,num,divout);
input clock,rst;
input [0:7]num;
output divout;
reg [0:7]count_p,count_n,half,all;
reg freq_p,freq_n;
assign divout=freq_p&freq_n;
always@(negedge rst)
begin
all=num;
half=all>>1;
end
这样仿真就可以通过了。
小弟初学verilog,谢谢大哥帮忙!
发表于 2004-5-18 10:11:21 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

这个,其实还是不对,会把rst综合成时钟。不过我还是不多说了,你自己摸索一下,慢慢体会吧,有好处的。
 楼主| 发表于 2004-5-18 18:37:59 | 显示全部楼层

[求助]看看这句赋值为什么不可以?(verilog)

改了一下,在rst为高的时候给half赋值
加了一个all寄存器,在中间传递数据。
always
@(posedge clock)
begin
if (rst)
begin
all=num;
half=all>>1;
count_p=0;
count_n=0;
end
else
begin
if(count_p==num-1)
count_p<=0;
else
count_p<=count_p+1;
end
end
正在学习综合,刚开始。
斑竹能给推荐一个中文的综合的初级教程吗?主要是没有方向:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-4 20:57 , Processed in 0.042551 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表