Verilog HDL学习_1:分频器的实现

(一)参考学习资料

(二)实际操作

1. 相关变量计算:

 
First Initial


Second Initial


Upper case


H


X


ASCII (Dec)


72


88


Lengths of the pulse

   

Mu


Mu_1


2.5*105


Mu_2


2.5*105


k : mu


ku_1 : mu_1


1.2812:3.7188


ku_2 : mu_2


1.3438:3.6562


nu


nu_1


18


nu_2


18


Ku


Ku_1


64060


Ku_2


67190


Lower case


h


x


ASCII (Dec)


104


120


Lengths of the pulse

   

Ml


Ml_1


2.5*105


Ml_2


2.5*105


k : ml


kl_1 : ml_1


1.4063:3.5937


k : ml_2


1.4688:3.5312


nl


nl_1


18


nl_2


18


Kl


Kl_1


70315


Kl_2


73440

2. 第一版:

 1 module Assignment2(rst, CP, Z);
 2     input CP;
 3     input rst;  //1 for upper & 0 for lower
 4
 5     reg turn = 0;
 6     reg [1:0] cyc = 0; //use for the number of cycles
 7
 8     //constant parameters
 9     parameter k = 100, n = 8, K = 100;
10     parameter KK = K-1;
11
12     //take parameters according to rst input
13     reg [7:0] M;
14     reg [7:0] MM;
15     reg [4:0] m;
16     //output of the lautch
17     output Z;
18     reg Z;
19
20
21     //parameters of upper case
22     parameter [7:0] Mu [0:1] = {128, 134};
23     parameter [4:0] mu [0:1] = {28, 34};
24     //parameter Ku_1 = k*Mu_1/(k+mu_1);
25     parameter [7:0] MMu [0:1] = {127, 133};
26     //Parameter []KKu_1 = Ku_1-1;
27     

34     //parameters of lower case
35     parameter [7:0] Ml [0:1] = {141, 147};
36     parameter [4:0] ml [0:1] = {41, 47};
37     parameter [7:0] MMl [0:1] = {127, 133};
38
39     //Check rst to determine upper or lower.
40     //check the number of turn to determine the first two or the second.
41     always@(posedge CP)
42     begin
43         if(rst)
44             begin
45             M <= turn ? Mu[1]:Mu[0];
46             m <= turn ? mu[1]:mu[0];
47             MM <= turn ? MMu[1]:MMu[0];
48             end
49         else if(!rst)
50             begin
51             M <= turn ? Ml[1]:Ml[0];
52             m <= turn ? ml[1]:ml[0];
53             MM <= turn ? MMl[1]:MMl[0];
54             end
55     end
56
57     //Latch
58     reg [n-1:0] Q = 0;
59     wire ld, cz;
60     assign ld = Q>=MM;
61     assign cz = (Q<KK)|ld;
62
63     always@(posedge CP)
64     begin
65         {Q,Z} <= {ld?0:Q+1, cz};
66         cyc = ld ? cyc+1 : cyc;
67
68         if(cyc == 2)
69             begin
70             turn <= 1;
71             cyc <= 0;
72             end
73         else begin
74             turn <= 0;
75             end
76     end
77
78
79 endmodule
  • 出现问题1:

解决方案:将如下部分的变量类型由reg改为了input,系统没有再次崩溃。

12     //take parameters according to rst input
13     reg [7:0] M;
14     reg [7:0] MM;
15     reg [4:0] m;
16     //output of the lautch
17     output Z;
18     reg Z;

原因:不明

补充:reg变量不可按位赋值,在二维数组中的赋值应为下图第一种方法。

// Correct
M <=Mu[1];

// WrongM <=Mu[1][7:0];
  • 出现问题2:vwf文件仿真时,M没有成功赋值

解决方案:修正了对reg宽度的定义。

补充:

1. Verilog中reg类型的宽度是自定义的,若无定义则默认为1bit。reg的宽度影响变量的取值,若赋值超出reg的范围,不会产生Error,reg变量的最大值将被默认为reg宽度。修改变量时应注意该变量的取值范围。

2. reg变量只能存储整数,允许的运算为加减乘除,若要实现浮点数需要以此为基础构建相关专门的模块。

3. 第二版:

 1 module Assignment2(rst, CP, Z, K);
 2     input CP;
 3     input rst;  //1 for upper & 0 for lower
 4
 5     reg turn = 0;
 6     //use to determine whether the first group of pulses or the second one
 7     reg [3:0] cyc = 0;
 8     //use for the number of pulses in one ‘turn‘
 9
10     ////constant parameters
11     parameter n = 18, M = 250000;
12     parameter MM = M-1;
13
14     ////take parameters according to rst input
15     output [n-1:0] K;
16     reg [n-1:0] K = 0;
17
18     ////output of the lautch
19     output Z;
20     reg Z;
21
22     ////parameters of upper case
23     parameter Ku_1 = 64060;
24     parameter Ku_2 = 67190;
25
26     ////parameters of lower case
27     parameter Kl_1 = 70315;
28     parameter Kl_2 = 73440;
29
30     ////Latch
31     reg [n-1:0] Q;
32     wire ld, cz;
33     assign ld = Q>=MM;
34     assign cz = (Q<K-1)|ld;
35
36     always@(posedge CP)
37     begin
38         ////Check rst to determine upper or lower.
39         ////check the number of turn to determine the first two or the second.
40         case(rst)
41         0: begin
42                 if(turn)K <= Kl_2;
43                 else if(!turn)K <= Kl_1;
44                 else K <= 100;
45             end
46         1: begin
47                 if(turn)K <= Ku_2;
48                 else if(!turn)K <= Ku_1;
49                 else K <= 200;
50             end
51         default: K <= 9999999;
52         endcase
53
54         ////renew the state and output clock.
55         {Q,Z} <= {ld?0:Q+1, cz};
56         cyc = ld ? cyc+1 : cyc;
57
58         ////1 cyc represent a pulse
59         ////2 cycles cause an increment in turn
60         ////4 cycles for an entire loop
61         if(cyc == 2)
62             begin
63             turn <= 1;
64             end
65         else if(cyc==4 && turn==1)
66             begin
67             turn <= 0;
68             cyc <= 0;
69             end
70
71     end
72
73 endmodule
  • 仿真结果://K的取值有修改。
  • 补充:在Z的第一个输出前有一小段空白期,测量为微秒级,第一个输出仍为5ms。感觉应该不影响时钟的使用,但没有经过硬件检测。

原文地址:https://www.cnblogs.com/schelling/p/12368335.html

时间: 2024-07-29 13:19:43

Verilog HDL学习_1:分频器的实现的相关文章

verilog HDL学习笔记(基本概念)

1. 作为一种硬件描述语言,verilog可以直接描述硬件结构,也可以通过描述系统行为实现建模,其主要特点和功能有: *描述基本逻辑门和基本开关模型. * 允许用户定义基元. * 可以指定设计中的端口到端口的延时,路径时延和设计中的时序检查. *可以采用多种方式进行建模,这些方式包括(1)顺序行为描述建模——使用过程化结构建模,(2)数据流行为方式——使用连续赋值语句方式建模,(3)结构化方式——使用门和模块实例语句描述建模. * Verilog中有两类数据类型,线网数据类型和寄存器数据类型.线

Verilog HDL的程序结构及其描述

这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出. 一.Verilog HDL的程序结构 首先我们不开始讲Verilog HDL的语法,我们从Verilog HDL的程序结构出发.相信大家都看过芯片吧,它有个名字,有个外壳,外壳向外伸出有引脚(BGA封装的那种请不要乱搅和...),然后芯片它可以实现一定的功能. Ok,知道这些之后,我们就来看看Verilog HDL的描

基于Verilog HDL整数乘法器设计与仿真验证

基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为0表示为正数),取值范围为-127~127. 负数的表示方法为正值的求反又加1.例如: 8’b0000_0100; //表示值:4,正值求反为:8’b1111_1011:再加1表示为:8’b1111_1100,这样便得到了-4的表示方法为:8’b1111_1100. 同理,负值变成正值的方法为:负值

Verilog HDL基础语法讲解之模块代码基本结构

Verilog HDL基础语法讲解之模块代码基本结构 ? 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的基本结构. 以下为本章中例子中的代码: 01????/*======================================= 02????*????file neme : mux2.v 03????*????author????:????小梅哥 04????*????Verison????:????

MiS603 开发板2.2 Verilog HDL硬件语言基础

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.2 Verilog HDL硬件语言基础 2.2.1 技术背景 大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅

浅谈Verilog HDL代码编写风格

消失了好久,没有写文章,也没有做笔记,因为最近再赶一个比赛,时间很紧,昨天周六终于结束了,所以趁着周末这会儿有时间,写点东西,记录下来.首先我学习FPGA才一年多,我知道自己没有资格谈论一些比较深层次的问题,对于这个行业来说可能我才是一直脚踩在门外面.所以这篇文章是写给一些刚开始学习FPGA.Verilog HDL的同学,我看过一些大神写的代码,然后尽量模仿大神写法,经过好几个大神的影响和自己的习惯摸索,最终算是总结出了一套自己的代码书写风格,当然我的代码风格还是一直在进化中.现在将自己的一些经

Verilog HDL程序设计——基本要素

Verilog基本上熟悉了,继续整理一下Verilog的学习笔记吧.前面记载了Verilog的结构,写Verilog的结构有了,但是该怎么写呢?在写之前就得了解一下Verilog的一些基本要素了,也就是Verilog是怎么一点一点写出来的. 一.标识符与注释 前面已经说到,模块名的定义要符合标识符的定义,那么什么是标识符呢?它的语法是什么呢? ①标识符是赋给对象的唯一名称,通过标识符可以提及相应的对象,Verilog语法将对转义标识符中的字符逐个处理. ②标识符可以是字母.数字.下划线和美元符$

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

&lt;转&gt;Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串