verilog中always语句在同一模块下能不能把一个always块产生的计数信号当作下一always块的时钟信号

近期热词:
36小时点击榜
1140951068561067231235011476376222422109172916151501
72小时热顶榜
393715141210108666
36小时点击榜
3800323014061178115911021064988950931893
72小时热顶榜
201410109988888
36小时点击榜
741722703703646209190152133114114
72小时热顶榜
20201815131211111199
媒体征稿和报道
被采用的文章
被报道的博主
社区帮助中心
网友们是和讯社区的主人,如果有对和讯物业管理的建议或者讲述你与和讯的故事,请在发表文章时投稿到“我与和讯”。
微博使用帮助
友情链接: ┊┊┊┊
Copyright&和讯网 北京和讯在线信息咨询服务有限公司 All Rights Reserved 版权所有 复制必究采用Verilog的数字跑表设计
> 采用Verilog的数字跑表设计
采用Verilog的数字跑表设计
本节通过 HDL语言编写一个具有“百分秒、秒、分”计时功能的,可以实现一个小时以内精确至百分之一秒的计时。  的显示可以通过编写数码管显示程序来实现,本实例只给出的实现过程。读者还可以通过增加小时的计时功能,实现完整的跑表功能。  实例目标  本实例主要实现了计数及进位的设计,通过几个always模块的设计实现一个特定用途的模块——数字跑表。通过本实例,读者应达到下面的一些实例目标。  o 初步掌握语言的设计方法。  o 完成一个数字跑表的设计。  原理简介  本数字跑表首先要从最低位的百分秒计数器开始,按照系统时钟进行计数。计数至100后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。计数至60后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数,读者可以自行增加小时计数器。  数字跑表巧妙地运用进位位作为计数时钟来减少计数的位数。如果统一使用系统时钟作为计数时钟,那秒计数器将是一个6000进制的计数器,而分计数器将是一个3600000进制的计数器。这样将极大的浪费FPGA的逻辑资源。而使用进位位作为计数时钟,只需要一个100进制的计数器和两个60进制的计数器。  如图是本实例的数字跑表模块图。    在实际的设计中,为了使计数器更加简单,计数器使用高低位两个计数器实现。100进制计数器分别是高位10进制计数器,低位10进制计数器;60进制计数分别是高位6进制计数器,低位10进制计数器。这样整个数字跑表使用6个计数器实现。  同时由于10进制计数器重复使用了5次,可以使用独立的模块实现10进制计数器,这样就可以通过模块复用来节省整个模块使用的资源。  数字跑表提供了清零位CLR和暂停位PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至1/100s,即可实现真实的时间计数。详细的时钟分频设计读者可参考相关的资料实现,在本实例中不再提供。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一查看: 412|回复: 10
用verilog设计一个4位8421BCD码加法计数器,clk为时钟输入,rst_n为异步复位(低电平有效),load为同步装载信号,en为同步使能信号,d[15:0]为待装载的4位BCD码,q[15:0]为输出的4位BCD码,无进位位。
module bcd ( input i_clk, //clock input i_rst_b, //reset input i_set, //set input [3:0] i_set_data, // input i_add, // input i_del, // output reg [7:0] o_display, output reg [3:0] o_bcd_data, // output reg o_over_flow,// output
module 4_bit_counter( clk, reset_n, enable, out ); input reset_n; output [3:0] always@(posedge clk or negedge reset_n)begin if(!reset_n) out
parameter Num=4'bXXXX; //预置数值 always @(posedge clk or negedge rst_n) if(!rst_n) begin qian
徐红雨2014
use ieee.std_logic_1164. entity cnt4e is port( clk,clr:in std_ c:out std_ q:buffer integer range 0 to 15); end cnt4e; architecture one of cnt4e is begin process(clk,clr) begin if clr = '1' then --
奉献一个原创的 LIBRARY USE ieee.std_logic_1164. USE ieee.numeric_std.ALL; ENTITY bcd_cnt_1r0 IS GENERIC(num_bit : INTEGER := 2; modulo : INTEGER := 24); PORT(clk : IN STD_LOGIC; rst : IN STD_LOGIC; cnt_en : IN STD_LOG
我写的一个十进制计数,可以复位,置数,使能,双向计数,请参考 `timescale 1ns/100ps module count( clk, nrst, ncs, s, load, load_data, q ); input [3:0] load_ output [3:0]
cunzhang2015
module exp07_top( CLK, RSTn, Number_Data, Row_Scan_Sig, Column_Scan_Sig); input CLK; input RSTn; input [7:0]Number_D output [7:0]Row_Scan_S output [1:0]Column_Scan_S /**************************************/ wire [3:0]
0-1并不是理想的变化,信号从低电平到高电平肯定是有上升时间的,你这里有三个同时产生的上升沿,可能你clk触发的时候rst还未完全变成高电平,所以出来是0000; 建议: always语句的判断条件最好只用一个沿触发,否则有的综合器不能综合 在调试
50Mhz,时钟周期20ns,延迟一拍即可。 module clk(start,clk_in,clk_out); //clk_in为输入时钟,Start为开始信号 input start,clk_ output clk_ reg clk_ reg clk_out_r; always @(posedge clk_in) begin if(!start) begin clk_out你的位置:
怎样verilog产生一个半周期脉冲信号
“计数器在时钟上升沿触发。CON在计数器为10、时钟上升沿清0;在计数器为100、时钟上升沿变为1,紧接着的下降沿清0。”
我试图用一个always @(posedge clk)
和一个 always @(negedge clk) 块来对CON直接赋值,但是仿真报错,同学说不能在把一个变量同时写到两个always块。
我不知道该怎么办?请高手帮个忙!万分感谢!博客访问: 498951
博文数量: 112
博客积分: 3532
博客等级: 中校
技术积分: 1313
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
&同步复位sync异步复位async特点复位信号只有在时钟上升沿到来时才能有效。无论时钟沿是否到来,只要复位信号有效,就进行复位。Verilog描述always@(posedge CLK)always@(posedge CLK , negedge Rst_n)优点1)利于仿真器仿真。2)因为只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。3)可以使所设计的系统成为100%的同步时序电路,有利于时序分析。1)设计相对简单。2)因为大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。3)异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。缺点1) 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。2) 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。1)复位信号容易受到毛刺的影响。2)在复位信号释放(release)的时候容易出现问题。具体就是说:若复位释放刚好在时钟有效沿附近时,很容易使寄存器输出出现亚稳态,从而导致亚稳态。总结推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。&2:推荐的复位方式所谓推荐的复位方式就是上文中所说的:“异步复位,同步释放”。这就结合了双方面的优点,很好的克服了异步复位的缺点(因为异步复位的问题主要出现在复位信号释放的时候,具体原因可见上文)。其实做起来也并不难,我推荐一种我经常使用的方式吧:那就是在异步复位键后加上一个所谓的“reset synchronizer”,这样就可以使异步复位信号同步化,然后,再用经过处理的复位信号去作用系统,就可以保证比较稳定了。reset sychronizer的Verilog代码如下:module Reset_Synchronizer(output reg rst_n, input clk, asyncrst_n);&&reg rff1;always @ (posedge clk , negedge asyncrst_n) begin&&&&if (!asyncrst_n) {rst_n,rff1} <= 2'b0;else {rst_n,rff1} <= {rff1,1'b1};endendmodule大家可以看到,这就是一个dff,异步复位信号直接接在它的异步复位端口上(低电平有效),然后数据输入端rff1一直为高电平‘1’。倘若异步复位信号有效的话,触发器就会复位,输出为低,从而复位后继系统。但是,又由于这属于时钟沿触发,当复位信号释放时,触发器的输出要延迟一个时钟周期才能恢复成‘1’,因此使得复位信号的释放与时钟沿同步化。此外,还有一种方法更为直接,就是直接在异步复位信号后加一个D触发器,然后用D触发器的输出作为后级系统的复位信号,也能达到相同的效果。这里就不多说了。&3:多时钟系统中复位的处理方法这是一个很实际的问题,因为在较大型的系统中,一个时钟驱动信号显然不能满足要求,一定会根据系统的要求用多个同源时钟(当然也可以是非同源了)去驱动系统的不同部分。那么在这样的多时钟系统中,复位键怎么设置?它的稳定与否直接关系到了整个系统的稳定性,因此要格外注意(在我看来,复位信号在同步时序系统中的地位和时钟信号一样重要)。下面就说一下具体的处理方法,当然所遵循的原则就仍应该是上文的“异步复位,同步释放”:1.non-coordinated reset removal:顾名思义,就是同一个系统中的多个同源时钟域的复位信号,由彼此独立的“reset synchronizer”驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间由各自的驱动时钟决定,也是就说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。2.sequence coordinated reset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个“reset synchronizer”的级联方式决定。可以先复位前级,再复位后级,也可以反过来。反正方式很灵活,需要根据实际需要而定。由于图片上传问题,我只能用程序表示了,&例子:三级复位系统,系统中的时钟分别为1M,2M,11M:第一级Reset_Sychronizer程序:module Reset_Synchronizer&(output reg rst_n,input&&clk, asyncrst_n);&&reg rff1;always @ (posedge clk , negedge asyncrst_n)begin&&&&if (!asyncrst_n) {rst_n,rff1} <= 2'b0;&else {rst_n,rff1} <= {rff1,1'b1};endendmodule&第2,3级的Reset_Sychronizer程序:module Reset_Synchronizer2(output reg rst_n,input&&clk, asyncrst_n,d);&&reg rff1;&always @ (posedge clk , negedge asyncrst_n) begin&if (!asyncrst_n) {rst_n,rff1} <= 2'b0;&&&&else {rst_n,rff1} <= {rff1,d};endendmodule顶层模块的源程序:include "Reset_Synchronizer.v"include "Reset_Synchronizer2.v"module AsynRstTree_Trans( input&&Clk1M,Clk2M,Clk11M,SysRst_n,&&output SysRst1M_n,SysRst2M_n,SysRst11M_n);&&Reset_Synchronizer Rst1M(.clk(Clk1M),. asyncrst_n(SysRst_n),.rst_n(SysRst1M_n));&&Reset_Synchronizer2Rst2M(.clk(Clk2M),.d(SysRst1M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst2M_n));&&Reset_Synchronizer2Rst11M(.clk(Clk11M),.d(SysRst2M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst11M_n));endmodule
阅读(7369) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 verilog always语句 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信