40.简易频率计(基于等精度测量法)(3)

(1)BCD8421码:十进制数字转换成BCD8421码的方法

  • 补零:你需要显示多少位数字,就在前面补上四倍的位宽。比如你要显示一个十进制8位的数字,就在前面补上8*4=32个零。
  • 判断:判断补零部分显示的十进制数字,每位是否大于4,如果大于,则执行加3的操作。
  • 判断完成后,向左移位一位。
  • 最终位移次数与十进制数字位宽相同

(2)Verilog代码实现:

(3)仿真代码:

复制代码
`timescale 1ns/1ns

module BCD_8421_32_tb;

reg				clk			;
reg	[31:0]	data			;
reg				reset_n		;

wire  [3:0]			unit		;
wire  [3:0]			ten		;
wire  [3:0]			hun		;
wire  [3:0]			tho		;
wire  [3:0]			t_tho		;
wire  [3:0]			h_tho		;
wire  [3:0]			o_tho		;
wire  [3:0]			t_o_tho	;

initial clk = 1'd1	;
always #10 clk= ~clk	;

initial begin
	reset_n <= 1'd0;
	#15;
	reset_n <= 1'd1;
	data 	<= 32'd1234_5678;
	#30000;
	data <= 32'd9874_5612;
	#30000;
	$stop;
end

BCD_8421_32 BCD_8421_32_inst
(
			.clk			(clk		),
			.data			(data		),
			.reset_n		(reset_n	),
		
			.unit			(unit		),
			.ten			(ten		),
			.hun			(hun		),
			.tho			(tho		),
			.t_tho		(t_tho	),
			.h_tho		(h_tho	),
			.o_tho		(o_tho	),
			.t_o_tho		(t_o_tho	)
	
);

endmodule

(4)仿真波形:

(5)顶层设计:

复制代码
module freq_meter_top
(
	input 			clk			,
	input				reset_n		,
	input 			clk_test		,
	
	output			DIO			,
	output			SCLK			,
	output			RCLK			
);

	wire 		[31:0]		freq		;
	wire		[31:0]		data		;
	wire  	[3:0]			unit		;
	wire  	[3:0]			ten		;
	wire  	[3:0]			hun		;
	wire  	[3:0]			tho		;
	wire  	[3:0]			t_tho		;
	wire  	[3:0]			h_tho		;
	wire  	[3:0]			o_tho		;
	wire  	[3:0]			t_o_tho	;

freq_meter_calc freq_meter_calc_inst0
(
	.clk			(clk		)	,
	.reset_n		(reset_n	)	,
	.clk_test	(clk_test)	,

	.freq			(freq		)	
);

BCD_8421_32 BCD_8421_32_inst0
(
			.clk			(clk		),
			.data			(freq		),
			.reset_n		(reset_n	),
		
			.unit			(unit		),
			.ten			(ten		),
			.hun			(hun		),
			.tho			(tho		),
			.t_tho		(t_tho	),
			.h_tho		(h_tho	),
			.o_tho		(o_tho	),
			.t_o_tho		(t_o_tho	)
	
);

assign data = {t_o_tho,o_tho,h_tho,t_tho,tho,hun,ten,unit};

hex_top hex_top_inst
(
	.clk			(clk		),
	.reset_n		(reset_n ),
	.data			(data		),
	.DIO			(DIO		),
	.SCLK			(SCLK		),
	.RCLK			(RCLK		)
);


endmodule

(6)顶层仿真代码:

复制代码
`timescale 1ns/1ns

module freq_meter_top_tb;

reg		clk			;
reg		reset_n		;
reg		clk_test		;

wire  	DIO	;
wire 		SCLK	;
wire 		RCLK	;

initial clk = 1'd1;
always#10 clk = ~clk;

initial clk_test	= 1'd1;
always#100 clk_test = ~clk_test;

initial begin 
	reset_n <= 1'd0;
	#15;
	reset_n <= 1'd1;
	#2_000_000;
	$stop;
end


freq_meter_top freq_meter_top_inst
(
	.clk			(clk		),
	.reset_n		(reset_n	),
	.clk_test	(clk_test),
                
	.DIO			(DIO		),
	.SCLK			(SCLK		),
	.RCLK			(RCLK		)
);
	
	defparam freq_meter_top_inst.freq_meter_calc_inst0.MCNT0 = 27'd74_999;
	defparam freq_meter_top_inst.freq_meter_calc_inst0.MCNT1 = 27'd12_499;

endmodule

(7)仿真波形:

(8)引脚分配:

(9)实验现象:

相关推荐
Eloudy3 小时前
QSFP28、RoCEv2、RFSoC-4x2 数据传输与器件链路
网络·fpga开发·rocev2
Echo_cy_3 小时前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
現実君6 小时前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发
Terasic友晶科技8 小时前
【教程】Agilex 5 SoC 的两种启动模式的开发演示(一)(FPGA Configuration First)
fpga开发·agilex 5 soc
ALINX技术博客8 小时前
【黑金云课堂】FPGA技术教程Vitis开发:SD卡WAV文件读取音频播放实验
fpga开发·音视频
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner3 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20203 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug