模可变计数器设计(Verilog语言)解答

合集下载

实验二 模可变计数器讲解

实验二 模可变计数器讲解

南昌大学实验报告学生姓名:学号:专业班级:中兴101班实验类型:□验证□综合■设计□创新实验日期:2012、10、18成绩:实验二模可变计数器的设计一、实验目的1.学习计数器的VHDL设计、波形仿真和硬件测试;2.学会自己设计程序;3.学会设计模可变计数器;4.学习多层次设计方法。

二、实验内容与要求1.计设置一位控制模的位M,要求M=0:模23计数;当M=1:模109计数。

2.计数结果用静态数码管显示,一个四位二进制表示0~9中的一个数;3.给出此项设计的仿真波形;4.应用实验装置验证此计数器的功能。

三、实验思路1.按照实验要求,本实验可分为四个模块进程:分频、模23与109计数转换、数码管控制、七段译码。

2.模可变计数器原理:即在原有的模值计数器上加入模值转换功能3.计数器的数码管显示需注意十位和百位的进位即:当个位数的数值为9的下一个脉冲来时转换为,同时向十位进一,转换的算法为:9(1001)+7(0111)=0(0000),并进一位;当数值为99时,用同样的方法转换:153(1001 1001B,数码管显示99)+103(01100111B)=100(0001 0000 0000);4.要求分别实现模23和模109的计数,因此我分别用buffer变量GW、SW 、 BW 代表个位、十位、百位。

还有一个控制模的位M,当M为0时实现模23计数,只用到GW和SW分别为个位和十位计数;当M为1时实现模109计数,用GW 、SW、 BW 分别为个位十位和百位计数。

由于端口不能参与运算,因些在结构体中定义了se10、 sel1、 sel2三个buffer变量,分别用来对应SEL(0)、 SEL(1)、SEL(2);在程序的最后用端口接收信号。

5.进程敏感信号为RST EN M 三个,当RST为低电平,EN为高电平时则计数,否则不计数。

6.位选信号的设置:用整形变量CNT8分别使不同的位选信号对应不同的输入,而得到不同输出。

模可变计数器设计(Verilog语言)解答

模可变计数器设计(Verilog语言)解答

模可变计数器设计(一)实验目的1、进一步熟悉实验装置和Quartus n软件的使用;2、进一步熟悉和掌握EDA 设计流程;3 、学习简单组合、时序电路的EDA 设计;4、学习计数器中二进制码到BCD 码的转换技巧;5、学习实验装置上数码管的输出方法。

(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA 实验装置上实现模可变计数器功能,具体要求如下:1 、设置一个按键控制改变模值,按键按下时模为10-99 之间(具体数值自行确定)的数,没按下时模为100-199 之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。

(三) 主要仪器设备3、微机 1 台4、QuartusII 集成开发软件 1 套5、EDA 实验装置 1 套(四) 实验步骤主要有三个模块1:一个模20 和模119 的计数器2:数码管的显示3:BCD 的调整源程序:module count (clk,m,en,rst,a,sel,SG,d);input clk,m,en,rst;output [7:0] SG;output [2:0] sel;output a;(* synthesis, keep *) reg clk1;(* synthesis, keep *) wire [3:0] gw,sw,bw;/*(* synthesis, keep *) */reg [3:0]a;reg [11:0] q;reg [11:0] model;reg [7:0] cnt,SG;reg [2:0] sel;reg [0:0]d;output [0:0]d;always @(posedge clk) begin cnt=cnt+1;if (cnt==200) begin clk1=1'b1; cnt=0; endelse clk1=1'b0; //200 分频,CLK 为数码管扫描频率,CLK1 为计数频率if (sel<2) sel=sel+1; else sel=0; end //sel 为数码管选择always @(sel) begincase (sel)0: a=bw; //0 数码管为百位1: a=sw; //1 数码管为十位2: a=gw; //2 数码管为个位default: a=0;endcasecase (a)0:SG<=8'b00111111; 1:SG<=8'b00000110;2:SG<=8'b01011011; 3:SG<=8'b01001111;4:SG<=8'b01100110; 5:SG<=8'b01101101;6:SG<=8'b01111101; 7:SG<=8'b00000111;8:SG<=8'b01111111; 9:SG<=8'b01101111; //8 段译码值default: SG=8'b11111111;endcase endalways @(m)if (m) model=12'b000000100000; // 模值20else model=12'b000100011001; // 模值119assign gw=q[3:0];assign sw=q[7:4];assign bw=q[11:8];always @(posedge clk1,negedge rst)beginif (!rst) q=0;else if (en)beginif (q<model)beginif (gw==9) begin q=q+7; if (sw==9) q=q+96; end //BCD 调整else q=q+1;endelse q=0;endendalways @(q)if(qvmodel) d<=0; else d<=1; endmodule波形仿真:iimulatioin WaveformsSimulation sode : TillingA.B Master Time Sar19L9 ns ■[POinler: 39.3^1 us Imeival:39.32 us Stan :End:he. 14 us 37.. 42 UH 33. 7 us39.9B LLS4k 26 us54 us 4X B2 usP 1 i111■Clk1是计数频率,每来一个 clk1信号q 计数一次Simula ion Wa^efor™ Sinulatlon lode: Tiling如图所rst=1有效时开始计数 clk 为扫描频率sel=0时数码管显示百位 a=0 sel=1时数码管显示十位 a=1 sel=2时数码管显示个位 a=3 m=1模20计数器 m=0模119计数器管脚分配:* I HI Ik * Jij19.3ns J hRoirter.6fl.H us Interval.68.09 UE Slarl End.lane<>0□ S&elk<>1B clkl曲+ 0-L玮tT IF Len^1.nCH- 1±1 sei尬1.田Q B i辭El 勿u 3.dM68.14 us63.16 us ■6E. 18 usI63.22 us 68. 24 usW [1] X [3]连[01 X [1] X [3]迪[0] X [1] X [3] ® [o] X [1] X [3]址[0] II :MasierTiiTiB Bar.68.12 usIIISG[0] SG[1] SG[2] SG[3] SG[4] SG[5] SG[6] SG[7] clkPIN_F13PIN_F14PIN_F15PIN_E15PIN_F16PIN_F17PIN_E18PIN_F18 PIN_C13en PIN_H8m rst sel[0] sel[1] sel[2] d[0] PIN_J9PIN_C5PIN_G18PIN_G17PIN_G16 PIN_G13(五)实验心得本实验主要是三大模块的编写,第一次的实验在老师给的参考代码下进行的,不过错误依然很多,主要有几个重点药掌握,一是首先要编写出能够计数的模块,用m 来控制模值的变化m=1 时模值为20 m=0 时模值为119;二是计数模块都是二进制计数的,而要在数码管上显示计数的话就必须进行BCD 调整,并且q 是一个是十二位的寄存器,通过把gw=q[3:0]; sw=q[7:4]; bw=q[11:8] 赋值的方法;一个个的显示在数码管上,由于clk 的频率比较快,所以可以看到三位数码管显示的值,我觉得管脚分配也是比较关键的!一开始我就把个位和百位显示的值搞反了序列信号发生和检测器设计(一)实验目的1、进一步熟悉EDA实验装置和Quartus n软件的使用方法;2 、学习有限状态机法进行数字系统设计;3、学习使用原理图输入法进行设计。

实验二:模可变计数器

实验二:模可变计数器

南昌大学实验报告学生姓名:刘志强学号:6100409222 专业班级:电子091班实验类型:验证□综合□设计■创新□实验日期:实验成绩:实验二模可变计数器设计(模23/模109)一、设计思路/原理图数字电路以前学过模值计数器的设计,而这个实验只是在原类型题加了一个模值转换的设置,再加上要求用数码管显示,所以必须把计数结果转换成BCD码,所以干脆直接使用BCD码进行模值控制。

二、实验程序(程序来源:网络)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt109 isport(clk,rst,en,M:in std_logic;cq,cqq,cqqq: out std_logic_vector (3 downto 0)) ;end cnt109;architecture behav of cnt109 isbeginprocess(clk,rst,en,M)variable cq1:std_logic_vector (11 downto 0);variable Z:std_logic_vector (11 downto 0);begincase M iswhen '0' => Z:="000000100010";when '1' => Z:="000100001000";end case;if rst='1' then cq1:=(others=>'0');elsif clk'event and clk='1' thenif en='1' thenif cq1<Z thenif cq1(7 downto 0) =153 then cq1:=cq1+103;elsif cq1(3 downto 0)=9 then cq1:=cq1+7;else cq1:=cq1+1;end if;else cq1 :=( others =>'0') ;end if;end if;end if;cq<=cq1( 3 downto 0);cqq<=cq1 ( 7 downto 4 ) ;cqqq<=cq1 ( 11 downto 8);end process;end behav转化成可调用的元:;、七段动态译码程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECL7S ISPORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END DECL7S;ARCHITECTURE one OF DECL7S ISBEGINPROCESS(D)BEGINCASE D ISWHEN "0000"=>LED7S<="00111111";WHEN "0001"=>LED7S<="00000110";WHEN "0010"=>LED7S<="01011011";WHEN "0011"=>LED7S<="01001111";WHEN "0100"=>LED7S<="01100110";WHEN "0101"=>LED7S<="01101101";WHEN "0110"=>LED7S<="01111101";WHEN "0111"=>LED7S<="00000111";WHEN "1000"=>LED7S<="01111111";WHEN "1001"=>LED7S<="01101111";WHEN OTHERS=> NULL;END CASE;END PROCESS;END ARCHITECTURE;它的模块图如下:顶层文件:对文件保存并进行编译仿真,在验证仿真正确后进行管脚绑定如下图,然后进行下载测试。

verilog实验 计数器实验报告

verilog实验 计数器实验报告

计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。

为十进制计数,数码管1计数到九后置零。

数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。

此外key4为清零键,可随时按键清零。

2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9) //个位进位判断begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 ) //十位进位判断begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;//例化调用数码管显示模块segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);//例化调用消抖模块debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input [3:0] seg_data_2; //小脚丫上第二个数码管output [8:0] seg_led_1;//在小脚丫上控制一个数码管需要9个信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput [8:0] seg_led_2;//在小脚丫上第二个数码管的控制信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial //initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字7seg[8] = 9'h7f; //7段显示数字8seg[9] = 9'h6f; //7段显示数字9endassign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assign seg_led_2 = seg[seg_data_2];endmodule3.按键消抖模块//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

实验一 模可变计数器

实验一 模可变计数器

南昌大学实验报告学生姓名:柳宇航学号:6102113025专业班级:通信工程中兴131班实验类型:□验证□综合□设计□创新实验日期:2015.10.22实验成绩:实验一模可变计数器的设计(一)实验要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现模可变计数器功能,具体要求如下:1、设置一个按键控制改变模值,按键按下时模为10-99之间(具体数值自行确定)的数,没按下时模为100-199之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。

(二)实验步骤1.选定M=0时,实现模值为17的计数;M=1时,实现模值为119的计数。

2.建立工作库文件夹,输入计数器的Verilog代码并存盘。

3.选目标器件CycloneII中的EP2C35F672C8并编译。

4.建立仿真波形文件,设置仿真结束时间和输入条件,进行波形仿真。

图1仿真波形的建立图2M=0时模17计数仿真M=0时,计数到16,灯亮M=1M=0复位M=1时,计数到118,灯亮图3M=1时模119计数仿真波形分析:当RST为高电平时,计数清零。

当RST为低电平,使能位EN为高电平时,开始计数:模控制位M为低电平时,则计数器记到16时归0后重新计数,实现模为17的计数功能;模控制位M为高电平时,则计数器记到118时归0后重新计数,实现模为119的计数功能。

当EN 为低电平时,暂停计数。

5.管脚分配clk PIN_C13en PIN_A5m PIN_B5rst PIN_A6sel[0]PIN_G18sel[1]PIN_G17sel[2]PIN_G16SG[0]PIN_F13SG[1]PIN_F14SG[2]PIN_F15SG[3]PIN_E15SG[4]PIN_F16SG[5]PIN_F17SG[6]PIN_E18SG[7]PIN_F18d[0]PIN_H106.下载测试。

下载到实验箱上测试,下推K7(M=0),可以从实验箱数码管观察到0~16模17计数。

计数器(1):Verilog常用写法

计数器(1):Verilog常用写法

计数器(1):Verilog常⽤写法 计数器是⾮常基本的使⽤,没有计数器就⽆法处理时序。

我在学习时发现市⾯上有⼏种不同的计数器写法,⾮常有趣,在此记录下来:⼀、时序逻辑和组合逻辑彻底分开1.代码1//======================================================================2// --- 名称 : Count_13// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//======================================================================78module Count_19 (10input clk ,11input rst_n ,12output reg [ 3:0] cnt13 );1415//----------------------------------------------------------------------16//-- 组合电路17//----------------------------------------------------------------------18reg [ 3:0] cnt_n ;1920always @(*)begin21if(cnt == 4'd9)22 cnt_n = 4'd0;23else24 cnt_n = cnt + 1'b1;25end2627//----------------------------------------------------------------------28//-- 时序电路29//----------------------------------------------------------------------30always @(posedge clk or negedge rst_n)begin31if(!rst_n)32 cnt <= 4'b0;33else34 cnt <= cnt_n;35end3637endmodule3839/*40//----------------------------------------------------------------------41//-- 组合电路也可以这样写42//----------------------------------------------------------------------43wire [ 3:0] cnt_n ;4445assign cnt_n = (cnt==4'd9)? 4'd0 : cnt+1'b1;4647*/2.写法1的RTL视图3.写法2的RTL视图⼆、最常见的写法1.代码1//======================================================================2// --- 名称 : Count_23// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//======================================================================78module Count_29 (10input clk ,11input rst_n ,12output reg [ 3:0] cnt13 );1415always @(posedge clk or negedge rst_n)begin16if(!rst_n)17 cnt <= 4'd0;18else if(cnt==4'd9)19 cnt <= 4'd0;20else21 cnt <= cnt + 1'b1;22end23242526endmodule2.RTL视图三.代码⽚段写法1.代码1//====================================================================== 2// --- 名称 : Count_33// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//====================================================================== 78module Count_39//---------------------<端⼝声明>---------------------------------------10 (11input clk ,12input rst_n ,13output reg [ 3:0] cnt14 );15//---------------------<信号定义>---------------------------------------16wire add_cnt ;17wire end_cnt ;1819//----------------------------------------------------------------------20//-- 0-9计数21//----------------------------------------------------------------------22always @(posedge clk or negedge rst_n)begin23if(!rst_n)24 cnt <= 'd0;25else if(add_cnt)begin26if(end_cnt)27 cnt <= 'd0;28else29 cnt <= cnt + 1'b1;30end31else32 cnt <= cnt;33end3435assign add_cnt = 1;36assign end_cnt = add_cnt && cnt==10-1;3738394041endmodule2.RTL视图四、⾃减计数器(较少⽤到)1.代码1//====================================================================== 2// --- 名称 : Count_43// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-195// --- 描述 : 模10⾃减计数器,10到0循环累减6//====================================================================== 78module Count_49//---------------------<端⼝声明>---------------------------------------10 (11input clk ,12input rst_n ,13output reg [ 3:0] cnt14 );15//---------------------<参数定义>---------------------------------------16parameter CNT_MAX = 10 ;1718//----------------------------------------------------------------------19//-- 10到0循环累减20//----------------------------------------------------------------------21always @(posedge clk or negedge rst_n)begin22if(!rst_n) begin23 cnt <= 0;24end25else if(cnt==0) begin26 cnt <= CNT_MAX;27end28else begin29 cnt <= cnt - 1;30end31end323334endmodule2.RTL视图3.仿真波形五、新学到的⼀种⾮常简洁的计数器 本以为计数器就是这样了,近来学习开源骚客《SDRAM那些事⼉》系列教程,⼜发现⼀种新的写法,对于特定功能的实现上⾮常简洁。

verilog计数器设计原理

verilog计数器设计原理

Verilog计数器设计原理1. 介绍计数器是一种常见的数字电路,用于计算和记录事件的数量。

在数字系统中,计数器通常用于生成时钟信号、控制状态机、实现频率分频等应用。

Verilog是一种硬件描述语言,可以用于设计和仿真数字电路。

本文将详细介绍与Verilog计数器设计相关的基本原理。

2. 计数器的基本概念计数器是一种能够在输入脉冲信号的作用下进行累加或递减操作的数字电路。

它通常由触发器和逻辑门组成,触发器用于存储和传递数据,逻辑门用于控制触发器的工作状态。

2.1 同步计数器同步计数器是通过时钟信号来同步各个触发器的状态转换,以实现数据的累加或递减操作。

它包含一个时钟输入端(CLK)和一个复位输入端(RST)。

2.1.1 同步正向计数器同步正向计数器是最简单的同步计数器之一,它能够在每个上升沿时钟信号到达时进行累加操作。

2.1.1.1 原理同步正向计数器由多个触发器和逻辑门组成,其中每个触发器都有一个时钟输入端和一个复位输入端。

当时钟信号的上升沿到达时,触发器的状态将根据输入信号进行更新。

具体的原理如下:1.初始化:将计数器的初始值设置为0。

2.时钟边沿检测:当时钟信号的上升沿到达时,进入下一步操作。

3.累加操作:根据触发器的当前状态进行累加操作。

如果触发器为0,则变为1;如果触发器为1,则变为0。

4.检测溢出:如果最高位触发器由1变为0,则表示计数溢出,需要将其他低位触发器进行进位操作。

2.1.1.2 Verilog代码示例以下是一个4位同步正向计数器的Verilog代码示例:module synchronous_counter(input wire clk,input wire rst,output wire [3:0] count);reg [3:0] count;always @(posedge clk or posedge rst)beginif (rst)count <= 4'b0000;elsecount <= count + 1;endendmodule2.1.2 同步递减计数器同步递减计数器是同步正向计数器的一种扩展,它能够在每个上升沿时钟信号到达时进行递减操作。

模M的可逆计数器

模M的可逆计数器

西安邮电学院FPGA实验报告-模M可逆计数器系部名称:电工院学生姓名:何慧敏(28)(04084041)专业名称:微电子班级:0802模M的可逆计数器的设计一、实验目的本实验实现模M可逆计数器的设计仿真,M为参数,完成RTL的设计和功能仿真。

二、功能定义模M可逆计数器实现的功能是:此计数器可以实现任意模M的可加可减的计数器。

任意模M定义为参数,可以通过改变M的值来实现所计的数;而可逆计数器指的是这个计数器通过某一输入来实现可加可减的计数。

三、端口说明四、时序波形上图为计数器实现加运算的计数波形上图为计数器实现减运算的计数波形五、模块框图六、仿真验证针对本实验的功能要求,我用V erilog仿真程序对主模块进行实例化来仿真验证并输出波形。

通过验证,与预想结果一致。

当in为1时,实现减法计数器;当in=0时,实现加法计数器。

七、V erilog 代码主模块:module jishu(clk,load,in,count);input clk,in,load;output count;parameter M=4;reg [M:0] count;always @(posedge clk or posedge load)if(in)beginif(load)count<=M-1;elsebeginif(count)count<=count-1;elsecount<=M-1;endendelsebeginif(load)count<=0;elsebeginif(count!=(M-1))count<=count+1;elsecount<=0;endendendmodule激励模块:module stimulate;reg clk,in,load;wire count;jishu a1(.clk(clk),.in(in),.load(load),.count(count)); initialbeginclk=1'b0;forever #5 clk=~clk;endinitialbeginin=1'b0;#200 in=1'b1;endinitialbeginload=1'b1;#8 load=1'b0;#125 load=1'b1;#133 load=1'b0;endendmodule八、设计及仿真环境设计环境及仿真环境:modelsim。

(完整版)VerilogHDL数字设计与综合(第二版)第七章课后习题答案

(完整版)VerilogHDL数字设计与综合(第二版)第七章课后习题答案

1.声明一个名为oscillate的寄存器变量并将它初始化为0。

使其每30个时间单位进行一次取反操作。

不要使用always语句。

提示:使用forever循环。

答:代码如下:reg oscillate;initialbeginoscillate<=0;forever #30 oscillate<=~oscillate;end2.设计一个周期为40个时间单位的时钟信号,其占空比为25%。

使用always和initial块进行设计。

将其在仿真0时刻的值初始化为0。

答:代码如下:reg clock;initialclock<=0;alwaysbegin#30 clock<=1;#10 clock<=0;end3.给定下面含有阻塞过程赋值语句的initial块。

每条语句在什么仿真时刻开始执行?a,b,c 和d在仿真过程中的中间值和仿真结束时的值是什么?答:仿真输出结果:4.在第3题中,如果initial块中包括的是非阻塞过程赋值语句,那么各个问题的答案是什么?答:第7章行为级建模79最终d没有输出,因为d<= #20 {a,b,c};语句执行的是先将a,b,c取值存储,在20个时间单位后将存储的值赋给d,因为b,c在初始时刻没有值,所以d值也是不确定的。

5.指出在下面的Verilog代码中各条语句的执行顺序。

其中是否含有不确定的执行顺序?a,b,c和d的最终值是什么?答:先执行a=1’b0,b=1’b1,然后执行#0 c=b,#0 d=a,执行顺序不确定,最终输出结果a=0,b=1,c=1,d=0. 6.在下面的例子中,d的最终值是什么?答:仿真输出波形如下,最终输出结果d=1。

0时刻b|c的值是1,在25个时间刻度后赋给d。

7.使用带有同步清零端的D触发器(清零端高电平有效,在时钟下降沿执行清零操作)设计一个下降沿触发的D触发器,只能使用行为语句。

提示:D触发器的输出q应当声明为寄存器变量。

用veriloghdl设计计数器

用veriloghdl设计计数器
用 Verilog HDL 设计计数器
用 Verilog HDL 设计计数器
一、 实验目的 1、 学习使用 Verilog HDL 语言 , 并学会使用进行 Quartus Ⅱ软件 编程与仿真 ; 2、 掌握数字电路的设计方法 , 熟悉设计过程及其步骤 ; 3、 培养学生的动手能力 , 能学以致用 , 为今后从事电子线路设计 打下良好基础 ; 4、 巩固加深对数电知识的理解 , 在仿真调试过程中 , 能结合原理 来分析实验现象 ;
可能就是软件的使用方法不对。
PRE
D
Q
ENA CLR
out[1]~reg0
PRE
D
Q
ENA CLR
out[0]~reg0
PRE
D
Q
ENA CLR
9' h001 --
A[8..0] B[8..0]
A dd0
+
ADDER
out~[17..9]
SEL DATAA DATAB
OUT0
9' h000 --
MUX21
out~[26..18]
的计数器 , 符合实验要求。
四、 实验总结
1、 计数器功能表
Clk 上升沿 上升沿
Reset 0 1
上升沿
1
Load X 0 1
Out 清零 置数 (data) 计数
2、 应熟知计数器的使用方法 , 并能设计出任意进制的计数器 ,
在设计时才能得心应手。 计数进制的改变 , 包括清零法 ( 同步清零与异
SEL DATAA
DATAB
OUT0
MUX21
out[8]~reg0NA CLR
9' h0D3 --
CIN 1

基于Verilog的任意模长可加减计数器设计

基于Verilog的任意模长可加减计数器设计

基于Verilog 的任意模长可加减计数器设计一、设计要求计数器是一种在时钟的触发下,完成计数功能的时序逻辑电路,输出结果由输入时钟和计数器上一状态的计数共同决定。

本设计要求实现的计数器,具有以下功能:(1)要求实现计数器工作状态的控制;(2)要求实现计数器的异步清零功能;(3)要求实现计数器递增和递减的功能;(4)要求实现计数器的计数范围(模长)任意改变;二、设计思路计数器工作状态的控制,可以设计一个使能端,在外部时钟的触发下,只有当使能端信号有效(高电平),才启动计数器的计数功能(递增或递减),否则计数器输出结果不变。

计数器的异步清零功能,可以设计一个外部输入的清零端,在外部输入信号有效(低电平)的情况下,直接清零计数器,不用等待下一个外部时钟的触发,即计数器的清零是异步的。

计数器计数方向的控制,设计一个加减可控的信号端口,在时钟的触发、异步清零无效以及计数器使能端有效的情况下,该输入端为高电平则计数器完成递增功能,低电平则完成递减功能。

实现计数器的任意模长,即进入下一个计数周期,其计数的最大值可以发生变化。

设计一个4位(最大模长为16)的输入端口,可以在当前计数周期结束,即计数器产生一个溢出信号的同时,判断该端口输入的信号是否发生变化,通过相邻两个计数周期的端口数据作异或运算,结果为高电平则代表模长发生变化,即进入的下一个计数周期,其计数最大值要发生变化。

三、程序设计本次设计使用的是Quartus 11.0开发环境,该软件没有自带仿真功能(9.0版本以后都没自带),需要使用第三方的Modelsim软件,故本设计的程序包括计数器的Verilog设计以及仿真测试需要的testbench激励文件两部分。

计数器的Verilog设计:module Prj(clk,rst_input,en,add_sub,data_input,full,data_output);input clk; // 外部时钟input rst_input; // 外部清零(异步)input en; // 计数使能input add_sub; // 计数方向input [3:0] data_input; // 计数器模长输入output reg full; // 计完当前模长output [3:0] data_output; // 计数器输出reg [3:0] current_counter;// 当前计数值(输出)reg update_length_en; // 改变模长的使能信号// 当前计数周期与上个计数周期的模长输入reg [3:0] current_clk_data_input,last_clk_data_in put;reg [3:0] counter_length; // 下个计数周期的模长reg [1:0] k;always @(posedge clk,negedge rst_input) beginif(!rst_input) // 异步清零beginfull=0;current_counter=0;endelse if(en) // 计数使能beginif(add_sub) // 加法器beginif(current_counter<(counter_length-1))begincurrent_counter=current_counter+1;full=0;endelse// 加法器计数完产生full脉冲以触发// 判断下个计数周期的模长是否变化begincurrent_counter=0;full=1; //full输出endendelse // 减法器beginif(current_counter>0)begincurrent_counter=current_counter-1;full=0;endelse // 减法器计数完begincurrent_counter=counter_length-1;full=1;endendendend//驱动当前计数输出assign data_output=current_counter;initialbegink=1; // k=1 表示启动计数器的第一个计数周期endalways @(posedge full) // 加法器/减法器完成当前周期计数// 计完当前周期(即full有效)才更新beginlast_clk_data_input<=data_input; // 上个周期的模长current_clk_data_input=data_input;//当前周期的模长update_length_en<=last_clk_data_input^current_clk_data_input;// update_length_en为更新计数器模长的使能端,// 异或运算使能端为0代表模长变化 1不变k=k+1; // k的初值为1,k变化说明计数模长更改过了if(k==2'd3)k=2;endalways @(posedge clk)beginif(update_length_en) // 使能有效计数模长变化counter_length=current_clk_data_input;elsebeginif(k>=2)// 下个周期计数器模长不变(保持上次更改的)counter_length=last_clk_data_input;if(k==1)// 整个计数器系统,最初的模长(一次没更改过)counter_length=data_input;endendendmodule测试激励文件testbench:`timescale 1 ps/ 1 psmodule Prj_vlg_tst();reg add_sub;reg clk;reg [3:0] data_input;reg en;reg rst_input;wire [3:0] data_output;wire full;Prj i1 (.add_sub(add_sub),.clk(clk),.data_input(data_input),.data_output(data_output),.en(en),.full(full),.rst_input(rst_input));parameter clk_period=10; // 时钟周期initial // 初始化使能端、清零端和时钟信号beginen=1;rst_input=1;clk=1;#(46*clk_period) en=0;#(3*clk_period) en=1;#(4*clk_period) rst_input=0;#(2*clk_period) rst_input=1;endalways #(clk_period/2) clk=~clk;initialbegin// 计数器模长分别为6 4 5 3// 左边为上一模长持续的时钟个数data_input=4'b0110;#(22*clk_period) data_input=4'b0100;#(12*clk_period) data_input=4'b0101;#(12*clk_period) data_input=4'b0011;#(5*clk_period);endinitialbegin// 计数器计数方向的改变// 左边为递增递减持续的时钟个数add_sub=1;#(9*clk_period) add_sub=0;#(10*clk_period) add_sub=1;#(13*clk_period) add_sub=0;#(4*clk_period) add_sub=1;endendmodule四、仿真结果如图1所示,最开始计数器输入的模长data_input为6,在计数方向控制端add_sub为高电平的情况下,可以从0计数到5,在add_sub为低电平的情况下,可以实现计数器的递减;当计数器模长data_input变为4的时候,先计完当前周期的模长(0到5),才开始模长为4的计数(0到3)。

模可变计数器设计

模可变计数器设计

实验二模可变计数器设计一、实验目的(1) 掌握关于简单数字电路的设计和静态数码管的设计。

(2)熟悉VHDL中进程语句的使用。

(3)掌握数码管的显示。

二、实验内容与要求(1)设计设置一位控制位M,要求M=0:模23计数;M=1:模109计数。

(2)计数结果用静态数码管显示,显示BCD码。

(3)给出此项设计的仿真波形。

三、设计原理(1)计数器能够计数的前提就是在使能端有效时,因此设计了en作为输入信号。

(2)计数器应该还要有异步清零端,因此设计了rst作为一个输入信号。

另外因为这是模可变的计数器,因此还需要m作为一个输入信号控制计数的模(3)计数器的基本工作原理是在CP:时钟脉冲输入端,每个上升沿到来时,计一个数,即自身加一,因此设计了计数的变量mmm(4)若是X模,则应该在小于X时计数,一旦记到X时,应该输出一个进位,因此需要设计一个变量limit作为参量,只有在小于limit时才可以计数,否则就应该清零。

又由于在模切换时,要求只要小于22或108就可以计数,因此limit要赋予不同的值(由m控制),且在是否执行加一前进行判断。

(5)因为一个静态数码管需要四位输出,最大计数是108,要用三个静态数码管,因此mmm要设计成一个std_logic_vector(11 downto 0)共12位,来对应三个数码管的输出。

(6)因为std_logic_vector(11 downto 0)这是二进制的加法,因此不能直接显示,否则就出现错误了,因此涉及到了二进制转换为十进制。

当低八位为10011010,前四位与后四位分别加6,即01100110;若低四位出现1010,要加6,即0110,进行调整。

(7)计数器的加一和调整是逻辑上是不同条件的相与,因此用到if语句。

四、实验器材PC机,试验箱,quartus软件五、实验程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count isport(clk,rst,en,m:in std_logic;m1,m2,m3:out std_logic_vector(3 downto 0);cout:out std_logic);end count;architecture behav of count isbeginprocess(clk,rst,en,m)variable limit:std_logic_vector(11 downto 0); ---limit用来控制是否小于22或108variable mmm:std_logic_vector(11 downto 0);--mmm用来计数beginif m='0' then limit:="000000100010"; ---给limit赋值,为m=0时为22,else limit:="000100001000"; ---m=1时为108end if;if rst='1' then mmm:=(others=>'0'); ----异步清零elsif clk'event and clk='1' then ----判断时钟上升沿if en='1' then ----判断使能端if mmm<limit then mmm:=mmm+"000000000001";---计数器加一if mmm(7 downto 0)="10011010"then mmm:=mmm+"000001100110";elsif mmm(3 downto 0)="1010"then mmm:=mmm+"000000000110";end if; ---进行加六调整else mmm:=(others=>'0');end if;end if;end if;if mmm=limit then cout<='1'; ---计数值到达模值时输出else cout<='0';end if;m1(3 downto 0)<=mmm(3 downto 0);m2(3 downto 0)<=mmm(7 downto 4);m3(3 downto 0)<=mmm(11 downto 8); ---数码管输出显示end process;end;六、实验步骤(1)建立工作库文件夹,输入设计项目原理图或VHDL代码并存盘。

模可变计数器(加减可控)的VerilogHDL程序

模可变计数器(加减可控)的VerilogHDL程序

模可变计数器的VerilogHDL程序module count(out,reset,clk,e,x,y);output [7:0]out;//设置8位输出outinput reset,clk,e,x,y;//设置时钟信号clk、清零信号reset、使能端e、控制模端x和y reg [7:0]out;always @(posedgeclk or negedge reset)beginif(reset==0)//异步清零端,不受时钟信号控制,当reset=0时,异步清零out=9'h000;elsebeginif(x==0 && y==0)//通过x和y值来改变模,此段代码的模为2if(e==0)out=9'h000;elseif(out>=1)out=9'h000;//计数最大值为1,超过清零else out=out+1;//计数if(x==0 && y==1)//此段代码的模为8if(e==0)out=9'h000;elseif(out>=7)out=9'h000;//计数最大值为7,超过清零else out=out+1; //计数if(x==1 && y==0)//此段代码的模为10if(e==0)out=9'h000;elseif(out>=9)out=9'h000;//计数最大值为9,超过清零else out=out+1;//计数if(x==0 && y==0)//此段代码的模为16if(e==0)out=9'h000;elseif(out>=15)out=9'h000;//计数最大值为15,超过清零else out=out+1;//计数endendendmodule模可变计数器(加减可控)的VerilogHDL程序module count(out,reset,clk,e,x,y,G);//增加G端,控制加法与减法output [7:0]out;inputreset,clk,e,x,y,G;reg [7:0]out;always @(posedgeclk or negedge reset)beginif(reset==0)out=9'h000;elsebeginif(G==0)//当G=0时为加法计数器beginif(x==0 && y==0)if(e==0)out=9'h000;elseif(out>=1)out=9'h000;else out=out+1;if(x==0 && y==1)if(e==0)out=9'h000;elseif(out>=7)out=9'h000;else out=out+1;if(x==1 && y==0)if(e==0)out=9'h000;elseif(out>=9)out=9'h000;else out=out+1;if(x==0 && y==0)if(e==0)out=9'h000;elseif(out>=15)out=9'h000;else out=out+1;endelse//当G=1时为减法计数器beginif(x==0 && y==0)if(e==0)out=9'h000;elseif(out==0)out=9'd1;else out=out-1;if(x==0 && y==1)if(e==0)out=9'h000;elseif(out==0)out=9'd7;else out=out-1;if(x==1 && y==0)if(e==0)out=9'h000;elseif(out==0)out=9'd9;else out=out-1;if(x==0 && y==0)if(e==0)out=9'h000;elseif(out==0)out=9'd15;else out=out-1;endendendendmodule。

Verilog代码(计数器、交通灯、串并转换)

Verilog代码(计数器、交通灯、串并转换)

1、通用二进制计数器设计一个二进制计数器(默认为8位计数器),具有加/减计数功能、异步复位、预制数功能。

代码如下:`define WIDTH 8module BinaryCounter(counter,clk,up_down,load,reset,din);output reg [`WIDTH-1:0] counter;input clk;input up_down; //1为加计数,0为减计数input reset;input load; //预置数,1有效,din输出到counterinput [`WIDTH-1:0] din;always@(posedge clk or posedge reset)beginif(reset)counter<=0;else if(load)counter<=din;else if(up_down==1)counter<=counter+1;else if(up_down==0)begincounter<=counter-1;if(counter<1) counter<=0;endendendmodule测试程序如下:`define WIDTH 8module BinaryCounter_tb;reg clk,up_down,reset,load;reg [`WIDTH-1:0] din;wire [`WIDTH-1:0] counter;integer i;initialbeginclk=0;reset=1;#5 reset=0;#3000 $stop;endalways #5 clk=~clk;/*always@(posedge clk)beginup_down={$random}%2;load={$random}%2;din={$random}%256;end*/initialbegin#5;for(i=0;i<256;i=i+3)begindin=i;#10;endendinitialbeginup_down=1;load=1;#20 load=0;#30 load=1;#30 load=0;endalways #200 up_down=~up_down;BinaryCounter bcounter(.counter(counter),.clk(clk),.up_down(up_down),.load(load),.reset(reset),.din(din));endmodule波形图如下:图1 二进制计数器波形图图2 二进制计数器波形图从图像可看出,20s-50s为加计数,50s-80s时load=1,执行置数功能,80s-200s 时up_down=1,为加计数,200s-280s时up_down=0,为减计数。

可变模计数器

可变模计数器

实验名称:可变模数计数器一、实验目的:设计一个可变模计数器,计数器由3个触发器构成,在外部控制信号S2S1的控制下分别实现模3、模5、模7和模8的计数,即(1)、S2S1=00时,实现模3计数,触发器状态依次为0→1→2→0;(2)、S2S1=01时,实现模5计数,触发器状态依次为0→1→2→3→4→0;(3)、S2S1=10时,实现模7计数,触发器状态依次为0→1→2→3→4→5→6→0;(4)、S2S1=11时,实现模8计数,触发器状态依次为0→1→2→3→4→5→6→7→0;二、实验内容:(1)、顶层原理图:(2)、各个模块程序:1、模3:(库略)entity cnt3 isport(s2,s1,en,rd:in std_logic;clk:in std_logic;q:out std_logic_vector(3 downto 0));end cnt3;architecture cnt of cnt3 issignal qn:std_logic_vector(3 downto 0);beginprocess(clk,s1,s2)beginif (rd='0' ) thenqn<=X"0";elsif (en='0') thenqn<=X"0";elsif (clk'event and clk='1' and s1='0' and s2='0') thenif qn(3 downto 0)= X"2" then qn( 3 downto 0 )<="0000"; else qn<=qn+1; end if; end if; end process; q<=qn; end cnt; 2、模5:(库略) entity cnt5 is port( s2,s1,en,rd:in std_logic; clk:in std_logic; q:out std_logic_vector(3 downto 0) ); end cnt5;architecture cnt of cnt5 is signal qn:std_logic_vector(3 downto 0); begin process(clk,s1,s2) begin if (rd='0' ) then qn<=X"0"; elsif (en='0') then qn<=X"0"; elsif (clk'event and clk='1' and s1='1' and s2='0') then if qn(3 downto 0)= X"4" then qn( 3 downto 0 )<="0000"; elseqn<=qn+1;end if; --else --qn<=X"0"; end if; end process; q<=qn; end cnt;3、模7:(库略) entity cnt7 is port( s2,s1,en,rd:in std_logic; clk:in std_logic; q:out std_logic_vector(3 downto 0) ); end cnt7;architecture cnt of cnt7 is signal qn:std_logic_vector(3 downto 0); begin process(clk,s1,s2) begin if (rd='0' ) then qn<=X"0"; elsif (en='0') then qn<=X"0"; elsif (clk'event and clk='1' and s1='0' and s2='1') then if qn(3 downto 0)= X"6" then qn( 3 downto 0 )<="0000"; else qn<=qn+1;end if;--else--qn<=X"0";end if;end process;q<=qn;end cnt;4、模8:(库略)entity cnt8 isport(s2,s1,en,rd:in std_logic;clk:in std_logic;q:out std_logic_vector(3 downto 0));end cnt8;architecture cnt of cnt8 issignal qn:std_logic_vector(3 downto 0);beginprocess(clk,s1,s2)beginif (rd='0' ) thenqn<=X"0";elsif (en='0') thenqn<=X"0";elsif (clk'event and clk='1' and s1='1' and s2='1') thenif qn(3 downto 0)= X"7" thenqn( 3 downto 0 )<="0000";elseqn<=qn+1;end if;--else--qn<=X"0";end if;end process;q<=qn;end cnt;5、decoder显示:(库略)entity decoder isport(s1,s2:in std_logic;seg:out std_logic_vector(6 downto 0);done,dtwo,dthree,dfour:instd_logic_vector(3 downto 0));end decoder;architecture dec of decoder issignal d : std_logic_vector(3 downto 0); beginprocess(s1,s2)beginif ( s1='0' and s2='0') thend <=done;elsif ( s1='1' and s2='0') thend <=dtwo;elsif ( s1='0' and s2='1') thend <=dthree;elsed<=dfour;end if;end process;with d selectseg <="0111111" when "0000","0000110" when "0001","1011011" when "0010","1001111" when "0011","1100110" when "0100","1101101" when "0101","1111101" when "0110","0000111" when "0111","1111111" when "1000","1101111" when "1001","0000000" when others;end dec;三、实验总结:通过本次实验,掌握了从顶层文件原理图开始,自上而下的设计电路的方法,感受到此方法的在各个模块程序调试时的方便,有更好的逻辑思路。

模计数器verilog报告

模计数器verilog报告

实验名称模8计数器姓名:xxx班级:xxx学号:xxxxx报告日期:xxxxxx1.实验目的练习在modelsim下编写verilog程序,熟悉modelsim运行过程,并学会用verilog编写一个模八计数器。

2.实验任务编写一个模值为八的计数器的功能模块实现模为八带清零端的(异步清零);并且编写一激励模块来测试该模块。

3.实验内容及步骤实验内容编写模8计数器模块及激励模块本次所实现的功能描述模8计数器有两个输入端,分别为clock (时钟控制输入端),和clear(异步清零端),一个输出端Q用来周期性的显示。

Clock:时钟信号,当上升沿到来时,计数器自动加一。

Clear:异步清零端,低电平到来时计数器自动清零。

Q:输出端,从000-111共八个状态。

本次实验的设计方案带有异步清零端的模8计数器共有8个状态,所以输出端Q 只需要三位(从000----111)共八个状态。

还需要一个输入端(clock )来输入时钟信号,另一个输入端(clear )来输入清零信号。

模8计数器的状态转移图如下:clockClear Q具体方案如下:1.进入modelsim后点击file ----> new ---->project.之后出现一个建立工程的对话框,键入counter_8工程名后,再在下面路径添加一个自己的文件夹。

确认后会弹出一个对话框,点击creat New File,在工程conuter_8下建立两个文件分别叫做counter_8的功能模块文件和test_counter_8的测试激励模块文件。

2.双击进入文件后编写程序3.编译,如果程序出错对程序进行修改。

之后再编译,编译成功后点击simulate进行仿真。

.4.观察仿真结果是否符合事先的设计。

不符合继续修改程序。

模8计数器的功能模块如下:module counter_8(clock,clear,q);input clock,clear;output[2:0] q;reg[2:0] q;always @(posedge clock or negedge clear)beginif(!clear)q<=0;elseq <= q +1;endendmodule测试激励如下:module test_counter8;reg clk,clr;wire[2:0] q;counter_8 counter(.clock(clk),.clear(clr),.q(q));initialclk = 0;always#100 clk = ~clk;initialbeginclr = 0;#50 clr = 1;#200 clr = 0;#50 clr = 1;endinitial$monitor($time,"clear= %b,clock= %b,q= %b",clr,clk,q); endmodule本次实验设计的结果测试结果波形如下:测试输出结果如下;4.实验总结这是第二次用modelsim编写程序,使用方面还不熟练,总是不知道点哪里。

verilog模六十计数器设计

verilog模六十计数器设计
end
endmodule
子模块 1:
module frequency1000( input cp, output reg cp1
); reg [15:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=16'b1100001101001111)//50000-1,把 50MHz 分频为 1000Hz begin cp1<=~cp1;
性能测试: 用电子表测量系统从 00 显示到 59,再到 00 的时间,确实为 30 秒(计数信号为 2Hz), 性能上达到要求。
七、 系统设计开发步骤与过程
1、 明确设计要求与拥有的资源; 2、 设计原理图; 3、 编写代码; 4、 仿真; 5、 修改代码后,重复步骤 4、5,直到仿真结果无误为止; 6、 将代码写入开发板,进行性能与功能测试; 7、 修改代码后,重复步骤 4、5、6、7,直到性能与功能都达到要求为止; 8、 撰写系统说明书与报告。
); reg [24:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=25'b1011111010111100000111111)//25000000-1,把 50MHz 分
频为 2Hz begin cp0<=~cp0; cnt<={25{1'b0}}; end
endmodule
子模块 3:
module cnt6( input tc, input cr, output reg [3:0]q6=0 ); always@(posedge tc or negedge cr) begin if(~cr) q6<=4'b0000; else if(q6>=4'b0101) q6<=4'b0000;

用verilog语言设计四位简单计算器

用verilog语言设计四位简单计算器

用verilog语言设计四位简单计算器module jsq(clk,keyin,keyout,leda,ledb,num3);input clk;input [3:0]keyin;output [3:0]keyout;reg [3:0]keyout;output [3:0]leda;reg [3:0]leda;output [3:0]ledb;reg [3:0]ledb;integer clk_klv;output [31:0]num3;always @(posedge clk) //分频clk_klv=clk_klv+1;reg [1:0]keyhang=0; //按键扫描reg [3:0]keynum=0; //最近按键的值reg keyen=0; //按键锁定作用,每次都必须重新按下才有效reg keysign=0; //当前按键的属性,0代表数字,1代表 +-*/=复位reg [7:0]delay=0; //按键消抖reg order2=0; //作用:延迟一个时钟,keyen跳变输出,确保keynum 被赋值always @(posedge clk_klv[10])beginif(order2==0)begincase({keyhang,keyin})6'b00_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h0;order2=1;end endkeysign=0;keynum=4'h1;order2=1;end end6'b00_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h2;order2=1;end end6'b00_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h3;order2=1;end end6'b01_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h4;order2=1;end end6'b01_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h5;order2=1;end end6'b01_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h6;order2=1;end end6'b01_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h7;order2=1;end end6'b10_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h8;order2=1;end end6'b10_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h9;order2=1;end end6'b10_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'ha;order2=1;end endkeysign=1;keynum=4'hb;order2=1;end end6'b11_1110: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hc;order2=1;end end6'b11_1101: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hd;order2=1;end end6'b11_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'he;order2=1;end end6'b11_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hf;order2=1;end enddefault: beginkeyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen= 0;endendcasecase(keyhang)0:keyout=4'b1110;1:keyout=4'b1101;2:keyout=4'b1011;3:keyout=4'b0111;endcaseendelsebegin keyen=1;order2=0;endendreg [2:0]order=0; //当前状态integer num1=0,num2=0,num3=0; //第一个,第二个,结果reg [3:0]sign; //+-*/reg [7:0]lednum=100; //显示的数字reg [3:0]in_num=0; //限制显示的数字位,限制在2为:0~99 always @(posedge keyen)begincase(order)0: if(keysign) begin sign[3:0]=keynum[3:0];order=order+1; in_num=0;end //在没有按下+-*/之前会存储数字elseif(num1<10000)begin num1=num1*10+keynum;lednum=num1;in_num=in_num+1; end1: if(keysign) begincase(sign)//在没有按下=号之前会存储数字4'ha:num3=num1+num2;4'hb:num3=num1-num2;4'hc:num3=num1*num2;4'hd:num3=num1/num2;endcaselednum=num3+0;order=order+1;endelse if(num2<10000)begin num2=num2*10;num2=num2+keynum;lednum=num2;in_num=in_num+1; endendcaseif(keynum==4'hf)beginorder=0;num1=0;num2=0;num3=0;lednum=100;end //复位endalways @(*) //显示函数if(lednum<=99)beginleda=lednum/10;ledb=lednum%10;endelsebeginleda=15;ledb=15;endendmodule。

实验六Verilog设计分频器计数器电路答案

实验六Verilog设计分频器计数器电路答案

实验六V e r i l o g设计分频器计数器电路答案The following text is amended on 12 November 2020.实验六V e r i l o g设计分频器/计数器电路一、实验目的1、进一步掌握最基本时序电路的实现方法;2、学习分频器/计数器时序电路程序的编写方法;3、进一步学习同步和异步时序电路程序的编写方法。

二、实验内容1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset (低电平复位),输出clockout为4个clock周期的低电平,4个clock周期的高电平),文件命名为。

2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为。

3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为。

4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为。

5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。

三、实验步骤实验一:分频器1、建立工程2、创建Verilog HDL文件3、输入10分频器程序代码并保存4、进行综合编译5、新建波形文件6、导入引脚7、设置信号源并保存8、生成网表9、功能仿真10、仿真结果分析由仿真结果可以看出clockout输出5个clock周期的低电平和5个clock的高电平达到10分频的效果,设计正确。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模可变计数器设计(一)实验目的1、进一步熟悉实验装置和Quartus n软件的使用;2、进一步熟悉和掌握EDA 设计流程;3 、学习简单组合、时序电路的EDA 设计;4、学习计数器中二进制码到BCD 码的转换技巧;5、学习实验装置上数码管的输出方法。

(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA 实验装置上实现模可变计数器功能,具体要求如下:1 、设置一个按键控制改变模值,按键按下时模为10-99 之间(具体数值自行确定)的数,没按下时模为100-199 之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。

(三) 主要仪器设备3、微机 1 台4、QuartusII 集成开发软件 1 套5、EDA 实验装置 1 套(四) 实验步骤主要有三个模块1:一个模20 和模119 的计数器2:数码管的显示3:BCD 的调整源程序:module count (clk,m,en,rst,a,sel,SG,d);input clk,m,en,rst;output [7:0] SG;output [2:0] sel;output a;(* synthesis, keep *) reg clk1;(* synthesis, keep *) wire [3:0] gw,sw,bw;/*(* synthesis, keep *) */reg [3:0]a;reg [11:0] q;reg [11:0] model;reg [7:0] cnt,SG;reg [2:0] sel;reg [0:0]d;output [0:0]d;always @(posedge clk) begin cnt=cnt+1;if (cnt==200) begin clk1=1'b1; cnt=0; endelse clk1=1'b0; //200 分频,CLK 为数码管扫描频率,CLK1 为计数频率if (sel<2) sel=sel+1; else sel=0; end //sel 为数码管选择always @(sel) begincase (sel)0: a=bw; //0 数码管为百位1: a=sw; //1 数码管为十位2: a=gw; //2 数码管为个位default: a=0;endcasecase (a)0:SG<=8'b00111111; 1:SG<=8'b00000110;2:SG<=8'b01011011; 3:SG<=8'b01001111;4:SG<=8'b01100110; 5:SG<=8'b01101101;6:SG<=8'b01111101; 7:SG<=8'b00000111;8:SG<=8'b01111111; 9:SG<=8'b01101111; //8 段译码值default: SG=8'b11111111;endcase endalways @(m)if (m) model=12'b000000100000; // 模值20else model=12'b000100011001; // 模值119assign gw=q[3:0];assign sw=q[7:4];assign bw=q[11:8];always @(posedge clk1,negedge rst)beginif (!rst) q=0;else if (en)beginif (q<model)beginif (gw==9) begin q=q+7; if (sw==9) q=q+96; end //BCD 调整else q=q+1;endelse q=0;endendalways @(q)if(qvmodel) d<=0; else d<=1; endmodule波形仿真:iimulatioin WaveformsSimulation sode : TillingA.B Master Time Sar19L9 ns ■[POinler: 39.3^1 us Imeival:39.32 us Stan :End:he. 14 us 37.. 42 UH 33. 7 us39.9B LLS4k 26 us54 us 4X B2 usP 1 i111■Clk1是计数频率,每来一个 clk1信号q 计数一次Simula ion Wa^efor™ Sinulatlon lode: Tiling如图所rst=1有效时开始计数 clk 为扫描频率sel=0时数码管显示百位 a=0 sel=1时数码管显示十位 a=1 sel=2时数码管显示个位 a=3 m=1模20计数器 m=0模119计数器管脚分配:* I HI Ik * Jij19.3ns J hRoirter.6fl.H us Interval.68.09 UE Slarl End.lane<>0□ S&elk<>1B clkl曲+ 0-L玮tT IF Len^1.nCH- 1±1 sei尬1.田Q B i辭El 勿u 3.dM68.14 us63.16 us ■6E. 18 usI63.22 us 68. 24 usW [1] X [3]连[01 X [1] X [3]迪[0] X [1] X [3] ® [o] X [1] X [3]址[0] II :MasierTiiTiB Bar.68.12 usIIISG[0] SG[1] SG[2] SG[3] SG[4] SG[5] SG[6] SG[7] clkPIN_F13PIN_F14PIN_F15PIN_E15PIN_F16PIN_F17PIN_E18PIN_F18 PIN_C13en PIN_H8m rst sel[0] sel[1] sel[2] d[0] PIN_J9PIN_C5PIN_G18PIN_G17PIN_G16 PIN_G13(五)实验心得本实验主要是三大模块的编写,第一次的实验在老师给的参考代码下进行的,不过错误依然很多,主要有几个重点药掌握,一是首先要编写出能够计数的模块,用m 来控制模值的变化m=1 时模值为20 m=0 时模值为119;二是计数模块都是二进制计数的,而要在数码管上显示计数的话就必须进行BCD 调整,并且q 是一个是十二位的寄存器,通过把gw=q[3:0]; sw=q[7:4]; bw=q[11:8] 赋值的方法;一个个的显示在数码管上,由于clk 的频率比较快,所以可以看到三位数码管显示的值,我觉得管脚分配也是比较关键的!一开始我就把个位和百位显示的值搞反了序列信号发生和检测器设计(一)实验目的1、进一步熟悉EDA实验装置和Quartus n软件的使用方法;2 、学习有限状态机法进行数字系统设计;3、学习使用原理图输入法进行设计。

(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA 实验装置上实现一个串行序列信号发生器和一个序列信号检测器的功能,具体要求如下:1、先用设计0111010011011010序列信号发生器,其最后6BIT 数据用LED 显示出来;2、再设计一个序列信号检测器,检测上述序列信号,若检测到串行序列“11101”则输出为“ 1 ”,否则输出为“ 0”;(三)主要仪器设备1、微机1台2、QuartusII 集成开发软件1套3、EDA 实验装置1套(四)实验步骤主要两部分1 :序列信号发生器设置q<=16'b0111010011011010;q[0]<=q[15];Q<=q[15]; q[15:1]<=q[14:0] ;通过循环移位串行输出2:序列信号检测器状转移态图一共有六个状态分别为S = 5'd00000,A = 5'd00001,B = 5'd00011,C = 5'd00110,D = 5'd01101,E = 5'd11010;源程序:module xulie(clk,rst,z,Q,led);in put clk,rst; output Q,z; output [4:0] led; reg [4:0] led; reg [4:0] state; reg Q,z; reg [4:0] a; reg [15:0] q; parameter S = 5'd00000,A = 5'd00001,B = 5'd00011,C = 5'd00110,D = 5'd01101,E = 5'd11010;always @(posedge clk)beginif(rst==0) begi n q<=16'b0111010011011010; endelse begi nq[0]<=q[15];Q<=q[15]; q[15:1]<=q[14:0]; endendalways @(posedge clk)beginif(state==D && Q==1)begi n z<=1;led<=5'b11101;e ndelse begi n z<=0;led<=5'b00000;e nd endalways @(posedge clk or n egedge rst)if(!rst)beginstate<=S;e ndelsecasex(state)S: if(Q==1)state<=A;else A:state<=S;if (Q==1) state<=B;else B:state<= S;if (Q==1) state<=C;else C:state<=S;if(Q==0) state<=D;else D: state<=C; if(Q==1)state<=E;else E: state<=S; if(Q==0)state<=S;else state<=A; default: state<=S; endcase en dmodule波形仿真simulation VVavefo 『rn£ SinijJation node i Tilling当rst=1011101001101101011101z=1并且同时使11101序列显示在五个led 灯上(五)实验心得做实验之前准备了很多,实验时还是出现了很多问题,一开始序列信号发生器在第一个周期 之后就会多出一个 0 即输出 00111010011011010,原因在于 Q<=q[15]; q[15:1]<=q[14:0];q[0]<=Q;因为q[0]<=Q 需要一个时钟的上升沿才能执行,所以就会多输出一个0;其次状态转移图也是关键,需要记忆六个不同的状态;做这个实验让我学到了 casex 的一些用法;进一步了解编写verilog 语言NarieQ elkB led"8 rstzj .14 III 1卜9,9 ns 士 Pioinier52.15 nsrrtetvoJ;32 55 ns sterf Ops End 0 ps0 psI. 28 us 2. 56 us S. B4 UE 1 ・ i5. 12 us6. 4 ue7. ca usi8. us L0. 24 us 11. 52 ucin j Jnsr11l! J —1 1-L1 _|_L ~I1 1―L—J~~[ J-1_1- ~L0000J 111 oi 1Cooooo-1 1 'MesierTime BarIII。

相关文档
最新文档