用Verilog HDL写的 六进制和十进制计数器 以及30万分频器的程序,大家帮看看有错吗?急!

六进制计数器
module cnt6_2(clr,clk,ena,q,cout);
input clr,clk,ena;
output[3:0] q;
output cout;
reg[3:0] q;
reg cout;
always @(posedge clk or posedge clr)
begin
if(clr)
begin q=4'b0000;cout=0;end
else if(ena)
if(q==4'b0101)
begin q=4'b0000;cout=0;end
else
begin q=q+1;cout=q[2]&&q[0];end
end
endmodule

十进制计数器
module cnt10_2(clr,clk,ena,q,cout);
input clr,clk,ena;
output[3:0] q;
output cout;
reg[3:0] q;
reg cout;
always @(posedge clk or posedge clr)
begin
if(clr)
begin q=4'b0000;cout=0;end
else if(ena)
if(q==4'b1001)
begin q=4'b0000;cout=0;end
else
begin q=q+1;cout=q[3]&&q[0];end
end
endmodule

30万分频器
module clkgen_v(clk,newclk);
input clk;
output newclk;
reg newclk;
reg[15:0] q;
always @(posedge clk)
begin
if(q<16'h752f) q=q+1; //16'h752f=2999
else q=0;
if(q==16'h752f) newclk=1;
else newclk=0;
end
endmodule
不好意思啊,是3万分频器,不是30万!~~!

六进制计数器:cout在什么情况下也不等于1,因为 if(q==4'b0101)时cout=0,而下一个状态q==4'b0000,也不会出现q==4'b0111,q==4'b1101,q==4'b1111这几种情况,如果作为进位,建议在(q==4'b0101)时cout=1,其他情况cout=0;

十进制计数器同上

3万分频器,这种结果占空比为1/30000,如果想要占空比为50%,可以计数到14999(3A97),然后清0,把newclk取反,这样高低电平各15000;

initial
begin
newclk <= 1'b0;
q <= 16'h0;
end
always@(posedge clk)
begin
if(q == 16'h3a97)
begin
newclk <= ~newclk;
q <= 16'h0
end
else
begin
q <= q + 1'b1;
end
end

每个模块注意初始化寄存器
温馨提示:内容为网友见解,仅供参考
无其他回答

用verilog hdl编写十六进制转换十进制的程序
module BCD(clk,data,Ten,One);input clk;input[7:0] data;output[3:0] Ten,One;reg[3:0] Ten,One;integer i;always@ (posedge clk)begin Ten = 4'd0;One = 4'd0;for (i=6;i>=0;i=i-1)begin if (Ten >= 5) Ten = Ten + 3;if (One >= 5) One = One + 3;Ten =...

用verilog编写LED循环显示控制电路(数字电子技术) 分不是问题..._百度...
四.总体方案: 本电路是以555定时器组成多谐振荡器作为频率发生器,多谐振荡器产生1000HZ的振荡波,经过分频器分频,分解成1HZ的脉冲波,随后经过秒计数器,秒计时器是60进制计数器,当计数器计数到60时产生进位脉冲,到分计数器。分计数器也是60进制计数器,当分计数器计数到60时,再次产生更高一级的进位脉冲,脉冲送到...

相似回答