2023/10/29
Counter 1000
已定义了一个BCD模块,要求从1000Hz中分离出1Hz的信号,即创建一个分频器
module bcdcount ( input clk, input reset, input enable, output reg [3:0] Q );
例化三次模块,第一次代表个位。第二次代表十位,第三次代表百位。
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
wire [3:0] q0,q1,q2;
bcdcount counter0 (clk, reset, c_enable[0],q0);
bcdcount counter1 (clk, reset, c_enable[1],q1);
bcdcount counter2 (clk, reset, c_enable[2],q2);
assign c_enable[0] = 1'b1;
assign c_enable[1] = q0==4'd9;
assign c_enable[2] = (q0==4'd9& q1==4'd9);
assign OneHertz = (q0==4'd9&q1==4'd9&q2==4'd9);
/*上一部分可以简化为
assign c_enable = {q0==4'd9& q1==4'd9,q0==4'd9,1'b1};
assign OneHertz = (q0==4'd9&q1==4'd9&q2==4'd9);;
*/
endmodule
利用BCD模块创建一个1~1000的计数器(PS:有点类似与上一题的进阶版)
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
assign ena[3:1] = {q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd9 ,
q[7:4] == 4'd9 && q[3:0] == 4'd9,
q[3:0] == 4'd9};
bcdcount counter0(clk,reset,1'b1,q[3:0]);
bcdcount counter1(clk,reset,ena[1],q[7:4]);
bcdcount counter2(clk,reset,ena[2],q[11:8]);
bcdcount counter3(clk,reset,ena[3],q[15:12]);
endmodule
module bcdcount (
input clk,
input reset,
input enable,
output [3:0] cout);
always@(posedge clk)begin
if(reset) begin
cout <= 1'b0;
end
else begin
if(enable)begin
if(cout == 4'd9)begin
cout <= 4'd0;
end
else begin
cout <= cout+1'b1;
end
end
else begin
cout <= cout;
end
end
end
endmodule
12 hour clock(好复杂啊好不想思考也不想去理解,先做后边的把)
实现图片中功能
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out
);
reg [3:0] out_temp;
assign out = out_temp[3];
always @(posedge clk)begin
if(!resetn)
out_temp <= 4'b0;
else
out_temp <= {out_temp[2:0],in};
/*注意上面这一条语句的使用,学会举一反三,可以使程序简洁很多*/
end
endmoule