课程设计-=--基于veriloghdl数字频率计设计与实现内容摘要:

Q1,Q2,Q3,Q4,Q5)。 output [3:0] Q0,Q1,Q2,Q3,Q4,Q5。 input clk。 input [3:0] A0,A1,A2,A3,A4,A5。 reg [3:0] Q0,Q1,Q2,Q3,Q4,Q5。 always @(posedge clk) begin Q0 = A0。 Q1 = A1。 Q2 = A2。 Q3 = A3。 Q4 = A4。 Q5 = A5。 end Endmodule 该模块定义输入端口如下: ● clk:所存数据信号输入,当 clk 的上升沿到来时,寄存器将输入端信号锁存进寄存器 ,并且改变输出。 ● A0,A1,A2,A3,A4,A5:寄存器的数据输入端 该模块定义输出端口如下: ● Q0,Q1,Q2,Q3,Q4,Q5:寄存器的数据输出端。 在 Altera 公司的软件工具 QuartusII 中编译和波形仿真得到波形如图 所示。 22 图 寄存器模块的仿真波形 多路选择模块 data_mux 多路选择模块实现测量频率值的分时显示,即动态显示。 经过多路选择器模块来分时地传输数据。 多路选择模块的结构如图 所示。 图 多路选择模块结构框图 根据模块 实现的功能设计 Verilog HDL 源代码如下: module data_mux(disp_select,A0,A1,A2,A3,A4,A5,Q)。 output [3:0] Q。 input [2:0]disp_select。 input [3:0] A0,A1,A2,A3,A4,A5。 reg [3:0] Q。 always @(disp_select,A5,A4,A3,A2,A1,A0,Q) begin case(disp_select) 339。 b000: Q = A5。 339。 b001: Q = A4。 339。 b010: Q = A3。 339。 b011: Q = A2。 339。 b100: Q = A1。 339。 b101: Q = A0。 default: Q = 439。 b0。 endcase end Endmodule 23 该模块定义输入端口如下: ● disp_select:选择信号输入 ● A0,A1,A2,A3,A4,A5:多路选择模块的数据输入端口 该模块定义输出端口如下: ● 多路选择模块的数据输出端口。 在 Altera 公司的软件工具 QuartusII 中编译和波形仿真得到波形如图 所示。 图 多路选择模块的仿真波形 动态位选模块 dispselect 动态位选模块用来驱动数码动态地显示频率测量数据,分时地选择各个数码管进行显示 动态位选的结构框图 所示。 24 图 动态位选模块的结构框图 根据模块实现的功能设计 Verilog HDL 源代码如下: module dispselect(clk,disp_select,Q)。 output [5:0] Q。 output [2:0] disp_select。 input clk。 reg [5:0] Q。 reg [2:0] disp_select。 always @(posedge clk) begin if(disp_select 339。 b101) disp_select = disp_select + 339。 b1。 else disp_select = 339。 b0。 case(disp_select) 339。 b000: Q = 639。 b100000。 339。 b001: Q = 639。 b010000。 339。 b010: Q = 639。 b001000。 339。 b011: Q = 639。 b000100。 339。 b100: Q = 639。 b000010。 339。 b101: Q = 639。 b000001。 default: Q = 639。 b000000。 endcase end endmodule 该模块定义输入端口如下: ● clk:动态位选的时钟信号输入,一般取 1KHz 左右的标准时钟。 该模块定义输出端口如下: ● disp_select:动态位选中间量输出,用于与系统中其他模块之间的同步。 ● Q:动态位选信号输出,可以直接接到数码管的公共端。 在 Altera 公司的软件工具 QuartusII 中编译和波形仿真得到波形如图 所示。 25 图 动态位选模块的仿真波形 BCD 译码模块 dispdecoder BCD 译码模块主要实现 BCD 码到 7 段数码管显示码字段的转换,同时,考虑到频 率测量中的一些“零”的处理,比如选择量程 1~999999Hz,但被测信号频率为 100Hz,这样在显示的时候就需要将 6为数码管的前三位屏蔽。 BCD 译码模块的结构框图如图 所示。 图 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 = 139。 b0。 hide = 139。 b0。 end 26 //译码显示数据 always @(data_in,hide,data_out) begin if(hide == 139。 b0) begin case(data_in) 439。 b0000 : data_out = 739。 b1111110。 //0 439。 b0001 : data_out = 739。 b0110000。 //1 439。 b0010 : data_out = 739。 b1101101。 //2 439。 b0011 : data_out = 739。 b1111001。 //3 439。 b0100 : data_out = 739。 b0110011。 //4 439。 b0101 : data_out = 739。 b1011011。 //5 439。 b0110 : data_out = 739。 b1011111。 //6 439。 b0111 : data_out = 739。 b1110000。 //7 439。 b1000 : data_out = 739。 b1111111。 //8 439。 b1001 : data_out = 739。 b1110011。 //9 default : data_out = 739。 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 == 339。 b001) amp。 amp。 (dp_s100hz == 139。 b1))|| ((disp_select == 339。 b011) amp。 amp。 (dp_s10hz == 139。 b1))|| ((disp_select == 339。 b101) amp。 amp。 (dp_s1hz == 139。 b1))) dp = 139。 b1。 else dp = 139。 b0。 case(disp_select) 339。 b000: begin if((counter_out == 139。 b0) amp。 amp。 (Q5 == 439。 b0)) hide = 139。 b1。 else hide = 139。 b0。 end 339。 b001: begin if((counter_out == 139。 b0) amp。 amp。 (Q5 == 439。 b0) amp。 amp。 (Q4 == 439。 b0) amp。 amp。 (dp_s100hz != 139。 b1)) hide = 139。 b1。 else hide = 139。 b0。 end 339。 b010: begin if((counter_out == 139。 b0) amp。 amp。 (Q5 == 439。 b0) amp。 amp。 (Q4 == 439。 b0) amp。 amp。 (Q3 == 439。 b0) amp。 amp。 (dp_s100hz != 139。 b1)) hide = 139。 b1。 else hide = 139。 b0。 end 339。 b011: begin if((counter_out == 139。 b0) amp。 amp。 (Q5 == 439。 b0) amp。 amp。 (Q4 == 439。 b0) amp。 amp。 (Q3 == 439。 b0) amp。 amp。 (Q2 == 439。 b0) amp。 amp。 (dp_s100hz != 139。 b1)amp。 amp。 (dp_s10hz != 139。 b1)) hide = 139。 b1。 27 else hide = 139。 b0。 end 339。 b100: begin if((counter_out == 139。 b0) amp。 amp。 (Q5 == 439。 b0) amp。 amp。 (Q4 == 439。 b0) amp。 amp。 (Q3 == 439。 b0) amp。 amp。 (Q2 == 439。 b0) amp。 amp。 (Q1 == 439。 b0) amp。 amp。 (dp_s100hz != 139。 b1)amp。 amp。 (dp_s10hz != 139。 b1)) hide = 139。 b1。 else hide = 139。 b0。 end default: hide = 139。 b0。 endcase end endmodule 该模块定义输入端口如下: ● data_in: BCD 码字输入信号 ● disp_select:来自动态显示位模块,实现两者之间的同步 ● dp_s1hz, dp_s10hz, dp_s100hz:输入小数点位置。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。