Verilog 三位二进制计数器模块设计及数码管显示
// 计数器模块,包含一个三位二进制计数器和一个输出进位信号的模块 module counter_2( input clk, // 时钟信号 input rst, // 复位信号 output [6:0]a_to_g1, // 数码管显示输出信号 output cout, // 进位输出信号 output [7:0]bitcode); // 用于显示二进制计数器当前值的输出信号 wire [3:0]count; // 三位二进制计数器输出信号 fre1 u1(clk,rst,count); // 实例化一个三位二进制计数器模块 decoder_xianshi1 u2(.a({1'b0,count[2:0]}),.a_to_g(a_to_g1),.bitcode(bitcode)); // 实例化一个数码管显示模块 assign cout=count[0]&count[1]&count[2]; // 进位信号等于三位计数器输出信号与运算的结果 endmodule
// 三位二进制计数器模块
module fre1
#(parameter integer count1s=33554431, // 计数器的最大值
parameter integer count2s=15) // 计数器的位数
(input clk, // 时钟信号
input rst, // 复位信号
output [3:0]count); // 计数器输出信号
reg [24:0] count1; // 用于计数的寄存器
reg [3:0] count2; // 用于输出计数器值的寄存器
always @(posedge clk) // 在上升沿触发计数
if(rst==0) // 复位时清零计数器
begin
count1<=0; count2<=0;
end
else if (count1==count1s) // 当计数器达到最大值时
if (count2==count2s) // 当计数器的值也达到最大值时,将计数器清零
begin
count2<=0; count1<=0;
end
else // 否则计数器的值加1,计数器清零
begin
count1<=0; count2<=count2+1;
end
else count1<=count1+1; // 否则计数器的值加1
assign count=count2; // 计数器的输出信号等于计数器的值
endmodule
// 数码管显示模块 module decoder_xianshi1( input wire [3:0] a, // 输入的二进制数值 output wire [7:0]bitcode, // 用于显示二进制计数器当前值的输出信号 output [6:0] a_to_g ); // 数码管显示输出信号 assign bitcode[7:0]=8'b00000001; // 用于显示二进制计数器当前值的输出信号的默认值 sw_smg16 u1(a,a_to_g); // 实例化一个数码管显示模块 endmodule
// 数码管显示模块 module sw_smg16( input [3:0]sw, // 输入的二进制数值 output reg[6:0]a_to_g); // 数码管显示输出信号 always@(sw) // 当输入信号发生变化时 begin case(sw) // 根据不同的输入信号值,输出不同的数码管显示信号 4'b0000:a_to_g=7'h3f; // 显示数字0 4'b0001:a_to_g=7'h06; // 显示数字1 4'b0010:a_to_g=7'h5b; // 显示数字2 4'b0011:a_to_g=7'h4f; // 显示数字3 4'b0100:a_to_g=7'h66; // 显示数字4 4'b0101:a_to_g=7'h6d; // 显示数字5 4'b0110:a_to_g=7'h7d; // 显示数字6 4'b0111:a_to_g=7'h07; // 显示数字7 4'b1000:a_to_g=7'h7f; // 显示数字8 4'b1001:a_to_g=7'h6f; // 显示数字9 4'b1010:a_to_g=7'h77; // 显示字母A 4'b1011:a_to_g=7'h7c; // 显示字母B 4'b1100:a_to_g=7'h39; // 显示字母C 4'b1101:a_to_g=7'h5e; // 显示字母D 4'b1110:a_to_g=7'h79; // 显示字母E 4'b1111:a_to_g=7'h71; // 显示字母F default:a_to_g=7'h00; // 默认输出0 endcase end
// 仿真模块 module sim_counter_2; reg clk; // 时钟信号 reg rst; // 复位信号 wire cout; // 进位输出信号 wire [6:0]a_to_g1; // 数码管显示输出信号 wire [7:0]bitcode; // 用于显示二进制计数器当前值的输出信号 counter_2 u0(.clk(clk),.rst(rst),.a_to_g1(a_to_g1),.cout(cout),.bitcode(bitcode)); // 实例化计数器模块 initial begin clk=1'b0; rst=1'b0; #200; rst=1'b1; // 初始化时钟和复位信号 end always #10 clk=~clk; // 时钟信号每10个时间单位翻转一次 endmodule
原文地址: https://www.cveoy.top/t/topic/oSe0 著作权归作者所有。请勿转载和采集!