always@(posedge Pause)begin if(tp==1)tp=0; else tp=tp+1; end always@(posedge CP or posedge No_water or posedge Open or posedge Start)begin if(Start)c_e=0; else if(No_water|Open)begin if((water_out==1&&s[2:0]==3'b000)||(danger==1&&s[2:0]==3'b011))c_e=1; else c_e=0; end else if(CP)begin if(count[2:0]==3'b010)begin c_t=0;c_e=0;count[2:0]=0;end else if(c_e==1)begin count[2:0]=count[2:0]+3'b001;c_t=1;end else if(c_e==0)count=0; end end assign a=((c_t|CP&finish)|(Start|Set|Pause|Speed))&CP_1k; endmodule
时间: 2024-03-15 10:41:40 浏览: 107
这段 Verilog HDL 代码包含了两个始终块(always block)和一个输出端口(assign)。第一个始终块在输入信号 Pause 上升沿时执行,用于更新变量 tp 的值。如果 tp 等于 1,则将其重置为 0,否则将其加 1。
第二个始终块在输入信号 CP、No_water、Open 或 Start 上升沿时执行,用于更新变量 c_e、c_t 和 count 的值。如果输入信号 Start 为 1,则将变量 c_e 设置为 0。否则,如果 No_water 或 Open 为 1,则检查变量 water_out 或 danger,根据条件将变量 c_e 设置为 1 或 0。如果 CP 为 1,则检查计数器变量 count 的值,根据条件更新变量 c_e 和计数器。最后,将变量 a 的值设置为一些逻辑表达式的结果,该表达式使用输入信号和一些变量的值计算。
相关问题
module cout(clk,clk1,clk2,clk3,clk4,clk5,start,pause,msh,msl,sh,sl,rst,kin,kout,clk,wei,shi_h,shi_l,fen_h,fen_l,duan, a,led7s); input clk,clk3,clk4,clk5,start,pause,rst,kin; output clk1; output clk2; reg [15:0]k2; reg[7:0] k1; reg clk2; reg clk1; output [3:0]msh,msl,sh,sl; reg[3:0] msh,msl,sh,sl; reg cn1; reg start1=1,pause1=1,rst1=0; output kout; reg kout; reg [3:0]kh,kl; input [3:0]shi_h,shi_l,fen_h,fen_l; output [3:0]duan; output [3:0]wei; reg [3:0]duan; reg [3:0]wei; parameter s0=0,s1=1,s2=2,s3=3; reg [3:0]c_st,n_st; input[3:0]a; output[6:0]led7s; reg[6:0]led7s; //分频模块 always@(posedge clk2) begin if(k2<16'd12499) k2=k2+8'd1; else k2=0; if(k2==16'd12499) clk2=clk2+1;//clk2=2000hz end always @(posedge clk2) begin if(k1<8'd9) k1=k1+8'd1; else k1=0; if(k1==8'd9) clk1=clk1+1;//clk1=100hz end //计数模块 always @(posedge start) start1=~start1; always @(posedge pause) pause1=~pause1; always @(posedge rst) rst1=rst1+1'b1; always @(posedge clk3 or negedge rst1 ) begin if(!rst1) begin{msh,msl}<=8'h00; cn1<=0; end else if(pause1^start1) begin if(msl==9) begin msl<=0; if(msh==9) begin msh<=0; cn1<=1; end else msh<=msh+1'h1; end else begin msl<=msl+1'h1; cn1<=0; end end end always @(posedge cn1 or negedge rst1 ) begin if(!rst1) begin{sh,sl}<=8'h00; end else if(start1^pause1) begin if(sl==9) begin sl<=0; if(sh==5) sh<=0; else sh<=sh+1'h1; end else begin sl<=sl+1'h1; end end end //按键消抖模块 always@(posedge clk4) begin if(!kin) kl<=kl+1'b1; else kl<=4'b0000; end always@(posedge clk4) begin if(kin) kh<=kh+1'b1; else kh<=4'b0000; end always@(posedge clk4) begin if(kh>4'b1100) kout<=1'b1; else if(kl>4'b0111) kout<=1'b0; end //数码管位选模块 always@(posedge clk5) begin c_st<=n_st; end always@* begin case(c_st) s0:begin n_st=s1;wei<=4'b0111;duan<=shi_h; end s1:begin n_st=s2;wei<=4'b1011;duan<=shi_l; end s2:begin n_st=s3;wei<=4'b1101;duan<=fen_h; end s3:begin n_st=s0;wei<=4'b1110;duan<=fen_l; end default:begin n_st=s1;wei<=4'b0111;duan<=shi_h; end endcase end //数码管显示模块 always@(a) case(a) 4'b0000 : led7s<=~7'b0111111; 4'b0001 : led7s<=~7'b0000110; 4'b0010 : led7s<=~7'b1011011; 4'b0011 : led7s<=~7'b1001111; 4'b0100 : led7s<=~7'b1100110; 4'b0101 : led7s<=~7'b1101101; 4'b0110 : led7s<=~7'b1111101; 4'b0111 : led7s<=~7'b0000111; 4'b1000 : led7s<=~7'b1111111; 4'b1001 : led7s<=~7'b1101111; 4'b1010 : led7s<=~7'b1110111; 4'b1011 : led7s<=~7'b1111100; 4'b1100 : led7s<=~7'b0111001; 4'b1101 : led7s<=~7'b1011110; 4'b1110 : led7s<=~7'b1111001; 4'b1111 : led7s<=~7'b1110001; default : led7s<=~7'b0111111; endcase endmodule
这段代码是一个 Verilog HDL 代码,实现了一个数字钟的功能,包括分频模块、计数模块、按键消抖模块、数码管位选模块和数码管显示模块。其中,分频模块将输入时钟分频得到一个 2 kHz 的时钟信号,计数模块使用该时钟信号实现秒的计数和分的计数,按键消抖模块实现了按键输入的消抖,数码管位选模块实现了数码管的位选功能,数码管显示模块通过接收输入的数字信号 a 实现了数码管的数码显示。
这个代码为什么实现不了流水灯`timescale 1ns / 1ps module led( input clk, input reset, output reg[7:0]led ); reg [25:0] cnt; parameter TIME = 26'd50_000_000; always @(posedge clk) begin if (reset) begin cnt <= 26'd0; end else if (cnt == TIME - 1'b1) begin cnt <=26'd0; end else begin cnt <= cnt + 1'd1; end end always @(posedge clk) begin if (reset) begin led <= 8'b0000_0001; end else if (cnt == TIME - 1'b1) begin led <= {led[0],led[7:1]}; end else begin led <= led; end end endmodule
这个代码实现不了流水灯的原因是因为在第二个 always 块中,每次时钟上升沿都会执行一个赋值操作,但是当计数器 cnt 未达到 TIME - 1 时,赋值操作为 `led <= led;`,这相当于把 `led` 的值赋值给本身,因此对 `led` 的值没有任何改变,也就无法实现流水灯的效果。
为了实现流水灯的效果,可以把第二个 always 块改成如下形式:
```
always @(posedge clk) begin
if (reset) begin
led <= 8'b0000_0001;
end
else if (cnt == TIME - 1'b1) begin
led <= {led[6:0], 1'b0};
end
else begin
led <= {led[6:0], led[7]};
end
end
```
这里使用了一个类似于之前提到的循环移位的方法,将 `led` 的最低位赋值给 `led` 的最高位,其他位向左移动一位,实现了流水灯的效果。
阅读全文