|
- module cd4510( //十进制BCD可预置值的可逆加减计数器 VCC:Pin16 GND:Pin8
- input [3:0] A, //[4位宽]预置值输入 Pin:3,13,12,4
- input CLK, //上升沿触发 Pin15
- input CI, //进借位输入 Pin5
- input UD, //高电平:计数加 低电平:计数减 Pin10
- input PE, //高电平Q=T透明 低电平允许计数 Pin1
- input MR, //异步上升沿清零Q Pin9
- output reg [3:0] Q, //[4位宽]计数输出 Pin:2,14,11,6
- output CO //进借位输出 Pin7
- );
- initial Q = 4'd0;
- assign CO = (Q == (UD ? 4'b1001 : 4'b0000)) ? 1'b0 : 1'b1;
- wire [3:0] sum = UD ? ((Q == 4'd9) ? 4'd0 :(Q+4'd1)) : ((Q == 4'd0) ? 4'd9 : (Q-4'd1));
- wire [3:0] R = PE ? ~A : 4'd0;
- wire [3:0] S = PE ? A : 4'd0;
- generate
- genvar i;
- for(i=0;i<4;i=i+1) begin:gen
- always @(posedge R[i] or posedge S[i] or posedge CLK or posedge MR) begin
- if(MR || R[i]) begin
- Q[i] <= 1'b0;
- end else if(S[i]) begin
- Q[i] <= 1'b1;
- end else if(CLK && !CI) begin
- Q[i] <= sum[i];
- end
- end
- end
- endgenerate
- endmodule
- module main(
- input clk, //50Mhz输入 Pin17
- output out //100分频 500Khz输出 Pin40
- );
- wire CO;
- cd4510 U1(
- .A(4'd0),
- .CLK(clk),
- .CI(1'b0),
- .UD(1'd1),
- .PE(1'b0),
- .MR(1'b0),
- .Q(),
- .CO(CO)
- );
- cd4510 U2(
- .A(4'd0),
- .CLK(clk),
- .CI(CO),
- .UD(1'd1),
- .PE(1'b0),
- .MR(1'b0),
- .Q(),
- .CO(out)
- );
- endmodule
复制代码 |
|