verilog新手求助,谢谢

两个问题1.input[7:0]a;reg[7:0]a;是将A定义为两种类型吗?能在同一个程中使用吗?2、在计数器中仿真中出现问题:1、如何定义计数值count的类型?仿... 两个问题
1. input [7:0] a;
reg [7:0] a;
是将A定义为两种类型吗?能在同一个程中使用吗?
2、在计数器中仿真中出现问题:
1、如何定义计数值count的类型?仿真结果的count不是想要的
2、结果图中出现延迟(就是在reset上升沿处)不知道是怎么回事?怎么解决?
程序如下:
module counter(clk,reset,out,cout,cin);
input clk,reset,cin;
output [width-1:0] out;
output cout;
reg [width-1:0] out;
reg cout;
parameter width=8;
always @(posedge clk or posedge reset)
begin
if(reset) out='b0;
else out=out+1;
end
assign count=&out&cin;//jinwei
endmodule
展开
 我来答
lzback1
2011-11-19 · TA获得超过2951个赞
知道小有建树答主
回答量:496
采纳率:0%
帮助的人:690万
展开全部
input是指此变量为输入,而reg是指变量的类型是寄存器型。两者并不是同一种声明的方式,input对应的output,而reg对应的wire型。但是原则上,input型变量是不能同时为reg型的,这是基于数字电路的设计要求。
你的第二个问题。首先,计数器是基于时序逻辑的,所以基本上,count需要是reg型。至于是不是output就看你是否要输出它了。
至于你所说的延时问题,由于没有图,所以我猜想你是在time analysis(时序仿真)下得到的结果。有延时是正常的,因为正常的门或者寄存器的传输都需要时间。不过一般情况下,这并不影响最后的功能实现。
不知道我说的清楚与否,欢迎追问~
追问
你好,非常谢谢你的回答。我是新手可能不好理解,但就只能硬记了。
还有疑问:
我的仿真结果,语言描述就是:在100ns内reset=0,期间出现了10个clk信号。我觉得正确结果应该是out=01、02、03一直到0A吧?可是我的仿真结果是out=00、01、03、02、07、06、05、0F、0E。这是怎么回事?谢谢
追答
一般的,在always @语句结构中,是利用寄存器对变量进行相应的存储与操作。这样的话,对于所有变量的赋值,原则上都要选择非阻塞赋值,也就是<=符号。如果不这样做,可能会出现结果无法预知的情况,也就是所谓的竞争—冒险现象。至于100ns的延时时间,可能与此有关,也可能和你仿真设置的时钟频率过高,或者仿真时间过短等有关。
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲、导入文档内容”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表... 点击进入详情页
本回答由AiPPT提供
pc_repair
2011-11-19 · TA获得超过1716个赞
知道小有建树答主
回答量:1150
采纳率:66%
帮助的人:475万
展开全部
1. input [7:0] a;
reg [7:0] a;
一般不这样定义, 其一是不需要, 其二是如果需要也不这么定义, 可用reg [7:0] b. 否则可能有错.
但这种定义很常见:
output [7:0] a;
reg [7:0] a;
它等价于: output reg [7:0] a;
不论input, output它定义的只是wire, 相当于一个netlist名. 加同名reg定义了寄存器输出, 这样有保持能力, 多位可同步.

2. count定义没错. 最后部分这么改, =改<=:
always @(posedge clk or posedge reset)
begin
if(reset) out <= 8'b0;
else out <= out+1;
end
追问
第二个在仿真时还是有问题:(=已经改为<=)
我的仿真结果,语言描述就是:在100ns内reset=0,期间出现了10个clk信号。我觉得正确结果应该是out=01、02、03一直到0A吧?可是我的仿真结果是out=00、01、03、02、07、06、05、0F、0E。这是怎么回事?谢谢
追答
1. 仿了一下,错还真多,  clk周期20ns, 仿真时间20us. 用下面这个代码吧;
module counter(clk,reset,out,count,cin);
parameter width=8;
input clk,reset,cin;
output reg [width-1:0] out;
output reg count;

always @(posedge reset or posedge clk)
begin
if(reset)
out<=cin;
else
{count,out} <={count,out}+8'b1;
end

endmodule
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
suyan323098
2011-11-19
知道答主
回答量:19
采纳率:0%
帮助的人:8.2万
展开全部
第一个问题:input是声明a为输入端口,reg是定义a的数据类型为reg型;可以在同一个程序中使用
第二个问题:在always块中的类型必须是reg型,你那个程序有问题啊,你赋值的时候采用非阻塞赋值(<=) 看看行不行 ,我知道的也就这么多了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
陈北柯b1
2011-11-24 · 超过20用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:46.2万
展开全部
你的输出是count还是cout?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式