cnt13仿真时序编译
㈠ 请问VHDL中如果我设置13位比如verilog中data[12:0] 我想用16进制或者10进制在VHDL中要怎么写
假设cnt是13位的,cnt:std_logic_vector(12 DOWNTO 0);,对cnt清零可以写成cnt <= (OTHERS => '0');
因为16进制与二进制之间是2^4关系,而13位是无法表示成十六进制的,所以不能用十六进制来表示。另外,std_logic_vector类型与integer类型是两种不同的数据类型,而十进制需要用integer类型来表示(integer类型是一个32位的数据类型)。如果非要将一个十进制数赋给一个std_logic_vector类型,则必须经过类型转换函数才行。这是因为VHDL是强类型语言。
㈡ 跪求:《数字频率计的设计》 原理,方框图,电路图!
摘 要:文中运用VHDL语言,采用Top To Down的方法,实现8位数字频率计,并利用Isp Expert集成开发环境进行编辑、综合、波形仿真,并下载到CPLD器件中,经实际电路测试,该系统系统性能可靠。
关键词:EDA;VHDL;数字频率计;波形仿真;CPLD�
1引言
VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(The Institute of Electrical and Electronics Engineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(Top to Down)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD器件中去,从而实现可编程的专用集成电路(ASIC)的设计。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体的性能和可靠性。
本文用VHDL在CPLD器件上实现一种8 b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。具有体积小、可靠性高、功耗低的特点。
2数字频率计的基本设计原理
数字频率计的原理框图如图1所示。他主要由5个模块组成,分别是:脉冲发生器电路、测频控制信号发生器电路、计数模块电路、锁存器、译码驱动电路。�
当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。�
3设计实现�
3.1系统方框图的划分和结构设计
根据数字频率计的系统原理框图(图1虚线框内),设计系统的顶层电路图如图2所示。�
图2中TESTCTL为测频控制信号发生器。TESTCTL的计数使能信号TSTEN能产生一个1 s宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制:当TSTEN高电平时允许计数、低电平时停止计数。
REG32B为锁存器。在信号Load的上升沿时,立即对模块的输入口的数据锁存到REG32B的内部,并由REG32B的输出端输出,然后,七段译码器可以译码输出。在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
CNT10为十进制计数器。有一时钟使能输入端ENA,用于锁定计数值。当高电平时允许计数,低电平时禁止计数。图2中将8个十进制计数器CNT10级联起来实现8 b十进制计数功能。
SEVYM为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。
为了实现系统功能,测频控制信号发生器TESTCTL、计数器CNT10、锁存器REG32B存在一个工作时序的问题,设计时需要综合考虑。
图3给出了系统的工作时序。图3中CLK是由图1中脉冲发生器产生的频率为1 Hz的标准时钟信号,当测频控制信号发生器TESTCTL的TSTEN端为高电平时允许计数、低电平时停止计数,在停止计数期间,测频控制信号发生器TESTCTL的Load端产生一个上升沿,将计数器在前1 s的计数值锁存进32 b锁存器REG32B中,并由8个7段译码器将计数结果译出稳定显示。锁存信号之后经过半个CLK周期,测频控制信号发生器TESTCTL的CLR�_CNT端产生一个上升沿,对计数器进行清零。为下1 s的计数操作做准备。
为了产生这个时序图,首先有一个D触发器构成二分频器,在每次时钟CLK的上升沿到来使其值翻转。D触发器的输出高电平正好是1 s,因此可以作为测频控制信号发生器TESTCTL的TSTEN端,用来控制计数。而Load信号正好是TSTEN端信号的翻转。在计数结束后半个CLK周期,CLK与TSTEN都为低电平,这时CLR�_CNT产生一个上升沿作为清零信号。�
3.2各模块的VHDL源程序
采用VHDL描述数字频率计的电路时,根据图2所示的数字频率计系统顶层电路图,按照自顶向下的设计思路,编写各个模块的VHDL源程序,最后再对各个模块进行组合,编写顶层描述的VHDL源程序,由于篇幅所限,本文仅介绍数字频率计顶层描述的源程序,各个模块的VHDL源程序编写较为简单,可以根据各自的功能,相应地写出。
8位数字频率计的顶层描述VHDL源程序为:
4系统的功能仿真
Lattice公司推出的Isp Expert的数字系统设计软件,是一套完整的EDA软件,能够对所设计的数字电子系统进行时序仿真和功能仿真。
采用Lattice公司推出的Isp Expert EDA软件,对所编写数字频率计VHDL源程序进行编译、逻辑综合,自动地把VHDL描述转变为门级电路。然后进行波形仿真,编写的仿真测试向量文件如下(为仿真简单起见,测试一个66 Hz的周期信号):
仿真后得到的波形图如图4所示,从仿真波形上看测量的结果是准确的。还可以进一步修改测试向量文件,进行波形仿真。最后通过编程电缆,将所设计的内容下载到CPLD器件中,进行实物仿真。�
5结语
本文介绍了使用VHDL语言设计数字频率计的方法,并下载到CPLD中组成实际电路,这样可以简化硬件的开发和制造过程,而且使硬件体积大大缩小,并提高了系统的可靠性。同时在基本电路模块基础上,不必修改硬件电路,通过修改VHDL源程序,增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。
㈢ 新手求教,quartus 时序仿真cnt_rst出现毛刺,代码如下
搜一下:新手求教,quartus
时序仿真cnt_rst出现毛刺,代码如下
㈣ 简易交通灯控制器
本设计中选用目前应用较广泛的VHDL硬件电路描述语言,实现对路口交通灯系统的控制器的硬件电路描述,在Altera公司的EDA软件平台MAX+PLUSⅡ环境下通过了编译、仿真,并下载到CPLD器件上进行编程制作,实现了交通灯系统的控制过程。 关键词:EDA;VHDL;控制器;CPLD
引言
EDA技术是用于电子产品设计中比较先进的技术,可以代替设计者完成电子系统设计中的大部分工作,而且可以直接从程序中修改错误及系统功能而不需要硬件电路的支持,既缩短了研发周期,又大大节约了成本,受到了电子工程师的青睐。
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难。因此,在设计中采用EDA技术,应用目前广泛应用的VHDL硬件电路描述语言,实现交通灯系统控制器的设计,利用MAXPLUSⅡ集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。
交通灯系统控制器设计要求
路口交通灯控制系统与其他控制系统一样,划分为控制器和受控电路两部分。控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。
按照路口交通运行的实际情况,在本系统中,设定系统的工作情况如下。
路口交通灯控制系统的东西路有交通灯R(红)、Y(黄)、G(绿);东西人行安全通道灯:RXR(红)、RXG(绿)。南北路有交通灯:r1(红)、y1(黄)、g1(绿);南北人行安全通道灯:rxr1(红)、rxg1(绿),所有灯均为高电平点亮。设置15s的通行时间和5s转换时间的变模定时电路,由预置输入整数cnt决定是模15还是模5,输入逻辑cx是用来决定计数到4时清零还是到14时清零。Clk是外部提供的基准秒脉冲信号。x0、x1、x2、x3是由控制器输出的表示计数时间的四位二进制数。图1是该系统控制器的符号框图。
控制器的程序设计
* 控制器的ASM图
根据系统设计要求,得到控制器的ASM图,如图2所示。在这里,所有输入信号均为高电平有效。该ASM图反映了交通灯系统的不同状态的转换过程及持续时间。
* 控制器的VHDL程序设计
根据所分析的系统的ASM图,结合系统的设计要求,用VHDL语言对各个模块进行编程,最后形成顶层文件,在MAX+PLUSⅡ环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。需要说明的是,在进行程序编译时,要先从底层程序开始,所有底层程序都正确后,才能开始顶层程序的编译。这是因为顶层程序是对底层程序的概括,它是把底层程序各个模块连接起来,就相当于把每个模块的功能汇聚到一起,实现整个系统的控制功能,所以底层程序的正确与否,关系到顶层程序的运行结果。
在控制器的程序设计中,在定义结构体时,有两种程序设计方法均可以通过编译及仿真,但在进行时序分析时结果却不同。
(1)如果这样定义:
...
ARCHITECTURE con1_arc of con1 IS
SIGNAL current_state:state;
BEGIN
...
在进行程序调试时,均通过了编译及仿真,但在进行时序分析中,却出现了不按设定的计数顺序工作的结果:14, 13, 2,1, 0...。经过反复修改调试,对程序进行了修改,如(2)所定义的。
(2)
ARCHITECYTURE con1_arc OF con1 IS
SIGNAL current_state:state;
SIGNAL TEMP_STATE:state;
...
TEMP STATE<=current_state;
BEGIN
...
在这种设计方法中,多定义了一个信号变量,从而使得程序能按设定的状态14,13,12...进行转换。通过这个实例,可以看出EDA技术作为电子设计工具的功能修改及调试的方便快捷,即不需要硬件电路的支持就可以找到问题所在并进行修改,体现了它的优越性。
硬件电路实现
根据交通灯系统的控制要求,图3所示为本系统的硬件电路图。该电路包含了1个CPLD芯片,2个七段LED数码显示器,20个分别表示各个方向上的红、黄、绿灯,以及相应的限流电阻。这个电路与其他控制方法相比,所用器件可以说是比较简单经济的。经过实验,实现了预定的交通灯系统的控制功能。
或单片机,PLC教材上有实例.
㈤ modelsim时序仿真时** Error: (vsim-SDF-3894) cnt_v.sdo: Compiled SDF file was not found.
提示你反标的sdf文件没有找到,查查你指定的路径下有没有对应的sdf文件,或者查看一下你的sdf文件格式是不是正确!
㈥ quartus 时序仿真输出全是不定态
clr既没有赋予初值,也没有有效的波形激励,导致初始状态s0无法确定,所以输出都无法确定。
㈦ verilog开发,功能级仿真,综合后仿真,时序仿真有什么区别
╮(╯▽╰)╭为什么总是纠结在这些上面呢。
1。所谓功能仿真,就是你的code写完之后,你要实现的功能是否能work,比如你写一个计数器,让他计数到10,翻转,同时清零,重新计数,这就会是一个分频电路。那么功能仿真就是要验证你这个功能是否是正确的,别tmd计数到9就翻了,或者计数到10没有清0。功能仿真当然不考虑竞争冒险和门电路延迟,你只是看你的功能是否正确,你考虑延迟干嘛。
2。所谓综合后仿真,就是你刚才编出来的代码,第一个是否能被综合工具综合,如果可以综合,此时综合工具就会把相关的延迟信息加入进来,以判断你的代码是否会有什么问题,比如你要求的始终太快,cnt计数就会有问题了。此时的综合工具如synplify,xst,quatus(针对FPGA,如果是IC,会用dc等别的),如果你用quatus去跑跑仿真,就会比较清晰的看到延迟信息已经加入进来了
3。时序仿真是在IC上的了,各种timing问题了。FPGA就直接上板了,做那么多仿真毛用,直接上板,各种timing问题等着去解吧。
4。Modesim一般只用来功能仿真,它不能综合。
㈧ 跪求 用VHDL语言设计模为330,,BCD码输出计数器(时序仿真),求高手解答。
我来贡献一个通用的BCD counter
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.ALL;
ENTITY bcd_cnt_1r0 IS
GENERIC(num_bit : INTEGER := 3; -- 位数
norm : INTEGER := 331); -- 模
PORT(clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
cnt_en : IN STD_LOGIC;
bcd_out : OUT STD_LOGIC_VECTOR(num_bit * 4 - 1 DOWNTO 0));
END bcd_cnt_1r0;
ARCHITECTURE rtl OF bcd_cnt_1r0 IS
CONSTANT ONES : STD_LOGIC_VECTOR(num_bit DOWNTO 0) := (OTHERS=>'1');
SIGNAL next_cnt : UNSIGNED(num_bit * 4 - 1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL curr_cnt : UNSIGNED(num_bit * 4 - 1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL carray_in : STD_LOGIC_VECTOR(num_bit DOWNTO 0):=(OTHERS=>'0');
FUNCTION dec2unsigned (dec_val: INTEGER; dec_bit : INTEGER) RETURN UNSIGNED IS
VARIABLE result: UNSIGNED(dec_bit*4 - 1 DOWNTO 0);
VARIABLE tmp : INTEGER := dec_val;
VARIABLE tmp2 : INTEGER := 0;
BEGIN
FOR i IN 1 TO dec_bit LOOP
tmp2 := (tmp/10);
result(i*4-1 DOWNTO (i-1)*4) := TO_UNSIGNED(tmp - tmp2 * 10, 4);
tmp := tmp2;
END LOOP;
RETURN result;
END dec2unsigned;
CONSTANT unsign_norm : UNSIGNED(num_bit * 4 - 1 DOWNTO 0) := dec2unsigned(norm, num_bit);
TYPE dec_array_type IS ARRAY(num_bit-1 DOWNTO 0) OF UNSIGNED(3 DOWNTO 0);
SIGNAL debug_dec_cnt_bit : dec_array_type :=(OTHERS=>(OTHERS=>'0'));
BEGIN
reg_proc: PROCESS(clk)
BEGIN
IF RISING_EDGE(clk) THEN
IF rst = '1' THEN
curr_cnt <= (OTHERS=>'0');
ELSE
IF cnt_en = '1' THEN
IF next_cnt = unsign_norm THEN
curr_cnt <= (OTHERS =>'0');
ELSE
curr_cnt <= next_cnt;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
bcd_out <= STD_LOGIC_VECTOR(curr_cnt);
cnt_proc: PROCESS(curr_cnt, next_cnt, carray_in, rst)
BEGIN
carray_in(0) <= '1';
IF rst = '1' THEN
next_cnt <= (OTHERS=>'0');
carray_in( num_bit DOWNTO 1) <= (OTHERS=>'0');
ELSE
bits_loop: FOR n IN 0 TO num_bit-1 LOOP
IF carray_in(n) = '1' THEN
IF curr_cnt(4*(n+1)-1 DOWNTO 4*n) = 9 THEN
next_cnt(4*(n+1)-1 DOWNTO 4*n) <= (OTHERS=>'0');
carray_in(n+1) <= '1';
ELSE
next_cnt(4*(n+1)-1 DOWNTO 4*n) <= curr_cnt(4*(n+1)-1 DOWNTO 4*n) + 1;
carray_in(n+1) <= '0';
END IF;
------------------------------
ELSE
next_cnt(4*(n+1)-1 DOWNTO 4*n) <= curr_cnt(4*(n+1)-1 DOWNTO 4*n);
carray_in(n+1) <= '0';
END IF;
END LOOP;
END IF;
END PROCESS;
debug_gen: FOR n IN 0 TO num_bit -1 GENERATE
debug_dec_cnt_bit(n) <= curr_cnt((n+1)*4 -1 DOWNTO n*4);
END GENERATE;
END rtl;
㈨ 关于C语言编程的问题:一段代码在VC++软件运行中会出现两种结果
我若是你,就将下面的代码换成 for(i=0;i<200;i++) { a4=a[i]/1000; a3=a[i]%1000/100; a2=a[i]%100/10; a1=a[i]%10; if(a4%2==1 && a3%2==1 && a2%2==1 && a1%2==1) { b[cnt]=a[i]; cnt++; } } int t[4],cnt=0; char flag; for(i=0;i<200;i++) { temp=a[i]; flag=1; for(j=0;j<4;j++) { t[j]=temp%10; if(t[j]%2==0) { flag=0; break; } temp=temp/10; } if(flag) { b[cnt]=a[i]; cnt++; } }
㈩ Modelsim-Altera SE时序仿真,一信号某几位始终处于高阻态
看你写的代码感觉很多语法问题,一般情况下输入端没有被赋予初值在modelsim仿真时就会是高组态,对比A和B,A是高组态,B不是,就噶西安你的testbench代码中给A赋值时,“ ’ ”号后面的的进制数写成大写了,你可以将他们都改成小写试试。你的输出高组态,我觉得是div代码中” output reg [27:0]C; “这句代码有问题,C是输出应该是wire型,而不是寄存器型,说到这里你在testbench代码中也将A和B用成reg型,感觉这样不合理。不知道能不能解决你的问题,但是帮你看看语法,可以再仿真试试,你自己也可以在仿真编译的时候留意下编译栏看有没有报错或者警告。如果还有问题请留言。