基于fpga的数字频率及设计与实现内容摘要:
13 第四章 频率计的实现 时钟信号分频模块的设计 由于系统时钟为 1Khz,因此要将其进行 1000分频得到 1hz的周期信号,分频程序比较简单,其中 clk为输入的 1Khz系统时钟信号, clk1为输出的 1hz信号,现将源程序摘抄如下: module clkdiv(clk,clk1)。 input clk。 output clk1。 reg clk1。 reg [10:0] count。 always@(posedge clk) begin count=count+1。 if(count==1139。 d500) begin count=1139。 d0。 clk1=~clk1。 end end endmodule 运用 Quartus II 软件自带仿真器进行仿真的结果如图 41 所示。 图 41:分频模块仿真图 由上图可见当时钟计数到第 500 个时,输出信号发生跳变,又经过 500 个时钟周期后再次跳变,因此上述代码达到了 1000 分频的目的。 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 14 测频控制信号发生模块的设计 频率测量的的基本原理是计算每秒内待测信号的脉冲个数。 这就要求测频控制信号发生模块的计数使能信号 teten 能产生一个 1s脉宽的周期信号,并对频率计的每一个计数器 tm10 的 ena 使能端进行同步控制。 当 teten 高电平时允许计数,低电平时停止计数,并保持其所计的数。 在停止计数器件,首先需要一个锁存信号 load 的上跳沿将计数器在前 1 秒的计数值锁存进锁存器 reg1 中一段时间后稳定输出。 设置锁存器的好处是,显示数据的稳定,不会因为周期性的计数及清零产生闪烁。 锁存信号之后,必须有一个 clr_t 清零信号对计数器清零,为下一秒计数做准备。 这样需设计一个 测频控制信号发生模块,而且它的工作要满足一定的时序关系。 为了产生这个时序,需建立一个由 D 触发器构成的 2 分频器,在每次时钟 clk上升沿到来时其值翻转。 其中 clk 的频率为分频模块产生的 1hz信号,那么 teten 的脉宽 恰好是 1 秒,可用作闸门信号。 然后根据测频的时序要求,可得到 load 和 clr_ 的逻辑描述。 在计数完成后,即计数使能信号 teten 在 1 秒的高电平后,利用其反相值的上升沿产生一个锁存信号 load, 后, clr_t 产生一个清零信号的上升沿。 该模块的设计尤为重要,其源代码为: module testctl(clk1,tsten,clr_t,load)。 input clk1。 output tsten,clr_t,load。 reg clr_t。 wire tsten,load。 reg div2clk。 always@(posedge clk1) div2clk=~div2clk。 always@(clk1 or div2clk) if(!clk1 amp。 !div2clk) clr_t=1。 else clr_t=0。 assign load=~div2clk。 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 15 assign tsten=div2clk。 endmodule 运用 Quartus II 软件自带仿真器进行仿真的结果如图 42 所示。 图 42: 测频控制信号发生模块 由上图可见仿真结果与设计要求一致,故此模块圆满完成。 十进制计数模块的设计 计数模块是频率计的核心部分,其有三个输入,两个输出信号组成, ena 为输入时钟使能信号, clr 为输入清零信号, clk 为输入时钟触发信号; co 为进位信号为下一级计数器时钟信号, qt 为输出的4 为 2 进制数据。 以下为计数器源程序: module tm10(clk,clr,ena,co,qt)。 input clk,clr,ena。 output co。 output [3:0] qt。 reg co。 reg [3:0] qt。 always@(posedge clk or posedge clr) begin if(clr) begin qt=439。 d0。 co=139。 b0。 end else begin if(ena) begin if(qt==439。 b1001) begin 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 16 qt=439。 b0000。 co=139。 b1。 end else begin qt=qt+139。 b1。 co=139。 b0。 end end end end endmodule 用 Modelsim 进行仿真,结果如 图 43 所示 : 图 43:十进制计数模块仿真图 可见在 clr 和 ena 的作用下当计数器由 0 计到 9 后,计数器清零重新计数,并在 0 时产生一个进位信号 co 供下一级计数器作为时钟输入。 八位十进制计数模块的设计 在十进制计数器设计完成后,需要将 8 个这样的计数器级联,形成 8 位 10 进制的计数器产生 10 的 8 次方个数据即 0—999999999。 以下为元件例化的源程序: module tm8(clk, clr, ena, co, qt)。 input clk。 input clr。 input ena。 output co。 output [31:0] qt。 wire w3,w4,w5,w6,w7,w 8,w 9。 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 17 tm10 u1 (.clk(clk), .clr(clr), .ena(ena), .co(w3), .qt(qt[3:0]))。 tm10 u2(.clk(w 3), .clr(clr), .ena(ena), .co(w4), .qt(qt[7:4]))。 tm10 u3 (.clk(w4), .clr(clr), .ena(ena), .co(w5), .qt(qt[11:8]))。 tm10 u4 (.clk(w5), .clr(clr), .ena(ena), .co(w6), .qt(qt[15:12]))。 tm10 u5 (.clk(w6), .clr(clr), .ena(ena), .co(w7), .qt(qt[19:16]))。 tm10 u6 (.clk(w7), .clr(clr), .ena(ena), .co(w8), .qt(qt[23:20]))。 tm10 u7 (.clk(w8), .clr(clr), .ena(ena), 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 18 .co(w9), .qt(qt[27:24]))。 tm10 u8 (.clk(w9), .clr(clr), .ena(ena), .co(), .qt(qt[31:28]))。 endmodule 用 Modelsim 进行仿真,结果如 图 44 所示 : 图 44: 8 位 10 进制计数器模块仿真图 三十二位锁存器模块的设计 计数器输出 32 位数值,需要送入锁存器保存 后,待数据稳定后再输出显示,代码如下: module reg1 (load,din,dout)。 input load。 input[31:0] din。 output[31:0] dout。 reg[31:0] dout。 always@(posedge load) begin dout[31:0]=din[31:0]。 end endmodule 运用 Quartus II 软件自带仿真器进行仿真的结果如图 45 所示。 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 19 图 45: 32 位锁存器模块仿真图 顶层模块的设计 在频率计各个模块设计完成后,需要将各个模块按照相应关系组合起来,这就是顶层模块的元件例化过程。 元件例化就是引入一种连接关系,将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接,从而为当 前设计实体引入一个新的低一级的设计层次。 在这里,当前设计实体相当于一个较大的电路系统,所定义的例化元件相当于一个要插在这个电路系统板上的芯片,而当前设计实体中指定的端口则相当于这块电路板上准备接受此芯片的一个插座。 元件例化是使 Verilog HDL 设计实体构成自上而下层次化设计的一种重要途径。 在一个结构体中调用子程序,包括并行过程的调用非常类似于元件例化,因为通过调用,为当前系统增加了一个类似于元件的功能模块。 但这种调用是在同一层次内进行的,并没有因此而增加新的电路层次,这类似于在原电路系统增加了一个 电容或一个电阻。 元件例化是可以多层次的,在一个设计实体中被调用安插的元件本身也可以是一个低层次的当前设计实体,因而可以调用其它的元件,以便构成更低层次的电路模块。 因此,元件例化就意味着在当前结构体内定义了一个新的设计层次,这个设计层次的总称叫元件,但它可以以不同的形式出现。 如上所说,这个元件可以是来自FPGA 元件库中的元件,它们可能是以别的硬件描述语言,如 Verylog 设计的实体。 元件还可以是软的 IP 核,或者是 FPGA 中的嵌入式硬IP 核。 元件例化语句由两部分组成,前一部分是对一个现成的设计实体定义 为一个元件,第二部分则是此元件与当前设计实体中的连接说明。 以下为顶层模块源程序: 哈尔滨工业大学 华德应用技术学院 毕业设计(论文) 20 module pinlv(clk, clkin, qt)。 input clk。 input clkin。 output [31:0] qt。 wire clk1,ena,clr,load。 wire [31:0] dout。 testctl u1 (.clk1(clk1), .tsten(ena) , .clr_t(clr), .load(load))。 clkdiv u2 (.clk(clk),。基于fpga的数字频率及设计与实现
相关推荐
毕业设计题目是基于 FPGA 的无刷直流电动机控制器的设计,根据此题目的要求,经查阅相关资料后,我的思路如下:以 FPGA 为核心控制单元控制相关模块电路的导通和运行,用霍尔位置传感器采集电动机的转子位置, 经 FPGA 芯片 CycloneⅡ 分析后输出合适信号, 经以 Si9979 为基础的驱动电路放大 后传递至 全桥逆变电路 , 将直流转变为交流进而控制电动机的旋转 、转速和正反转。 器件
ck1=lock1,start=start,oe=oe,ale=ale,access1=access1, dd1=data1,dd2=data2,dd3=data3,dd4=data4,dd5=data5,dd6=data6)。 u2:lcd port map(reset=reset,clk=clk,d1=data1,d2=data2,d3=data3, d4=data4,d5=data5
FPGA/现场可编程门阵列 Complex Programmable logic DeviceCPLD 在 EDA 电子设计自动化 基础上的广泛应用 . 从本质上说 , 新的电子系统运转的物理机制又归回到原来的纯数字电路结构 ,但在更高层次上容纳了过去数字技术的优秀部分 ,扬弃了 MCU 系统的应用模式 ,却包括了 MCU的内部资源,使电子设计的技术操作和系统构成的整体发生质的飞跃
上操作数的指令,其中两个分别给出源操作数和目的操作数的地址,第三个操作数用于指出保存本次运算结果的去处。 在有些性能更高的计算机中,还有使用更多操作数的指令,用于完成对一批数据的处理过程,如字符串复制指令和矩阵运算指令等。 上述 4 种情况中的前 3 种,由于其指令字长可以相对较短,执行速度较高,计算机硬件结构可以相对简单等优点,在各种不同的计算机中被广泛应用;相对而言,多操作
数来实现改变死区宽度。 多路 PWM 发生器的实现原理通过上面的设计可以实现单路的 PWM 的 FPGA 设计,利用 FPGA 来扩展 I/O 接口,可实现多路 PWM(脉宽调制)输出,在超声、电机控制等许多应用场合,需要产生多路频率,和脉冲宽度可调的 PWM 波形。 应用实现的单路的 PWM 的设计,可以推广到多路 PWM 设计,图 1-4 为多路 PWM 的系统原理框图。 通过一个主控
个反馈电阻接在运算放大器的输出端和输入端之间。 (5) VREF :参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定 0 至 255 的数字量转化出来的模拟量电压值的幅度,V REF范围为(10~+10)V。 V REF端与 D/A 内部 T 形电阻网络相连。 (6) Vcc :芯片供电电压,范围为(+5~+15)V。 (7) AGND :模拟量地,即模拟电路接地端。 (8)