verilog 语言 if(en) a<=b;else a<=a; 与 if(en) a<=b; 有什么区别?特别是综合出来有什么不同?求教
作者&投稿:延瑗 (若有异议请与网页底部的电邮联系)
一般来说en就是使能,是一个线网变量
en为1的时候执行if下面的语句,en为0时跳出这个if语句
测试激励怎么加的?
always@(negedge cp)
begin
q<=4'b000000; // 此处没有复位信号,容易跟下面的q+1引起冲突
if(en&(q<6'b100110))q<=q+1;
else q<=4'b000000;
end
可以试试删除q<=4'b000000;
always@(negedge cp)
begin
if(en&(q<6'b100110))
q<=q+1;
else
q<=4'b000000;
end
或者添加一个rst复位信号
always@(negedge cp or negedge rst)
begin
if(!rst)
q<=4'b000000;
esle if(en&(q<6'b100110))
q<=q+1;
else
q<=4'b000000;
end
(1)
always @(en or b) begin
if(en) a = b;
else a = a;
end
(2)
always @(en or b) begin
if(en) a = b;
end
(3)
always @(posedge clk) begin
if(en) a <= b;
else a <= a;
end
(4)
always @(posedge clk) begin
if(en) a <= b;
end
(1)和(2)是有区别的。(1)综合得到的是纯粹的组合逻辑,(2)除了综合出组合逻辑外,还会综合出latch,也就是锁存器。
(3)和(4)从功能上看没有区别。如果都不做时钟gating的话,他们综合出来的电路应该是一样的;如果都做时钟gating的话,他们综合出来的电路也应该是一样的。
不知道这样讲你是否明白。
qq522161657
主要的区别的是,第一个不会出现锁存器,只是一个寄存器;第二个综合时会出现锁存器的。
锁存器是用于存储数据来进行交换,使数据稳定下来保持一段时间不变化,直到新的数据将其替换。
寄存器与锁存器都是用来暂存数据的器件,在本质上没有区别,不过寄存器的输出端平时不随输入端的变化而变化,只有在时钟有效时才将输入端的数据送输出端(打入寄存器),而锁存器的输出端平时总随输入端变化而变化,只有当锁存器信号到达时,才将输出端的状态锁存起来,使其不再随输入端的变化而变化。
苗朱复代: 一般来说en就是使能,是一个线网变量 en为1的时候执行if下面的语句,en为0时跳出这个if语句
古冶区19496914840: verilog 语言 if(en) a<=b;else a<=a; 与 if(en) a<=b; 有什么区别?特别是综合出来有什么不同?求教 - ?
苗朱复代: 你看下面的代码(1) always @(en or b) begin if(en) a = b; else a = a; end(2) always @(en or b) begin if(en) a = b; end(3) always @(posedge clk) begin if(en) aelse a end(4) always @(posedge clk) begin if(en) a end(1)和(2)是有区别的.(1)综合得到...
古冶区19496914840: Verilog语言如何描述以下的计数器 当输入使能en为高时开始计数, 计到9时就不计了,且9之后计数器全是0 - ?
苗朱复代: module yibufuwei(EN, CLK, RESET, Din, count, Q); input EN; input CLK; input RESET; input [3:0] Din; output count; output [3:0] Q; reg [3:0] Q1; reg count; assign Q=Q1; always@(posedge CLK or negedge RESET)begin if(!RESET) Q1=0; //RESET...
古冶区19496914840: verilog 里面 在always 下有两个 if 语句 就出现如下错误 高手请进 - ?
苗朱复代: verilog对边沿触发的逻辑有规定:你写了negedge rst,就必须在always内的第一个if中写~rst的逻辑.就是你把if(en)写在rst下面就好了.这样综合时推断的是一个异步复位的寄存器. ------------------------------- 为什么语法要这么规定我也不知道.@()里面的第一项是时钟定义,第二项和第三项(如果有的话)是异步复位和异步置位,必须写在第一个if, else if里面(如果有第三项的话).你说的其他按键就一个ctrl了啊,if(en)写在ctrl前面就行了.
古冶区19496914840: verilog 语言 if(en) a<=b;else a<=a; 与 if(en) a<=b; 有什么区别?特别是综合出来有什么不同?求教 - ?
苗朱复代: 你看下面的代码(1)always @(en or b) begin if(en) a = b; else a = a;end(2)always @(en or b) ...
古冶区19496914840: Verilog程序always里有两个敏感参数,用if区分,编译出错 - ?
苗朱复代: 其实你的这个程序在modelsim里面仿真是没有问题的,能够实现你想要的功能.但是在某些编译环境中,要求,当always的敏感变量为两个或以上时,其中一个可以作为时钟,而另外一个必须出现在always中的第一个if的条件中,否则不能综合.在你的程序里,如果always中先对clr信号使用if,之后再在每个情况中判断en是否为高,那么应该就可以通过了.祝好~
古冶区19496914840: 移位寄存器 verilog代码 - ?
苗朱复代: module shift( in, clk, en, clr, set, out ); input [7:0]in; //input data input clk; //input clock input en; //input enable high enable input clr; //input clear low enable input [2:0]set; //input set :set num of shift bit output [7:0]out; always@(posedge clk or negedge ...
古冶区19496914840: VHDL中if语句怎么用啊? begin if en='1' then Q0<=p0 xor p4 xor 0; c0<=p0 and p4;编译时这个说有错误 - ?
苗朱复代: 修改后的程序,错误主要在于: 1、if 语句必须在进程里面才可以使用 2、你的一个输出co没有对它进程赋值 3、你的一个输入P7没有用到 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;...
古冶区19496914840: verilog编写以下程序,为什么cnt1递增到24999就不会再递增,en也不能赋值为1,求大神指点! - ?
苗朱复代: if语句是有顺序的,从上到下,当满足其中一个条件后就会执行对应的语句.当cnt1等于24999后,满足第一个else if条件,所以e...
古冶区19496914840: verilog中if else和case语句有什么区别 - ?
苗朱复代: 功能差不多,if else有优先级,case没有,一般类别少的用if else,类别多用case. 例如: if (data == 1) out <= 2'b01; else if (data1 == 1) out <= 2'b10; else out <= 2'b00; case (addr[3:0]) 4'h0: out = 0; 4'h1: out = 1; 4'h2: out = 2; 4'h3: out = 3; 4'h4: out = 4; default: out = 0; endcase