分频器设计——50MHZ(含verilog程序)
Verilog实现任意分频
Verilog实现任意分频在Verilog中实现任意分频可以通过使用计数器和分频比例来实现。
下面是一个基于计数器的Verilog代码示例,用于实现任意分频。
```verilogmodule frequency_dividerinput clk,input rst,input [7:0] div_ratio,output reg outreg [7:0] count;beginif (rst)count <= 0;else if (count == div_ratio - 1)count <= 0;elsecount <= count + 1;endbeginif (rst)out <= 0;else if (count == div_ratio - 1)out <= ~out;endendmodule```在以上代码中,我们定义了一个名为"`frequency_divider`"的模块,该模块具有以下输入和输出:- `clk`:时钟信号- `rst`:复位信号- `div_ratio`:分频比例,使用8位二进制表示,范围为0到255- `out`:输出信号我们使用一个8位计数器(`count`)来进行分频。
每当计数器达到分频比例减1时,输出信号取反。
例如,如果分频比例为1,则输出信号将与时钟信号同步;如果分频比例为2,则输出信号将是时钟信号的一半频率;如果分频比例为4,则输出信号将是时钟信号的四分之一频率,以此类推。
需要注意的是,以上示例代码仅展示了分频的基本原理,并未考虑输入和输出信号的时序问题,如使 `div_ratio` 在运行时可更改、输出信号的不稳定性等。
针对具体应用需求,可以根据实际情况做出适当的修改和调整。
希望以上内容对您有所帮助!。
分频的verilog语言实现
分频的Verilog实现1.分频:在实际应用中,自己设计的开发板上不会去装多个晶振来产生不同频率的时钟信号,这就要我们在已有的基础上自己来创造设计电路中所需要的时钟信号来,有时候所需要的频率并不是在已有的频率上直接进行简单的整数分频就可以得到的,有时需要进行小数的分频。
2.在分频的过程中,偶数分频并不困难,若要进行2N次分频的话,只需要计数到N的时候,波形进行翻转就行了,或者在最后一级加一个2分频也可以实现。
下面是我写的一个偶数分频的代码:module div2n(rst,clk,cnt,clk_2n);//偶数次分频input rst,clk;output clk_2n,cnt;reg [3:0] cnt;//刚开始没有定义计数的位宽仿真的时候老是出现输出为0的现象,看似很简单的程序搞的有些纠结啊reg clk_2n;always @(posedge clk )beginif(rst) //若复位信号为高电平则计数清零和输出清零begincnt<=0;clk_2n<=0;endelseif(cnt==3)//进行8分频,这里的cnt取不同的值进行其他的分频,若计数到达4时从0开始的输出电平翻转beginclk_2n<=~clk_2n;cnt<=0;endelse cnt<=cnt+1;endendmodule功能仿真波形以及后仿真波形如下:从后仿真中可以明显的看出输出时钟信号和输入的标准信号有延迟时间,在计数寄存器中出现了相邻两个数之间的竞争,但是没有出现在时钟的上升沿,不会引起最后实现的错误!奇数分频:若奇数分频中不考虑占空比的话,分频代码可以按照偶数分频的思路来写,但是大多数情况下需要考虑的是使占空比设计为50%。
若要进行奇数次的分频而且要求占空比为50%可以采用:用两个计数器,一个由输入时钟下降沿触发,一个由输入时钟的上升沿触发,最后将两个计数器的输出进行相或,就可得到。
LED点灯实验报告
LED 点灯实验报告华中科技大学电信提高班1101一.实验目的:设计多种方案点亮DE2开发板上的LED灯,熟悉使用DE2开发板。
二.方案设计:方案一:设计一个计数器,通过计数器输出十进制数值的奇偶性来控制LED灯的亮与暗Step1:设计一个计数规律为4-5-6-7-8-9-4-5-6-7-8-9-4....的计数器1. 设计分频电路该电路的作用是把一个频率为50MHz的电源分频为1Hz的电源。
该设计电路我在quartus 上,采用verilog HDL语言实现。
源代码如下截图:说明:分频器的源代码截图然后将这段代码生成一个元件,如下图,其中有一个50MHz的输入端口,有一个1Hz的输出端口。
说明:生成的分频器元件说明:In:输入脉冲频率(50MHZ)Out:输出脉冲频率(1HZ)2.设计计数电路计数电路通过芯片74191实现,由于在计数器到9时重新由4开始计数,因此在QDQCQBQA 输出为1010的时候,反馈给74191的载入端子,使其重新载入DCBA=0100,开始计数。
在quartus上设计的电路如下图,其中Lab05元件为七段显示译码器件,用于接入发光二极管,从而比较直观地验证结果。
(4-9计数,译码电路)(电路引脚分配截图)该电路点亮LED灯的方法是:十进制计数输出为奇数是,LED灯亮,输出为偶数时,LED 灯灭,电路在DE2开发板实现的结果录像在附件中。
方案二:模仿交通灯的设计,控制红色和绿色的LED灯的亮与灭该方案是通过一盏红色LED灯和绿色LED灯来简易地模仿交通灯的设计,其基本原理是:在一定时间内显示红灯,然后开始倒计时,过了一定时间后,就显示一段时间的绿灯,再倒计时,然后重新显示红灯。
在这个实验中我简化了交通灯的模型,红灯和绿灯的倒计时间一样,都设定为8秒,即计时器显示为8-7-6-5-4-3-2-1-8-7-6-5-4-3-2-1......于是,应该先做一个模八的倒计时计数器,这个功能我通过芯片74191完成。
Verilog_VHDL_曼彻斯特编码器
1.5.什么叫“综合”?一般“综合”包含哪些过程?答:在电子设计领域中“综合”的概念可以表示为:将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。
综合包含的过程:对VHDL或Verilog HDL进行处理分析,并将其转换成电路结构或模块,这时不考虑实际器件实现,即完全与硬件无关,这个过程是一个通用电路原理图形成的过程:第2步,对实际实现目标器件的结构进行优化,并使之满足各种约束条件,优化关键路径,等等。
2.10 使用Quartus II的 Mega Wizard Plug-In Manager宏功能模块中的PLL设计一个能实现图题2.10波形的电路元件(包括一个VHDL文件和一个*.bsf原理图图标)。
其中:inclk0为电路的主频输入端,频率为50MHz;areset为异步置位端,c2和主频inclk0同频率。
c1为主频inclk0的倍频输出信号。
C0为c2的反相信号。
Locked为相位控制信号,也是输出使能控制信号。
( 2014am)3.20 试用VHDL 语言设计一个曼彻斯特编码器。
已知有时钟信号clk_d、时钟的倍频信号clk及时钟的反相信号clk_dn。
串行数据输入为data_s,编码输出为mcode_out,输出使能信号为clk_lock_in,高电平有效(2012am)(2013am)(2014am)提示:曼彻斯特码(Manchester Code)又称为数字双相码或分相码(Split-phase Code)。
它的编码规则是:用分别持续半个码元周期的正(高)、负(低)电平组合表示信码“1”;用分别持续半个码元周期的负(低)、正(高)电平组合表示信码“0”。
图题3.20 用倍频时钟设计Manchester Code图题3.20 用双时钟设计Manchester Code 的仿真结果hsu_manchester_code_vmodule hsu_manchester_code_v ( clk,clk_d,clk_dn,data_s,clk_lock_in,mcode_out); input clk,clk_d,clk_dn,data_s,clk_lock_in;output mcode_out;reg mcode_out;reg temp_mcode_out;reg temp_mcode_out_ddn;always ( posedge clk or posedge clk_lock_in )beginif (clk_lock_in==1'b1)if (data_s==1'b1)temp_mcode_out<=clk_d;elsetemp_mcode_out<=1'b0;elsetemp_mcode_out=1'b0;endalways ( posedge clk or posedge clk_lock_in )beginif (clk_lock_in==1'b1)if (data_s==1'b0)temp_mcode_out_ddn<=clk_dn;elsetemp_mcode_out_ddn<=1'b0;elsetemp_mcode_out_ddn=1'b0;Endalways ( posedge clk or posedge clk_lock_in )beginif (clk_lock_in==1'b1)mcode_out<=temp_mcode_out;temp_mcode_out_ddn;elsemcode_out<=1'b0;endendmodule3.21 试用VHDL 语言设计一个求两个数中最大值的程序,要求用函数调用的方法设计。
verilog时钟分频设计
verilog时钟分频设计1.偶分频模块设计偶分频意思是时钟模块设计最为简单。
首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率N = M / 2如输入时钟为50M,输出时钟为25M,则M=2,N=1。
偶分频则意味着M为偶数。
以M=4,N=2为例,我们希望得到的输出时钟时序如下:因此只需要将counter以clk_in为时钟驱动计数,当counter = (N-1)时,clk_out翻转即可。
verilog代码如下,其中WIDTH为(N的位宽-1):module time_adv_even #(parameter N = 2,WIDTH = 7)(input clk,input rst,output reg clk_out);reg [WIDTH:0]counter;always @(posedge clk or posedge rst) beginif (rst) begin// resetcounter <= 0;endelse if (counter == N-1) begincounter <= 0;endelse begincounter <= counter + 1;endendalways @(posedge clk or posedge rst) beginif (rst) begin// resetclk_out <= 0;endelse if (counter == N-1) beginclk_out <= !clk_out;endendendmoduletestbench测试8分频即N=4,ISE仿真结果如下:2.奇分频模块设计奇分频需要通过两个时钟共同得到。
首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率N = (M-1) / 2如输入时钟为50M,输出时钟为10M,则M=5,N=2。
奇分频则意味着M为奇数。
数电课程设计报告
数电课程设计报告 The following text is amended on 12 November 2020.《基于FPGA的洗衣机电机正反转控制器》学院:信息与控制工程学院专业:电子信息工程班级:姓名:学号:2014年7月目录1.设计任务与要求........................................................ . (1)2.设计思路........................................................ (1)3.设计原理及方案....................................................................... (2)4.总结与讨论........................................................................... (14)一、设计任务及要求:1.控制洗衣机的电机作如下周期性运转,正转4S――暂停2S――反转4S――暂停2S,用8位七段数码管显示自己学号的后四位(显示在从左边数第一个到第四个数码管上)、定时时间(两位,单位:分钟,显示在第五个和第六个数码管上),剩余时间(两位,单位:分钟,显示在第七个和第八个数码管上2.洗衣机控制器的工作过程为:(1)上电后显示自己学号的后四位,在运行中不变;初始洗涤时间为10分钟,在开始前可用S1和S2按键设置总的工作时间,确定洗衣机控制器定时工作时间。
(按下并松开S1定时时间增加一分钟,按下并松开S2定时时间减少一分钟,时间范围为:00~30分钟)(2)设定好定时时间后,按下并松开S3(按下时S3=0,松开时S3=1),启动控制器,整个系统开始运行;再次按下并松开S3,停止运行;再次按下并松开S3继续运行;按下并松开S4则回到上电初始状态。
其他两个按键不起作用。
秒表计时电路设计verilog
电子科技大学通信学院秒表计时电路实验报告班级通信一班学生学号教师秒表计时电路秒表计时电路一、设计思路概述1.设计要求秒表计时功能,显示分、秒、0.01秒具有启动、暂停、停止和清空功能增加有趣的流水灯输入信号:4bit按键,50MHz时钟输出信号:6位数码管2.设计分析本设计要求秒表计时功能,显示分、秒、0.01秒,而这可以由分频电路实现,将电路的输入时钟进行分频,得到1/60Hz,1Hz,和100Hz信号,就可以达到本设计要求的显示要求了。
本设计要求具有启动、暂停、停止和清空功能,而这个可以由状态机实现,通过合理的配置状态转换,就可以达到要求。
流水灯的实现说来简单,其实也可以做的复杂,漂亮的流水灯其观赏性还是很好地,这里我们只讨论简单流水灯的实现,即单个灯从左到右逐步发光。
这实际是一个移位寄存器,我们可以通过不同的时钟来驱动它,实现不同的流水速度。
这里,我们实现了一个1Hz,和一个10Hz的流水灯电路。
二、总体设计框图及详细说明三、各部分代码设计1、500000进制计数器(分频器)设计:always @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms;clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endend2、状态机设计always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate; rst<=0;rst10ms<=0;endelsestate<=idlestate; endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate; rst<=1;rst10ms<=1;endelsestate<=holdstate; endrunstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate; rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendend3.10进制计数器(分频器)设计module count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule4、6进制计数器(分频器)设计module count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodule5、流水灯设计always @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);end6、显示译码电路设计always @(negedge clk or negedge rst) begin if (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endend四、总体电路设计module today(key, ledr, ledg, hex, clk);input [3:0] key;input clk;output reg [17:0] ledr;output reg [7:0] ledg;output [55:0] hex;wire clear;wire start;wire stop;wire hold;assign clear = key[0];assign start = key[1];assign stop = key[2];assign hold = key[3];reg [19:0] clk10msreg;reg clk10ms;wire clk100ms;wire clk1s;wire clk10s;wire clk1min;wire clk10min;wire clk1h;reg [1:0] state;parameter idlestate = 2'b00, prestate = 2'b01, holdstate = 2'b10, runstate = 2'b11;reg rst;reg rst10ms;reg [2:0] displayreg;wire [3:0] timeout [7:0];reg [6:0] segcode[7:0];assign hex = {segcode[7], segcode[6], segcode[5], segcode[4], segcode[3], segcode[2], segcode[1], segcode[0]};always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate;rst<=0;rst10ms<=0;endelsestate<=idlestate;endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate;rst<=1;rst10ms<=1;endelsestate<=holdstate;endrunstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate;rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendendalways @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms; clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endendcount6 min10counter(rst, clk10min, clk1h, timeout[7]); count10 min1counter (rst, clk1min,clk10min, timeout[6]); count6 sec10counter(rst, clk10s,clk1min, timeout[5]); count10 sec1counter (rst, clk1s, clk10s, timeout[4]); count10 ms100counter(rst, clk100ms, clk1s, timeout[3]); count10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); assign timeout[1] = 4'b1111;assign timeout[0] = 4'b1111;always @(negedge clk or negedge rst) beginif (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endendalways @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);endendmodulemodule count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) begin if (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodulemodule count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule五、总结及心得体会通过这次试验,我们基本掌握了状态机的实现方法,进一步熟悉和掌握了Verilog HDL的基本使用方法。
用Verilog语言实现任意整数分频器
用Verilog语言实现任意整数分频器分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的DLL.来进行时钟的分频,倍频以及相移。
但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。
另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。
因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。
下面讲讲对各种分频系数进行分频的方法:第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。
如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。
以此循环下去。
这种方法可以实现任意的偶数分频。
电路上只需一个D触发器和一个非门即可实现,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) .第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法:占空比为非50%的三分频时钟,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。
即是在计数值在邻近的1和2进行了两次翻转。
这样实现的三分频占空比为1/3或者2/3。
module three(clk_in,rst,clk_out); // 三倍频inputclk_in,rst;output clk_out;reg clk_out;reg [1:0] count;always @(negedgerst or posedgeclk_in)beginif(rst==0) begin count<=0; clk_out<=0; endelsebegin count<=count+1;if(count==1) clk_out<=~clk_out;else if(count==2) begin clk_out=~clk_out; count<=0; endendendendmodule仿真图另一种实现:module div3(CLKIN,CLKOUT,RESETn); //依然是三倍频inputCLKIN,RESETn;output CLKOUT;wire d;wireCLKOUT;reg q1,q2;always @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0)q1<=1'b0;elseq1<=d; //q1是d延迟一个时钟后的信号endalways @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0) q2<=1'b0;elseq2<=q1; //q2是q1延迟一个时钟后的信号endassign d=~q1 & ~q2; //d在一个周期内,一个clk为高,另外两个clk为低assign CLKOUT=q2;endmodule仿真图电路中,利用两个D触发器和简单的门电路即可实现。
Verilog基础训练5-使用LED数码按秒循环显示数字0至9
实训6:使用LED数码按秒循环显示数字0~9问题提出:使用FPGA开发板,设计分频器、计数器、数码管译码显示等电路,将FPGA的50MHz时钟分频至1Hz,驱动计数器,使其从0开始,每隔一秒加1显示,到9后复位重新开始显示。
解决思路:分开两个项目,第1个项目实现一个0~9的计数器(频率为1Hz),另一个项目负责数码管显示,分开设计和仿真,最后整合在一起。
1.使用Quartus 8.0建立第一个项目,建立过程和注意事项见前两周的实验指导,选择器件时随便指定一个。
这里的项目名称为counter10。
(切记项目保存路径和实验过程中新建的文件保存路径都不要出现中文)2.项目建好后,新建Verilog文件并输入代码选择“File”——“New”——“Verilog HDL file”。
文件名同为counter10。
请仔细分析代码!3.编译项目。
“Processing”——“Start Compilation”4.功能仿真编译通过后,新建波形仿真文件:“File”——“New”,选择“Vector Waveform File”,如下图所示:在出现的编辑界面左侧右键,选择如下:在“Insert Node or Bus”里选择“Node Finder…”在弹出来的“Node Finder”中,首先在“Filter”中选择“Pins:Unassigned”,然后点击“list”,在“Nodes Found”中会列出所有的引脚,第三步选择全部引脚(鼠标拉),点击“>>”,最后点击“OK”即可。
在回到的“Insert Node or Bus”界面点击“OK”。
这时候会看到所有的引脚会列出来,如下所示。
由实验原理可知,clk为FPGA板的时钟,rstn为复位信号,因此设置clk为10ns的周期信号,rstn默认为高电平,在10-30ns区间内为低电平。
设置方法如下:选择输入“clk”,点击右键,选择“Value”——“Clock”。
Quartus
QuartusⅡEDA实验报告实验一:一、实验目的:通过实验了解QuartusⅡ软件的基本使用方法;学习工程文件的创建;学习原理图编辑环境下各种工具的使用;掌握仿真器的使用和设置;掌握基本电路的仿真。
二、实验要求:1、在原理图编辑界面下,调用逻辑器件;2、采用原理图的方式完成逻辑非门电路;3、利用仿真器创建仿真文件;4、设置仿真器参数,利用仿真器去仿真逻辑电路。
三、实验步骤:1 、原理图编辑环境1.1、创建工作文件夹:在F 盘下创建一个文件夹,用于保存实验的所有内容。
1.2、创建工程文件和顶层文件:打开QuartusⅡ软件,在“File”菜单下选择“New Project Wizard…”选项,弹出创建工程文件窗口如下,先选择好存盘路径,再输入工程文件名,顶层文件可以跟工程文件名一致,设置完成后,点击“Finish”按钮完成文件的创建。
1.3、在工程文件中创建原理图文件:在“File”菜单下选择“New”选项,弹出新建文件窗口,文件类型选择“Block Diagram/Schematic File”创建一个原理图文件,点击“OK”按钮确定,进入原理图编辑界面1.4、保存原理图文件:在“File”菜单下选择“Save As”选项,弹出文件另存窗口,将文件名另存为“not_top”。
1.5、在原理图中放置元件:将鼠标移至原理图空白地方,双击鼠标左键,进入元件加载窗口,在“Name”窗口下输入“not”,右边元件的窗口将弹出一个“非门”元件,点击“OK”将元件放置在原理图中,采用同样的方法放置一个“input”输入引脚,和一个“output”输出引脚。
1.6、放置连线:将鼠标移至元件引脚的端点上,这时鼠标将变为小“十字”,按住鼠标左键不放进行拖动,可以在原理图上画出一根连线。
1.7、重新命名管脚:双击“input”管脚,进入管脚属性窗口,在“Pin name”项目中输入新的管脚名“a”,点击“确定”完成。
分频器电路的Verilog设计
6. 偶数分频器的设计rate=even(偶数),占空比50%设计原理:定义一个计数器对输入时钟进行计数,(1)在计数的前一半时间里,输出高电平,(2)在计数的后一半时间里,输出低电平,这样输出的信号就是占空比为50%的偶数分频信号。
例如,设计一个6分频电路。
对什么计数?①计数值为0~2输出高电平,②计数值为3~5输出低电平。
上升沿计数一个计数周期0112分频module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt<n-1) cnt<=cnt+1;else cnt<=0;endalways@(cnt)beginif(cnt<n/2) clkout<=1'b1;else clkout<=1'b0;end endmodule计数过程判断赋值过程module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt==n/2-1)begincnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule 2分频分析4分频分析二分频四分频知识小结1.移位寄存器的verilog描述。
2.偶数分频的verilog描述。
作业1.设计一个5位串入并出的移位寄存器。
Clear :同步清零;clkin :时钟输入;databit :位输入y[4..0]并行数据输出;2.设计一个4位并入串出的移位寄存器Clear :同步清零;clkin :时钟输入(移位);dataIn :并行数据输入,y :串行数据输出。
任意分频的verilog语言实现
任意分频的verilog语言实现Verilog是一种硬件描述语言,用于描述数字电路的结构和行为。
在这里,我将展示如何使用Verilog实现一个任意分频器。
任意分频器是一种电路,可以将输入信号的频率分频为所需的输出频率。
在Verilog中,我们可以通过使用计时器和计数器来实现分频。
首先,我们需要定义模块名和输入/输出端口。
以下是一个基本的Verilog模块的框架:```verilogmodule divider (input clk, // 输入时钟信号input rst, // 复位信号input [7:0] div, // 分频器output reg out); // 输出信号```接下来,我们需要在模块内部声明和初始化一个计数器变量。
在每个时钟周期中,计数器将自增,当计数器达到分频值时,将输出一个脉冲,并重新计数。
```verilogreg [7:0] count; // 计数器if (rst) begincount <= 0;out <= 0;end else begin//检查计数器是否达到分频值if (count >= div) begincount <= 0;out <= ~out; // 输出一个脉冲end else begincount <= count + 1;out <= out; // 保持原始输出状态endendend```这段代码中,我们使用了always块来创建一个时钟敏感的组合逻辑。
我们使用了posedge关键字来检测上升沿触发。
当复位信号rst为1时,我们将计数器和输出都重置为0。
否则,我们将计数器计数器自增,并将其与分频值进行比较。
如果计数器大于等于分频值,则输出一个脉冲,并将计数器和输出重置为0。
否则,我们保持原有的计数器和输出状态。
最后,我们在模块的底部实例化该模块,并将输入/输出信号与顶层模块连接起来。
```verilogdivider divider1(.clk(clk), .rst(rst), .div(divisor), .out(out));```在这段代码中,我们将clk(时钟信号)、rst(复位信号)、div(分频器)和out(输出信号)连接到分频器模块的对应输入/输出端口。
分频器设计习题
下图是一个利用50MHz时钟晶振控制8个LED灯每1秒钟闪烁10次的电路,请完成此电路的Verilog电路设计
参考答案
一、选择题
1. C 2. A
二、判断题
1.正确2.错误
三、设计题
moduleledtest(mclk,led);
input mclk; //输入端口连接50M系统时钟
output [7:0]led; //输出端口连接8个发光二极管
分频器设计习题
一.单项选择题
1.设计一个20分频电路,通常控制分频的计数器位宽为()。
A3bitB7bitC5bitD6bit
2.分频器的控制内核是()
A.计数器B.译码器C触发器D移位寄存器
二、判断题
1.分频器是实现高频信号转换为低频信号的电路()
2.实现一个60分频电路,控制分频操作的最小计数器位宽为6bit()
reg [7:0]led;
reg [210M时钟mclk分频到1Hz时钟
always @(posedge mclk) //在系统时钟上升沿时计数
begin
if (cnt= =25'd2499999)begin//当计数值到达2499999时
cnt<=0;//计数器清零
led <=~ led;end//led信号反向,实现闪烁。
elsecnt<=cnt + 1;//计数器进行+1操作
end
endmodule
分频器设计——50MHZ(含verilog程序)
分频器设计一、实验目的1、熟悉分频器的原理;2、掌握采用Verilog HDL 语言设计分频器的方法;3、进一步学习利用VerilogHDL 语言进行层次设计的方法。
二、实验内容1、采用Verilog 语言设计一个十分频器,记录Verilog 程序;2、对十分频器进行功能仿真,观察仿真波形;3、仿真没有问题后,将分频比改为50000000,实现一个50M 分频器。
利用此分频器和开发板上的50MHz 时钟信号,得到1Hz 的秒脉冲信号,完成如图1-2.28所示的秒计数器。
50M分频器50MHz 脉冲信号二位十进制计数器1Hz 秒脉冲数码管(个位)数码管(十位)复位和计数使能(拨码开关)程序设计如下:module fenp(clk_out,clk_in,reset);output clk_out;input clk_in;input reset;reg [1:0] cnt;reg clk_out;always@(posedge clk_in or posedge reset)beginif(reset)begincnt<=0;clk_out<=0;endelsebeginif(cnt==24999999)beginclk_out<=!clk_out;cnt<=0;endelsecnt<=cnt+1;endendendmodule本程序经验证,完全可以实现实验要求。
文章来自某大学EDA实验课。
Verilog 实现任意占空比、任意分频的方法
分频程序虽然简单,但我觉得由简入难是学习的一个必然阶段,慢慢的我们自然会成长起来。
所以如果有时间的话,大家都可以将自己的这种“小程序”贴到论坛上来。
如果你的程序好,其他人也可以学习;如果你的程序有问题,大家可以一起帮你找问题,共同进步。
还有,我觉得在发贴的时候,最好能将原理说一下。
一来大家看你的贴能学到东西;二来也方便解答你的问题,不然还得解答者自己去找资料搞懂原理,然后再回答你,回答你问题的人自然也就不多了。
说了一些题外话,下面转入正文:在verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求这样的话,对于程序有一定的要求,现在我在前人经验的基础上做一个简单的总结,实现对一个频率的任意占空比的任意分频。
比如:我们FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。
我们很容易想到用计数的方式来分频:50000000/880 = 56818这个数字不是2的整幂次方,那么怎么办呢?我们可以设定一个参数,让它到56818的时候重新计数不就完了吗?呵呵,程序如下:module div(clk, clk_div);input clk;output clk_div;reg [15:0] counter;always @(posedge clk)if(counter==56817) counter <= 0;else counter <= counter+1;assign clk_div = counter[15];endmodule下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter 为0到32767的时候为低,在32767到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么怎么办呢?不用急,慢慢来。
我们再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,那不就完了吗?呵呵,再看看:module div(clk, clk_div);input clk;output clk_div;reg [14:0] counter;always @(posedge clk)if(counter==28408) counter <= 0;else counter <= counter+1;reg clk_div;always @(posedge clk)if(counter==28408) clk_div <= ~clk_div;endmodule占空比是不是神奇地变成50%了呢?呵呵。
梁祝基于Verilog_HDL的演奏设计说明
设计题目:“梁祝乐曲发生器”一、设计任务及要求:利用EDA/SOPC实验开发平台提供的16*16点阵LED以及EP2C35核心板,实现“梁祝”乐曲发生器。
1、查阅相关资料,明确设计步骤;2、采用Verilog HDL编程语言设计程序;3、能够按照设定节拍(每拍持续1s)顺畅的播放“梁祝”乐曲并且听着基本无错;4、扩张要求:自主设计(如快放、倒放、换歌等)。
二、设计原理及方案乐曲播放器的基本原理是,一个音符对应一个频率信号。
频率的高低决定了音调的高低。
音乐的十二个平均率规定:每两个八度音之间的频率相差一倍。
在两个八度音之间又可以分为十二个半音,每两个半音的频率比为2.另外,音名A(简谱中的低音6)的频率为440HZ,音名B到C之间、E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,;利用高低音如下关系可得下表:低8度音:基本音频率/2 , 例如低音1的频率为523/2=261.5;高8度音:基本音频率×2,例如高音1的频率为523×2=1046音符与频率的对应关系如下音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。
本设计中将全音的持续时间设为1s,提供的4Hz的时钟频率即可产生四分音符的时长。
控制音长通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间也就越长。
每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如二分音符,在记谱时将该音名联系记录两次即可。
对照以上规则可编制乐谱的程序。
为了减小输出的偶次谐波分量,最后输出到扬声器上的波形应为对称方波,因此在扬声器之前有一个二分频的分频器。
为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏!综上所述编制“梁祝”乐曲发生器需要编制分频器、11为计数器、乐谱等部分,综合以上各功能即可实现乐曲发生器。
三、电路设计与实现电路原理图如下:1、外部输入脉冲信号时钟源(50Mhz)经分频器输出4Hz、1Mhz的脉冲信号,分别供控制器和受控器使用。
分频的verilog语言实现
分频的Verilog实现1.分频:在实际应用中,自己设计的开发板上不会去装多个晶振来产生不同频率的时钟信号,这就要我们在已有的基础上自己来创造设计电路中所需要的时钟信号来,有时候所需要的频率并不是在已有的频率上直接进行简单的整数分频就可以得到的,有时需要进行小数的分频。
2.在分频的过程中,偶数分频并不困难,若要进行2N次分频的话,只需要计数到N的时候,波形进行翻转就行了,或者在最后一级加一个2分频也可以实现。
下面是我写的一个偶数分频的代码:module div2n(rst,clk,cnt,clk_2n);//偶数次分频input rst,clk;output clk_2n,cnt;reg [3:0] cnt;//刚开始没有定义计数的位宽仿真的时候老是出现输出为0的现象,看似很简单的程序搞的有些纠结啊reg clk_2n;always @(posedge clk )beginif(rst) //若复位信号为高电平则计数清零和输出清零begincnt<=0;clk_2n<=0;endelseif(cnt==3)//进行8分频,这里的cnt取不同的值进行其他的分频,若计数到达4时从0开始的输出电平翻转beginclk_2n<=~clk_2n;cnt<=0;endelse cnt<=cnt+1;endendmodule功能仿真波形以及后仿真波形如下:从后仿真中可以明显的看出输出时钟信号和输入的标准信号有延迟时间,在计数寄存器中出现了相邻两个数之间的竞争,但是没有出现在时钟的上升沿,不会引起最后实现的错误!奇数分频:若奇数分频中不考虑占空比的话,分频代码可以按照偶数分频的思路来写,但是大多数情况下需要考虑的是使占空比设计为50%。
若要进行奇数次的分频而且要求占空比为50%可以采用:用两个计数器,一个由输入时钟下降沿触发,一个由输入时钟的上升沿触发,最后将两个计数器的输出进行相或,就可得到。
Verilog-实现任意占空比、任意分频的方法
Verilog-实现任意占空比、任意分频的方法分频程序虽然简单,但我觉得由简入难是学习的一个必然阶段,慢慢的我们自然会成长起来。
所以如果有时间的话,大家都可以将自己的这种“小程序”贴到论坛上来。
如果你的程序好,其他人也可以学习;如果你的程序有问题,大家可以一起帮你找问题,共同进步。
还有,我觉得在发贴的时候,最好能将原理说一下。
一来大家看你的贴能学到东西;二来也方便解答你的问题,不然还得解答者自己去找资料搞懂原理,然后再回答你,回答你问题的人自然也就不多了。
说了一些题外话,下面转入正文:在verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求这样的话,对于程序有一定的要求,现在我在前人经验的基础上做一个简单的总结,实现对一个频率的任意占空比的任意分频。
比如:我们FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。
我们很容易想到用计数的方式来分频:50000000/880 = 56818这个数字不是2的整幂次方,那么怎么办呢?我们可以设定一个参数,让它到56818的时候重新计数不就完了吗?呵呵,程序如下:module div(clk, clk_div);input clk;output clk_div;reg [15:0] counter;always @(posedge clk)if(counter==56817) counter <= 0;else counter <= counter+1;assign clk_div = counter[15];endmodule//module div(clk,rst,clk_div);input clk,rst;output reg clk_div;reg[15:0] counter;salways@(posedge clk)if(!rst)begincounter<=0;clk_div<=0;endelse if (counter==56817)begincounter<=0;clk_div<~clk_div;endelsecounter<=counter+1;endmodule下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter 为0到32767的时候为低,在32767到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么怎么办呢?不用急,慢慢来。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分频器设计
一、实验目的
1、熟悉分频器的原理;
2、掌握采用Verilog HDL 语言设计分频器的方法;
3、进一步学习利用VerilogHDL 语言进行层次设计的方法。
二、实验内容
1、采用Verilog 语言设计一个十分频器,记录Verilog 程序;
2、对十分频器进行功能仿真,观察仿真波形;
3、仿真没有问题后,将分频比改为50000000,实现一个50M 分频器。
利用此分频器和开发板上的50MHz 时钟信号,得到1Hz 的秒脉冲信号,完成如图1-2.28所示的秒计数器。
50M
分频器
50MHz 脉冲信号
二位十进制
计数器1Hz 秒脉冲
数码管(个位)
数码管
(十位)复位和计数使能
(拨码开关)
程序设计如下:
module fenp(clk_out,clk_in,reset);
output clk_out;
input clk_in;
input reset;
reg [1:0] cnt;
reg clk_out;
always@(posedge clk_in or posedge reset)
begin
if(reset)
begin
cnt<=0;
clk_out<=0;
end
else
begin
if(cnt==24999999)
begin
clk_out<=!clk_out;
cnt<=0;
end
else
cnt<=cnt+1;
end
end
endmodule
本程序经验证,完全可以实现实验要求。
文章来自某大学EDA实验课。