verilog不能实现方波的,它只能实现一个硬件结构描述,比如用verilog实现一个74HC138芯片,至于方波是要在用语言实现完芯片构造的描述之后,用软件来设置输入之后来仿真得到输出时实现的,比如你可以设置你用verilog实现的芯片在仿真时某个输入引脚为方波
代码中,step1和step2,分别是一个五进制的计数器,step1是由时钟的上升沿计数,step2是由时钟的下降沿计数的。step 1的最低位和step2的最低位波形如上图所示。上述两个信号进行或 *** 作输出clockout信号,也就是说clockout是clockin的五分频输出电路,占空比为50%。
假设你的clk就是1s周期的时钟
那么10s的应该是这么写
reg
[3:0]
cnt_10;
reg
clk_10s;
always
@
(posedge
rst
or
posedge
clk)
begin
if
(rst)
begin
cnt_10
<=
0;
clk_10s<=
0;
end
else
begin
if
(cnt_10==4)
begin
cnt_10
<=
0;
clk_10s<=~clk_10s;
end
else
begin
cnt_10
<=
cnt_10
+1;
clk_10s<=
clk_10s;
end
end
60的,cnt就在29归零,同时clk_60s反向
是在半周期反向才是占空比1:1。
其实count==99999999时清零这个是有用的。会对count[10]这个信号的占空比产生影响。
假设有一下代码,cnt两位宽,你看cnt[1]这个信号。
always @(posedge clk)
if(cnt==2'h2)
cnt <= 2'h0;
else
cnt <= cnt + 2'h1;
这样子cnt的值为0 1 2 0 1 2 0 1 2 0 1 2
然后你在纸上画一下cnt[1]这个信号,你会发现他对于clk来说是一个3分频的时钟,然而他的
高电平时间只占一个clk周期,他的占空比是1/3;
但是下面的代码,他的占空比就是50%了,这时候他对clk来说是个4分频时钟。
always @(posedge clk)
cnt <= cnt + 2'h1;
看别人的代码是比较头痛,但是学习的过程就是这样,慢慢来吧。
建议你先将BZQ,TSQ设成常数,再试试。
看了你的代码,觉得除了设计之外,有几个问题。
1verilog不是C语言。实现乘除法时,直接写运算符虽然可以综合,但逻辑很深,时序会很差。例如:if(cnt<(BZQ/TSQ)&&cnt>=(BZQ/TSQ)duty/100),这样的逻辑深度是可怕的,估计只能跑到几MHz。你所遇到的问题不排除是时序问题(timing issue)。
2第一个always块很不规范,而且不是同步电路。更好的实现方法是:
always @(posedge BCLK)
begin
if(~START)
begin
start<=1;
end
end
3系统没有复位信号。所有的数字系统应当有系统复位。always块应当用这样的模板:
always @(posedge mclk or posedge mrst)
begin
if(mrst)
begin
reg1 <= 0;
end
else
begin
if ()
begin
reg1<=input1;
end
else
begin
reg1 <= input2;
end
end
end
4信号或寄存器名称不能靠大小写区分。虽然verilog大小写是敏感的,但没有公司会允许大小写混用,一般都规定统一大写或小写,更何况是一样的名称,仅靠大小写区分。如START,可以改成,start_in。
以上就是关于您好,verilog怎么实现一个占空比为20%的方波脉冲全部的内容,包括:您好,verilog怎么实现一个占空比为20%的方波脉冲、求这个verilog程序的各条语句的解释、用verilog语言编写四分频程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)