如何利用CPU对计数器复位开始verilog 16进制计数器

用Verilog设计实现异步双向计数器_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用Verilog设计实现异步双向计数器
&&用Verilog实现一步双向计数器的程序
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢怎么用verilog设计异步清零和同步使能十进制计数器
全部答案(共1个回答)
用Xilinx 的ISE的话,只要synthesize过了的话,就可以view RTL schematic,可以看到框图,点击框图就可以看到电路图了。
希望能帮...
LS161的11脚(Q3)和13脚(Q1)接到LS20的其中一个与非门的两个输入端,LS20是双4输入与非门,也就是一个与非门有四个输入端,所以另外两个输入端应...
LS161的11脚(Q3)和13脚(Q1)接到LS20的其中一个与非门的两个输入端,LS20是双4输入与非门,也就是一个与非门有四个输入端,所以另外两个输入端应...
解:我们常用的是十进制计数法,计数单位是:一(个)、十、百、千、万、十万……,每相邻的两个计数单位之间的进率都是十.像 :
一(个)、十、百、千、万、十万…...
会的啊,会查序列号。
答: 怎样用MATLAB程序实现小波变换?
答: 网络标识就是用IP的二进制与子网掩码的二进制数据作与运算(可用WINDOWS计算器算二进制),所得结果,而不是IP地址前几段相同就表示在同一网段
答: 采用NAS存储和备份广告设计行业网络中的业务数据资料,实现数据的集中存储、备份、分析与共享,依据设计研究单位对不同数据的不同要求,充分利用现有数据,合理构建广告...
每家运营商的DNS都不同,而且各省的也不同。你可以问问你的网络提供商,他们会告诉你的。(也可以通过分别访问域名和IP来检查DNS是否正常,访问域名不行,而访问IP可以,则说明DNS设置不对)
另外,如果ADSL-电脑没问题,一般ADSL-路由器也没问题的。而且采用ADSL拨号的话,DNS可以不设置的,拨号成功后会自动取得DNS服务器。
问题可能出在路由器设置上。进去检查一下吧。看看上网方式,上网用户名密码是否正确。
(有个问题要注意一下,有些地方的运营商会限制使用路由器或者限制接入数量,一般是采取绑定网卡MAC地址的方式,如果路由器设置都正常,试试路由器的MAC地址克隆功能,把电脑网卡的MAC复制过去)
海鸟的种类约350种,其中大洋性海鸟约150种。比较著名的海鸟有信天翁、海燕、海鸥、鹈鹕、鸬鹚、鲣鸟、军舰鸟等。海鸟终日生活在海洋上,饥餐鱼虾,渴饮海水。海鸟食量大,一只海鸥一天要吃6000只磷虾,一只鹈鹕一天能吃(2~2.5)kg鱼。在秘鲁海域,上千万只海鸟每年要消耗?鱼400×104t,它们对渔业有一定的危害,但鸟粪是极好的天然肥料。中国南海著名的金丝燕,用唾液等作成的巢被称为燕窝,是上等的营养补品。
关于三国武将的排名在玩家中颇有争论,其实真正熟读三国的人应该知道关于三国武将的排名早有定论,头十位依次为:
头吕(吕布)二赵(赵云)三典韦,四关(关羽)五许(许楮)六张飞,七马(马超)八颜(颜良)九文丑,老将黄忠排末位。
关于这个排名大家最具疑问的恐怕是关羽了,这里我给大家细细道来。赵云就不用多说了,魏军中七进七出不说武功,体力也是超强了。而枪法有六和之说,赵云占了个气,也就是枪法的鼻祖了,其武学造诣可见一斑。至于典韦,单凭他和许楮两人就能战住吕布,武功应该比三英中的关羽要强吧。
其实单论武功除吕布外大家都差不多。论战功关羽斩颜良是因为颜良抢军马已经得手正在后撤,并不想与人交手,没想到赤兔马快,被从后背赶上斩之;文丑就更冤了,他是受了委托来招降关羽的,并没想着交手,结果话没说完关羽的刀就到了。只是由于过去封建统治者的需要后来将关羽神话化了,就连日本人也很崇拜他,只不过在日本的关公形象是扎着日式头巾的。
张飞、许楮、马超的排名比较有意思,按理说他们斗得势均力敌都没分出上下,而古人的解释是按照他们谁先脱的衣服谁就厉害!有点搞笑呦。十名以后的排名笔者忘记了,好象第11个是张辽。最后需要说明的是我们现在通常看到的《三国演义》已是多次修改过的版本,笔者看过一套更早的版本,有些细节不太一样。
1、以身作则,如果连自己都做不好,还怎么当班长?
2、人缘好,我就是由于人缘不好,才改当副班长的。
3、团结同学,我们班有一个班长就是由于不团结同学才不当班长的,他现在是体育委员。
4、要有管理能力,首先要有大嗓门,我们班有位学习委员就是由于声音太轻才以3票之差当不了班长;其次要口齿清楚,让同学能听得懂你说的话;第三要说出有道理的话,让吵闹或打架的同学心服口服;第四,不能包庇好朋友,公正;第五,要搞好师生关系;第六,要严以律己,宽以待人,我们班的第一任班长就是因为“严以待人,宽以律己”才不能继续当下去的。
5、要坚持,我们班的纪律委员就是由于没有恒心,原来的大组长、卫生委员、劳动委员、体育委员、学习委员、小组长等(每个学期都加起来)都被免除了,现在的才当1天的纪律委员要不要免除都在考虑中,还要写说明书。
6、提醒班干部做自己要做的事,要有责任心。我们班的纪律委员就是没有责任心,班长的职务都被罢免了。
7、不要拿出班长的架子,要虚心。
8、关心同学(包括学习)。
9、要及早发现问题,自己可以解决的自己解决;自己不能解决的,早日让班主任解决。
10、要发现班级的好的地方,及时表扬。让全班都照做。
11、不要太担心学习,当个班干部,对以后工作有好处,这是个锻炼的机会,好好当吧,加油!
在高中阶段,学校和老师的规定一般都是为了学生的成绩着想,执行老师的话,其实也是为了大家好。即使有时候打点小报告,只要你的心态的好的,也不是坏事。比如A学习不专心,你用个适当的办法提醒老师去关心他,其实也是为了他好。
总的方针:和同学们组成一个团结的班集体,一切以班集体利益为上(当然不冲突国家、社会和学校利益为前提)。跟上面领导要会说话,有一些不重要的东西能满就满,这对你的同学好,也对你的班好。
再说十五点
一,以德服人
也是最重要的,不靠气势,只靠气质,首先要学会宽容(very important)你才能与众不同,不能和大家“同流合污”(夸张了点),不要有这样的想法:他们都怎么样怎样,我也。如果你和他们一样何来让你管理他们,你凭什么能管理他们?
二,无亲友
说的绝了点,彻底无亲友是不可能,是人都有缺点,有缺点就要有朋友帮助你。不是说,不要交友,提倡交友,但是不能把朋友看的太重,主要不能对朋友产生依赖感,遇到事情先想到靠自己,而不是求助!
三,一视同仁
上边说的无亲友也是为了能更好的能一视同仁,无论是什么关系,在你眼里都应是同学,可能比较难作到,但没有这点,就不可能服众。
四,不怕困难
每个班级里都会一些不听话的那种,喜欢摆谱的那种,不用怕,他们是不敢怎么样的!知难而进才是一个班长应该有的作风。
五,带头作用
我想这点大家都有体会就不多说了
六,打成一片
尽量和大家达成共识,没有架子,不自负不自卑,以微笑面对每一个人,不可以有歧视心理,不依赖老师,有什么事情自己解决,老师已经够累的了。
七,“我是班长”
这句话要随时放在心底,但是随时都不要放在嘴上,有强烈的责任心,时刻以班级的荣誉为主,以大家的荣誉为主。什么事情都冲在最前面。遇事镇定。
八,帮助同学
帮助同学不是为了给大家留下一个好的印象等利益方面的事,是你一个班长的责任,是你应该做的,只要你还是一个班长,你就要为人民服务(夸张)为同学服务。
九,诚实守信
大家应该都知道这个,是很容易作到的,也是很不容易作到,然这两句话并不是矛盾的,不是为了建立一个好的形象,和班级责任也没有什么关系,只是一个人应该有的道德品质。但你必须作到,连这样都做不到,就不可能做成一个好的班长。
十,拿的起放的下
学会放弃也同样重要,学会辨别好与坏。知道什么是该做的,什么是不该做的。
十一,谦虚
认真分析同学给你提的意见,不管是有意的,还是无意的。提出来就有他的想法,有他的动机。要作到一日三醒我身。
十二,心态端正
总之要有一个好的心态,积极向上的心态,把事情往好里想,但同时要知道另一面的危机,遇到事情首先想到的应该是解决问题,而不是别的!
十三,合理的运用身边的人和事
主动,先下手为强,遇到不能够管理的,就可以和其他班干部一起对付,实在不行,就迅速找到老师陈述自己的观点,免得他倒打一耙(尽量少打小报告.)
十四,和老师同学搞好关系.
威信可以提高,你说的话老师也比较相信,可以简单一点的拿到老师的一些特殊授权,而这些授权往往对你的帮助很大.
十五,合理的运用自己的权利和魄力
对付难管理的,权利在他的眼中已经不存在的,就运用你的魄力,用心去交流,努力感动身边的人,感动得他们铭记于心,你就成功了.
一点要加油哦
考虑是由于天气比较干燥和身体上火导致的,建议不要吃香辣和煎炸的食物,多喝水,多吃点水果,不能吃牛肉和海鱼。可以服用(穿心莲片,维生素b2和b6)。也可以服用一些中药,如清热解毒的。
确实没有偿还能力的,应当与贷款机构进行协商,宽展还款期间或者分期归还; 如果贷款机构起诉到法院胜诉之后,在履行期未履行法院判决,会申请法院强制执行; 法院在受理强制执行时,会依法查询贷款人名下的房产、车辆、证券和存款;贷款人名下没有可供执行的财产而又拒绝履行法院的生效判决,则有逾期还款等负面信息记录在个人的信用报告中并被限制高消费及出入境,甚至有可能会被司法拘留。
第一步:教育引导
不同年龄阶段的孩子“吮指癖”的原因不尽相同,但于力认为,如果没有什么异常的症状,应该以教育引导为首要方式,并注意经常帮孩子洗手,以防细菌入侵引起胃肠道感染。
第二步:转移注意力
比起严厉指责、打骂,转移注意力是一种明智的做法。比如,多让孩子进行动手游戏,让他双手都不得闲,或者用其他的玩具吸引他,还可以多带孩子出去游玩,让他在五彩缤纷的世界里获得知识,增长见识,逐渐忘记原来的坏习惯。对于小婴儿,还可以做个小布手套,或者用纱布缠住手指,直接防止他吃手。但是,不主张给孩子手指上“涂味”,比如黄连水、辣椒水等,以免影响孩子的胃口,黄连有清热解毒的功效,吃多了还可导致腹泻、呕吐。
合肥政务区网络广告推广网络推广哪家公司比较好 一套能在互联网上跑业务的系统,被网络营销专家赞为目前最 有效的网络推广方式!
1、搜索引擎营销:分两种SEO和PPC,即搜索引擎优化,是通过对网站结构、高质量的网站主题内容、丰富而有价值的相关性外部链接进行优化而使网站为用户及搜索引擎更加友好,以获得在搜索引擎上的优势排名为网站引入流量。
良工拥有十多位资深制冷维修工程师,十二年生产与制造经验,技术力量雄厚,配有先进的测试仪器,建有系列低温测试设备,备有充足的零部件,包括大量品牌的压缩机,冷凝器,蒸发器,水泵,膨胀阀等备品库,能为客户提供迅捷,优质的工业冷水机及模温机维修和保养。
楼主,龙德教育就挺好的,你可以去试试,我们家孩子一直在龙德教育补习的,我觉得还不错。
成人可以学爵士舞。不过对柔软度的拒绝比较大。  不论跳什么舞,如果要跳得美,身体的柔软度必须要好,否则无法充分发挥出理应的线条美感,爵士舞也不值得注意。在展开暖身的弯曲动作必须注意,不适合在身体肌肉未几乎和暖前用弹振形式来做弯曲,否则更容易弄巧反拙,骨折肌肉。用静态方式弯曲较安全,不过也较必须耐性。柔软度的锻炼动作之幅度更不该超过疼痛的地步,肌肉有向上的感觉即可,动作(角度)保持的时间可由10馀秒至30-40秒平均,时间愈长对肌肉及关节附近的联结的组织之负荷也愈高。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415计数器的原理你懂吗?用Verilog语言更加容易理解计数器的原理你懂吗?用Verilog语言更加容易理解低不了的只有档次百家号小伙伴们好,小编今天要讲的是基于Verilog语言的计数器电路设计。首先,介绍一下计数器的基本概念:计数其实是一种最简单最基本的运算,就像我们扳手指计数一样,不过不同的是,计数器是有一定频率的计数,具有一样的时间间隔,而我们扳手指计数的时间间隔不一样罢了。而计数器就是实现这种运算的逻辑电路,主要是通过对时钟(上升)脉冲的个数进行计数的。计数器在我们身边也很普遍,比如手机中自带的跑步的计数,体育比赛中测试时间的计时器等等,所以,熟悉掌握计数器,不仅对于学习Verilog非常有用,而且,还能锻炼我们的逻辑能力和更深刻地理解数字电路的工作原理,从而对科技更加感兴趣!下面是根据计数器的原理,从而编写出来的代码Code:时钟信号:clk(时钟信号,就是电路的“心脏”,不可或缺的)复位信号:rst(复位信号,也是一个合格的电路不应该缺少的一个输入信号。这里,当复位信号为低电平时,输出全部置零)当复位信号为低电平时,开始计数,每一个时钟信号的上升沿到来就计一次数,每计数满256个时钟周期为一个输出循环,输出置零,然后重新计数。计数值信号:out(显示计数值,根据自己设计的需要,可以对位数进行设置,比如最大计数值为4,那么位数就可以设置为[2:0])然后下面是激励程序TestBench:仿真结果如图所示,可以看到,在复位信号无效的时候,当每一个时钟上升沿到来之后,就会自动计一次数,这样,就起到了对时钟进行计数的功能。你想要在多少个时钟周期之后实现什么操作,就可以自动设置计数值,代码中的“256”就是所谓的计数最大值,当计数到“256”的时候,下一个时钟到来的时候,自动返回“0”值。计数器的功能的实现一目了然!其实,这个既是计数器,又能当分频器,而且还能当计时器哟(再者还可以当闹钟功能)这三者其实都是息息相关的,但是小编并没有把分频器和定时器的功能加上去。其实只需要增加一两个信号即可,小伙伴们能否想到怎么添加,从而使得这个程序既有计数器的功能,也有分频器的功能和定时器的功能呢?大家可以试试,如果有问题的话,欢迎留言讨论,小编会一一回复~本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。低不了的只有档次百家号最近更新:简介:只要有心智,有感悟,启迪和帮助无处不在。作者最新文章相关文章&&|&& &&|&& &&|&&
verilog的PWM设计精华解析
17:04:34 && 阅读:4320&&
针对C语言编程者的Verilog开发指南实例
文举例说明了如何用软件实现脉宽调制(PWM),如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件完成对该逻
辑块的控制。通过理解本文讨论的概念和内容,没有太多硬件知识的软件开发人员也能掌握在FPGA上开发硬件的技能。
&&&&在不远的将
来,嵌入式系统设计师将能够根据哪个更有利于解决设计问题来自由选择硬件和软件方案。但直到现在,对于那些想学习硬件设计的软件工程师来说不少障碍仍然很
难逾越。由于硬件描述语言和编程语言非常相似,因此最终这些障碍会消失。另外,市场上已有好几种低成本的演示板,上面包含现场可编程门阵列(FPGA)、
微处理器以及相应工具,软件开发人员可以借此来学习硬件设计。
&&&&本文举例说明了一个使用FPGA的新设计流程,我们从中可以知道如何用软件实现PWM,然后如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件完成对该逻辑块的控制。
软硬件划分
在的情况与以前有所不同,软件工程师能够方便地参与到硬件设计中。不管是硬件模块还是软件模块现在都可以用编程语言进行设计。众所周知,C语言是嵌入式软
件设计的通用语言。在硬件设计方面,Verilog则是流行的选择(用VHDL的人也很多)。Verilog的语法和结构与C编程语言非常相似,从本文的
例子中也可以看到这一点。
&&&&同时,硬件的升级和修改也变得越来越方便。以前可以通过下载新的可执行映像文件升级软件,但对硬件却
行不通。现在情况不同了。就像软件开发人员能够快速编辑、重新编译、然后将新代码下载到存储器那样,使用可编程逻辑器件的硬件设计者也能做类似的事情。可
编程逻辑改变了嵌入式系统的设计方法,设计者可以像修改软件那样方便地修改硬件。换句话说,在设计和调试阶段,设计者能够灵活选择软件方式或硬件方式来作
为完成任务的最佳方式。
&&&&设计者无需太多的硬件知识就可以利用FPGA供应商提供的工具轻松地开发出可编程逻辑嵌入式系统。例
如,Altera公司的SOPC
Builder能帮助系统设计师从已有的库中选择和配置外围电路,并增加用来创建和连接外围电路的用户逻辑。加上一些可编程逻辑和硬件知识,软件工程师就
能够充分利用硬件的优势改进他们的系统。
&&&&PWM控制器会产生一连串脉冲。通常需要规定脉冲的周期
和宽度。占空比被定义为脉冲宽度与周期的比值。PWM有着广泛的应用,大多数情况下用于控制模拟电路。因为数字信号连续变化的速率相对较快(当然取决于信
号周期),因此最终会形成一个用来控制模拟设备的平均电压值。当PWM脉冲流应用于马达时,马达的转速就能正比于占空比(从0%到100%)。如果占空比
增加,马达转速就会提高,反之,如果占空比减小,马达的转速随之也会降低。
&&&&用软件编写这样一个PWM控制器是相对比较容易的任务,但它有助于我们简明扼要地描述如何用Verilog设计硬件。清单1给出了PWM的C代码。
清单1:完全用软件实现的位脉冲PWM控制器。
pwmTask(uint32_t pulse_width, uint32_t period)
uint32_t time_on=pulse_
uint32_t time_off=period-pulse_
pwm_output=1;
sleep(time_on);
pwm_output=0;
sleep(time_off);
据脉宽(pulse_width)和周期(period)参数值,计算出输出为高电平和低电平的时间。接下来将输出引脚置为高电平,并等待time_on
设定的时间值之后,将输出变为低电平,并等待time_off参数设定的时间值。下个周期再重复这样的过程,并无限循环下去。
Verilog模块
&&&&清单2给出了一个简单的Verilog模块,实现带异步复位功能的8位宽寄存器。寄存器的输入“in”在时钟的上升沿被赋值到输出“out”,直到clr_n复位信号的下降沿到来(此时输出将被赋值为0)。
清单2:实现带异步复位功能8位宽寄存器的Verilog编写模块。
module simple_register(in, out, clr_n, clk, a);
//端口声明
input [7:0]
output [7:0]
//信号声明
//实现带异步清除的寄存器
always @(posedge clk or negedge clr_n)
if (clr_n==0) // could also be written if (!clr_n)
//连续赋值
assign a=!out[0];
略地看Verilog与C语言有许多相似之处。分号用于结束每个语句,注释符也是相同的(/* ... */和//
都是熟悉的),运算符“==”也用来测试相等性。Verilog的if..then..else语法与C语言的也非常相似,只是Verilog用关键字
begin和end代替了C的大括号。事实上,关键字begin和end对于单语句块来说是可有可无的,就与C中的大括号用法一样。Verilog和C都
对大小写敏感。
&&&&当然,硬件和软件的一个重要区别是它们的“运行”方式。硬件设计中用到的许多单元都是并行工作的。一旦设备电源
开启,硬件的每个单元就会一直处于运行状态。虽然根据具体的控制逻辑和数据输入,设备的一些单元可能不会改变它们的输出信号,但它们还是一直在“运行”
&&&&相反,在同一时刻整个软件设计中只有一小部分(即使是多软件任务也只有一个任务)在执行。如果只有一个处理器,同一时间点
只能有一条指令在执行。软件的其它部分可以被认为处于休眠状态,这与硬件有很大的不同。变量可能以一个有效值而存在,但大多数时间里它们都不在使用状态。
&&&&软硬件的不同行为会直接导致硬件和软件代码编程方式的不同。软件是串行执行的,每一行代码的执行都要等到前一行代码执行完毕后才能进行(中断的非线性或操作系统的命令除外)。
//-------------------------------------------------------------------------------------------------------------
个Verilog模块的开头是关键字module,紧跟其后的是模块名称和端口列表,端口列表列出了该模块用到的所有输入输出名称。接下来是端口声明部
分。注意:所有的输入输出既出现在模块第一行的端口列表中,也会出现在端口声明(declaration)部分中。
Verilog中有二种类型的内部信号用得比较多,它们是reg和wire。它们具有不同的功能。所有端口都有一个名称相同且声明为wire的信号。因此
连线line被声明为wire不是必要的。reg会保持上次的赋值,因此不需要每次都进行驱动。wire型信号用于异步逻辑,有时也用来连接信号。因为
reg可以保持上次的值,因此输入不能被声明为reg类型。在Verilog模块中可以在任何时候异步地将输入改变为任何事件。reg和wire的主要区
别是,reg类型的信号只能在过程块(后面会谈到)中赋值,而wire类型的信号只能在过程块外赋值。这两种信号类型都可以出现在过程块内部和外部的赋值
运算符右边。
&&&&使用关键字reg并不一定意味着编译器会创建一个寄存器,理解这一点是非常重要的。清单2的代码中有一个reg类
型8位宽的内部信号out。该模块使用寄存器源于always模块(过程块的一种)的编程方式。值得注意的是,信号a是一个wire类型,因此只能在连续
赋值(continuous assignment)语句中赋值,而reg类型的out信号只能在always块中赋值。
&&&&always块是过程块的一种,仅在某种变化发生时用于更新信号。always语句圆括号里的表达式组被称为敏感列表,格式是:(表达式or表达式…)
要敏感列表中的任何一个表达式值为真,always块中的代码就会被执行。Verilog中用于上升沿和下降沿的关键字分别是posedge和
negedge。这二个关键字经常被用于敏感列表。在本例中,如果clk信号的上升沿或clr_n的下降沿信号发生时,always块内部的语句就会被执
&&&&为了用好寄存器,输出必须在时钟的上升沿得到更新(下降沿也可以,但上升沿更常见些)。增加negedge
clr_n会使寄存器在clr_n信号的下降沿复位。但并不是所有的敏感列表都会包含关键字posedge或negedge,因此在实际硬件中并不总是存
在真实的寄存器。
&&&&always块内的第一条语句判断clr_n信号的上升沿有没有发生。如果有,下一行代码把out置为0。这
些代码行实现了寄存器的异步复位功能。如果条件语句是:if(negedge clr_n and
clk==1),那么该语句实现的就是基于时钟的异步复位。
&&&&读者可能已经注意到,always块中的赋值运算符与以关键字assign开头的连续赋值语句中用到的运算符不一样。"&="运算符用于非阻塞性(nonblocking)赋值,而"="运算符用于阻塞性(blocking)赋值。
&&&&在一组阻塞性赋值语句中,在下一个阻塞性赋值语句执行前需要计算并赋值第一个赋值语句。这一过程就象C语言中语句的顺序执行。而非阻塞语句在执行时,所有赋值语句的右边被同时计算和赋值。连续赋值语句必须使用阻塞赋值语句(否则编译器会报错)。
&&&&为了减少代码出错的概率,建议在顺序逻辑(例如希望以寄存器方式实现的逻辑)always块中的所有赋值语句使用非阻塞性赋值语句。大多数always块应该使用非阻塞性赋值语句。如果always块都是组合逻辑,那么就需要使用阻塞性赋值语句。
//-------------------------------------------------------------------------------------------------------------
写存储器映射硬件模块的首要任务是以软件方式决定寄存器映射图。在PWM案例中,一般设计师希望能用软件设置周期和脉宽。在硬件设计中用计数器统计系统时
钟周期数是非常容易的。因此要用到两个寄存器,分别命名为pulse_width和period,并且都在时钟周期内度量。表1给出了PWM的寄存器映射
&&&&为了确定输出信号,硬件可简单地通过将period和pulse_width寄存器内容作为运行中的计数器保持的输出。
下来要为PWM选择端口,大多数端口可以依据总线架构而定。表2提供了通用存储器映射PWM的信号描述概要。通常为低电平有效的信号命名做法是在信号名上
加“_n”,对于控制信号更是如此。表2中的write_n和clr_n信号就是低电平有效的信号(下降沿触发)。
&&&&至此我们已经定义好了硬件模块的接口,接下来就可以开始编写Verilog代码了。清单3给出了一个实现例子。
清单3:用Verilog实现的PWM硬件。
module pwm (clk, write_data, cs, write_n, addr, clr_n, read_data, pwm_out);
input [31:0]
output [31:0]
reg [31:0]
reg [31:0]
reg [31:0]
reg [31:0]
period_en, pulse_width_ //写使能
// 定义period和pulse_width寄存器的内容
always @(posedge clk or negedge clr_n)
if (clr_n==0)
period&=32'h ;
pulse_width&=32'h ;
if (period_en)
period&=write_data[31:0];
if (pulse_width_en)
pulse_width&=write_data[31:0];
pulse_width&=pulse_
// period和pulse_width寄存器的读访问
always @(addr or period or pulse_width)
if (addr == 0)
read_data=
read_data=pulse_
always @(posedge clk or negedge clr_n)
if (clr_n==0)
counter&=0;
if (counter&=period-1)
counter&=0;
counter&=counter+1;
always @(posedge clk or negedge clr_n)
if (clr_n==0)
if (counter&=pulse_width)
if (counter==0)
assign period_en = cs & !write_n & !
assign pulse_width_en = cs & !write_n &
assign pwm_out=!
先是端口说明,接着是内部信号说明。构成PWM软件控制接口的存储器映射型寄存器被声明为reg。该代码行只允许以32位的方式访问这些存储器映射型寄存
器。如果需要8位或16位访问,就必须将寄存器分割成4个8位寄存器,并增加字节使能信号逻辑。用Verilog代码实现这一功能是非常简单的。
always块中已赋过值的所有信号都被声明为reg类型。声明为wire类型的信号是period和pulse_width寄存器写入使能信号。这些信
号使用连续赋值语句进行赋值。
&&&&清单的余下部分即是实际的代码,共有4个always块,最后还有几个赋值语句。每个
always块描述一个信号或一组有相同基本行为(换句话说,使用相同的控制逻辑)的信号的行为。这是使代码具有可读性并能减少错误的Verilog代码
编写风格。所有的always块都有复位逻辑,当clr_n信号被证实(设为0)时,复位逻辑将信号置为0。虽然这样做并不是严格必需的,但这是一种良好
的设计习惯,能使每个信号在复位时都有确定的值。
&&&&第一个always块描述了寄存器映射中的寄存器行为。当正确的使能信号被证
实时,write_data寄存器值就被写入period或pulse_width寄存器中。这是改变任一寄存器值的唯一途径。该文件底部的连续赋值语句
定义了写入使能信号。当主写入使能信号和芯片选择信号同时被证实时,period和pulse_width寄存器的写入使能信号就被证实,此时
period和pulse_width的地址位应分别被置为0和1。
&&&&第二个always块定义了寄存器映射图中读寄存器。Period寄存器位于外围电路的基本地址处,pulse_width寄存器在后面32位字地址处。
三和第四个always块一起来决定PWM的输出。第三个always块实现计数器功能,它连续计数到period寄存器设置的值时复位到0,然后重新开
始计数。第四个always块对该计数器值与pulse_width寄存器值进行比较,当计数器值小于pulse_width值时,PWM输出保持高电
平,否则设为低电平。
&&&&需要牢记的是不管在何种条件下每个信号都必须有明确的值。回顾一下硬件的基本行为特征——“始终在运
行”。例如在最后一个always块(描述off信号的那个块)中,代码的最后行将off赋于它本身。最初看来好象比较奇怪,但如果没有这一行的
话,off值将是不确定的。对这一情况保持跟踪的最方便途径是确保每次信号会在if语句中赋值,在相应的else语句中也赋值。
&&&&现在硬件完成了,可以利用寄存器映射图中的寄存器通过软件对PWM实施控制。读者可以用一个简单的带指针的数据结构连接PWM中的寄存器。
typedef volatile struct
uint32_t pulse_
如,可以将PWM连接到LED。先初始化一个名为pLED、类型为PWM*的变量,将其指向PWM基地址。这样做实际上是将硬件抽象进了一个数据结构。向
pLED-&period写入数据会设置或改变period值,向pLED-&pulse_width写入数据将改变占空比,并导致LED的
亮度增加或减少。如果使用的是闪烁型LED,只需把周期变长,让肉眼清晰辨别开和关的周期即可。
&&&&清单3所示的Verilog
PWM实现在本例中是作为Altera的Nios处理器系统的外围电路进行测试的,可以利用前文所述的C结构通过软件对它访问。Altera的SOPC
Builder创建了宏,可以使ModelSim(明导资讯公司的一个硬件仿真器)中的协同仿真。在系统执行C代码时可以利用ModelSim仿真器观察
到PWM信号以及其它系统信号的行为。
&&&&清单4给出了用于产生图1所示PWM波形的C代码。C代码向PWM寄存器写入数据,创建
出周期为5个时钟周期、脉宽为4个时钟周期的PWM输出信号。请注意在波形的开始处,由于period和pulse_width寄存器都被写入了数
据,cs和wr_n信号被证实了二次(在写period寄存器时地址信号为低电平,在写pulse_width寄存器时地址信号变成了高电平)。
清单4:用于产生图1所示PWM波形的测试软件。
main(void)
PWM * const pLED=...
pLED-&period=5;
pLED-&pulse_width=4;
asm("nop");
asm("nop");
asm("nop");
pLED-&pulse_width=2;
&&&&在寄存器中写入新值后,pwm_output信号开始反映出变化。然后,只加入一些时延我们再看输出,一些NOP指令被C代码执行了。最终,脉宽变为2个周期,PWM波形相应也有了变化,但周期仍保持为5个时钟周期。
&&&&设计嵌入式系统架构时最好将系统分成硬件和软件二大模块,以便充分利用各自的优势。随着开发工具的不断发展,软件和硬件模块的相互交换也变得越来越透明。
旦充分理解了本文讨论的概念和内容,也就掌握了在FPGA上开发硬件的技能。FPGA能被用作微处理器系统中的一个存储器映射式外围电路,可以通过简单的
编程实现接口。由于用硬件实现算法的速度快得多,将算法从软件转换成硬件可以极大地提高系统性能。这就是人们常说的硬件加速,掌握这一技术是熟练使用可编
程逻辑器件中被有效实现的可配置处理器的关键。从长远来看,即使是软件工程师也能通过硬件加速提高系统性能和效率。
后参与讨论
阅读:2414
阅读:2417
阅读:2432
阅读:2871

我要回帖

更多关于 verilog 计数器 时钟 的文章

 

随机推荐