问些简单的问题
时间:10-02
整理:3721RD
点击:
上次发了些问题,但由于自己的原因,所以没能表达明白。
那我重新说下。
我最近刚学verilog语言,作业要求做一个放快速度的数字时钟,我们实验用的芯片是ep1c6t114c8n。
现在有两种数码管,四联和二连的各一个。
我在做四联向2联进位时,发生了错误,即进位并没有安预定目标进一位,而是进了15位。
于是我认为是因为忘记设置同步进位了,但是设置完同步计数器后,却发现没有进位了。
但找不出代码什么错误。
请各位大侠一定要帮忙,原因肯定出在计数器上,显示部分没问题。
四联数码管的计数器代码分别如下
其中,秒个位与分个位显示于进位方式一致,秒十位和分十位进位方式一致。
秒个位:ov_in是进位输入,ov_out是进位输出
module count0(clk,ov_in,count,ov_out);
input clk,ov_in;
output [3:0] count;
reg [3:0] count;
output ov_out;
reg ov_out;
always @(posedge clk)
begin
if(ov_in==1)
begin
count<=count+1'b1;
end
if(count==4'b1010)
count<=4'b0000;
end
always @(count)
begin
if(count==4'b1010)
ov_out<=1'b1;
else
ov_out<=1'b0;
end
endmodule
秒十位:low用来表示低位显示为,ov_in是进位输入,ov_out是进位输出
module count6(clk,low,ov_in,count,ov_out);
input ov_in;
input [3:0] low;
input clk;
output [3:0] count;
reg [3:0] count,count1;
output ov_out;
reg ov_out;
always @(posedge clk)
begin
if(ov_in==1)
begin
count1<=count1+1'b1;
count<=count+1'b1;
end
if(count==4'b0110)
count<=4'b0000;
if((count1==4'b0101 && low==4'b1001))
begin
count1<=4'b0000;
end
end
always @(count)
begin
if(count==4'b0110)
ov_out<=1'b1;
else
ov_out<=1'b0;
end
endmodule
分个位:同秒个位
分十位:同时个位
二联数码管计数器代码为
其中ov_in1,ov_in2,ov_in3,ov_in4,用来描述进位信号,即当进位全一时在开始计数,count_h4bit,count_l4bit为小时的个位十位。
module count(clk_8m,ov_in1,ov_in2,ov_in3,ov_in4,count_h4bit,count_l4bit);
input ov_in1,ov_in2,ov_in3,ov_in4,clk_8m;
output [3:0]count_h4bit,count_l4bit;
reg [3:0]count_h4bit,count_l4bit;
always @(posedge clk_8m)
begin
if(ov_in1==1 && ov_in2==1 && ov_in3==1 && ov_in4==1 )
begin
count_l4bit<=count_l4bit+4'b0001;
if(count_l4bit==4'd10)
begin
count_l4bit<=0;
count_h4bit<=count_h4bit+4'b0001;
if(count_l4bit==4'b0100 & count_h4bit==4'b0010)
begin
count_h4bit<=0;
count_l4bit<=0;
end
end
end
end
endmodule
框图部分如下:(有点乱。)
那我重新说下。
我最近刚学verilog语言,作业要求做一个放快速度的数字时钟,我们实验用的芯片是ep1c6t114c8n。
现在有两种数码管,四联和二连的各一个。
我在做四联向2联进位时,发生了错误,即进位并没有安预定目标进一位,而是进了15位。
于是我认为是因为忘记设置同步进位了,但是设置完同步计数器后,却发现没有进位了。
但找不出代码什么错误。
请各位大侠一定要帮忙,原因肯定出在计数器上,显示部分没问题。
四联数码管的计数器代码分别如下
其中,秒个位与分个位显示于进位方式一致,秒十位和分十位进位方式一致。
秒个位:ov_in是进位输入,ov_out是进位输出
module count0(clk,ov_in,count,ov_out);
input clk,ov_in;
output [3:0] count;
reg [3:0] count;
output ov_out;
reg ov_out;
always @(posedge clk)
begin
if(ov_in==1)
begin
count<=count+1'b1;
end
if(count==4'b1010)
count<=4'b0000;
end
always @(count)
begin
if(count==4'b1010)
ov_out<=1'b1;
else
ov_out<=1'b0;
end
endmodule
秒十位:low用来表示低位显示为,ov_in是进位输入,ov_out是进位输出
module count6(clk,low,ov_in,count,ov_out);
input ov_in;
input [3:0] low;
input clk;
output [3:0] count;
reg [3:0] count,count1;
output ov_out;
reg ov_out;
always @(posedge clk)
begin
if(ov_in==1)
begin
count1<=count1+1'b1;
count<=count+1'b1;
end
if(count==4'b0110)
count<=4'b0000;
if((count1==4'b0101 && low==4'b1001))
begin
count1<=4'b0000;
end
end
always @(count)
begin
if(count==4'b0110)
ov_out<=1'b1;
else
ov_out<=1'b0;
end
endmodule
分个位:同秒个位
分十位:同时个位
二联数码管计数器代码为
其中ov_in1,ov_in2,ov_in3,ov_in4,用来描述进位信号,即当进位全一时在开始计数,count_h4bit,count_l4bit为小时的个位十位。
module count(clk_8m,ov_in1,ov_in2,ov_in3,ov_in4,count_h4bit,count_l4bit);
input ov_in1,ov_in2,ov_in3,ov_in4,clk_8m;
output [3:0]count_h4bit,count_l4bit;
reg [3:0]count_h4bit,count_l4bit;
always @(posedge clk_8m)
begin
if(ov_in1==1 && ov_in2==1 && ov_in3==1 && ov_in4==1 )
begin
count_l4bit<=count_l4bit+4'b0001;
if(count_l4bit==4'd10)
begin
count_l4bit<=0;
count_h4bit<=count_h4bit+4'b0001;
if(count_l4bit==4'b0100 & count_h4bit==4'b0010)
begin
count_h4bit<=0;
count_l4bit<=0;
end
end
end
end
endmodule
框图部分如下:(有点乱。)
你后仿真过吗? 没有详细看程序,但是感觉你程序写的不太好,没有层次感,我今晚看看方针测试一下
用quartus2仿真后没什么问题。但实际走有问题,我很郁闷
并列if隐含了优先级关系,即最后一个if的优先级高。不知道你是否考虑到了。
写成if...else if...else if ...else的模式。
这样条件的优先级别你心中就有数了