卢思萌 信1411011001频率计设计 第 - 26 - 页 共 46 页
图4.7.2 动态位选模块的仿真波形
4.8 BCD译码模块dispdecoder
BCD译码模块主要实现BCD码到7段数码管显示码字段的转换,同时,考虑到频率测量中的一些“零”的处理,比如选择量程1~999999Hz,但被测信号频率为100Hz,这样在显示的时候就需要将6为数码管的前三位屏蔽。
BCD译码模块的结构框图如图4.7.1所示。
图4.8.1 BCD译码模块的结构框图
根据模块实现的功能设计Verilog HDL源代码如下: module dispdecoder( data_in, disp_select, dp_s1hz,dp_s10hz,dp_s100hz,
Q5,Q4,Q3,Q2,Q1,Q0,counter_out, data_out, dp); output [6:0] data_out; output dp;
input [3:0] data_in; input [2:0] disp_select;
input dp_s1hz,dp_s10hz,dp_s100hz; input [3:0] Q5,Q4,Q3,Q2,Q1,Q0; input counter_out; reg dp;
reg [6:0] data_out; reg hide; initial begin
dp <= 1'b0; hide <= 1'b0; end
- 26 -
卢思萌 信1411011001频率计设计 第 - 27 - 页 共 46 页
(dp_s10hz == 1'b1))||
((disp_select == 3'b101) && (dp_s1hz == 1'b1))) dp <= 1'b1; else
dp <= 1'b0; case(disp_select) 3'b000: begin
if((counter_out == 1'b0) && (Q5 == 4'b0))
hide <= 1'b1; else
hide <= 1'b0; end 3'b001: begin
if((counter_out == 1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (dp_s100hz != 1'b1)) hide <= 1'b1; else
hide <= 1'b0; end 3'b010: begin
if((counter_out ==
1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (Q3 == 4'b0) && (dp_s100hz != 1'b1))
hide <= 1'b1; else
hide <= 1'b0; end 3'b011: begin
if((counter_out ==
1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (Q3 == 4'b0) && (Q2 == 4'b0) && (dp_s100hz != 1'b1)&& (dp_s10hz != 1'b1))
hide <= 1'b1;
- 27 -
//译码显示数据
always @(data_in,hide,data_out) begin
if(hide == 1'b0) begin
case(data_in)
4'b0000 : data_out <= 7'b1111110; //0 4'b0001 : data_out <= 7'b0110000; //1 4'b0010 : data_out <= 7'b1101101; //2 4'b0011 : data_out <= 7'b1111001; //3 4'b0100 : data_out <= 7'b0110011; //4 4'b0101 : data_out <= 7'b1011011; //5 4'b0110 : data_out <= 7'b1011111; //6 4'b0111 : data_out <= 7'b1110000; //7 4'b1000 : data_out <= 7'b1111111; //8 4'b1001 : data_out <= 7'b1110011; //9 default : data_out <= 7'b0000000; endcase end end
//小数点位置与零数字的处理 always
@(disp_select,dp_s1hz,dp_s10hz,dp_s100hz,
Q5,Q4,Q3,Q2,Q1,counter_out,dp,hide) begin
if (((disp_select == 3'b001) && (dp_s100hz == 1'b1))||
((disp_select == 3'b011) &&
卢思萌 信1411011001频率计设计 第 - 28 - 页 共 46 页
else (dp_s100hz != 1'b1)&& hide <= 1'b0; (dp_s10hz != 1'b1)) end hide <= 1'b1; 3'b100: begin else if((counter_out == hide <= 1'b0; 1'b0) && (Q5 == 4'b0) && end (Q4 == 4'b0) && default: hide <= 1'b0; (Q3 == 4'b0) && endcase (Q2 == 4'b0) && end (Q1 == 4'b0) && endmodule
该模块定义输入端口如下: ● data_in:BCD码字输入信号
● disp_select:来自动态显示位模块,实现两者之间的同步
● dp_s1hz,dp_s10hz,dp_s100hz:输入小数点位置控制信号来自门控模块 ● Q5,Q4,Q3,Q2,Q1,Q0:计数器的计数值输入,用来控制“零”显示控制 ● counter_out:计数器计数溢出信号,用来提示用户更换更大量程 该模块定义输出端口如下:
● data_out:经过译码后的7段数码管显示数据输出,可以直接连接到数码管的数据端口
● dp:小数点控制信号
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.8.2所示。
图4.8.2 BCD译码模块的仿真波形
- 28 -
卢思萌 信1411011001频率计设计 第 - 29 - 页 共 46 页
4.9 顶层电路top
在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后来实现系统的功能。在数字频率计中,同时采用了电路原理图示的设计以及Verilog HDL语言来编写的顶层电路,其中顶层如图4.9.1所示。
图4.9.1 顶层电路top
用Verilog HDL语言描述如下: module main(
Clock, SW2, SW1, SW0, F_in, over_alarm, dp, disp_data, disp_select
);
input Clock; input SW2; input SW1; input SW0; input F_in; output over_alarm; output dp;
output [6:0] disp_data;
- 29 -
卢思萌 信1411011001频率计设计 第 - 30 - 页 共 46 页
output [5:0] disp_select;
wire SYNTHESIZED_WIRE_0; wire SYNTHESIZED_WIRE_1; wire SYNTHESIZED_WIRE_2; wire [3:0] SYNTHESIZED_WIRE_32;
wire [3:0] SYNTHESIZED_WIRE_33;
wire [3:0] SYNTHESIZED_WIRE_34;
wire [3:0] SYNTHESIZED_WIRE_35;
wire [3:0] SYNTHESIZED_WIRE_36;
wire [3:0] SYNTHESIZED_WIRE_37;
wire SYNTHESIZED_WIRE_9; wire SYNTHESIZED_WIRE_10; wire SYNTHESIZED_WIRE_11; wire SYNTHESIZED_WIRE_12; wire SYNTHESIZED_WIRE_13; wire SYNTHESIZED_WIRE_14; wire SYNTHESIZED_WIRE_15; wire [3:0] SYNTHESIZED_WIRE_16;
wire [2:0] SYNTHESIZED_WIRE_38;
wire SYNTHESIZED_WIRE_24;
wire [3:0] SYNTHESIZED_WIRE_25;
wire [3:0] SYNTHESIZED_WIRE_26;
wire [3:0] SYNTHESIZED_WIRE_27;
wire [3:0] SYNTHESIZED_WIRE_28;
wire [3:0] SYNTHESIZED_WIRE_29;
wire [3:0] SYNTHESIZED_WIRE_30;
assign over_alarm = SYNTHESIZED_WIRE_15;
counter
b2v_inst(.EN(SYNTHESIZED_WIRE
_0),
.CLR(SYNTHESIZED_WIRE_1),.F_IN(F_in),.F_OUT(SYNTHESIZED_WIRE_15),.Q0(SYNTHESIZED_WIRE_32),.Q1(SYNTHESIZED_WIRE_33),.Q2(SYNTHESIZED_WIRE_34),.Q3(SYNTHESIZED_WIRE_35),.Q4(SYNTHESIZED_WIRE_36),.Q5(SYNTHESIZED_WIRE_37)
fdiv b2v_inst1(.clk(Clock), .f1hz(SYNTHESIZED_WIRE_9),.f10hz(SYNTHESIZED_WIRE_10),.f100hz(SYNTHESIZED_WIRE_11),.f1khz(SYNTHESIZED_WIRE_24));
- 30 -