barriers / 阅读 / 详情

有关C语言编程的题!急!!!

2023-08-01 18:24:20
共2条回复
gitcloud

PWM软件

PWM控制器会产生一连串脉冲。通常需要规定脉冲的周期和宽度。占空比被定义为脉冲宽度与周期的比值。PWM有着广泛的应用,大多数情况下用于控制模拟电路。因为数字信号连续变化的速率相对较快(当然取决于信号周期),因此最终会形成一个用来控制模拟设备的平均电压值。当PWM脉冲流应用于马达时,马达的转速就能正比于占空比(从0%到100%)。如果占空比增加,马达转速就会提高,反之,如果占空比减小,马达的转速随之也会降低。

用软件编写这样一个PWM控制器是相对比较容易的任务,但它有助于我们简明扼要地描述如何用Verilog设计硬件。清单1给出了PWM的C代码。

清单1:完全用软件实现的位脉冲PWM控制器。

void

pwmTask(uint32_t pulse_width, uint32_t period)

{

uint32_t time_on=pulse_width;

uint32_t time_off=period-pulse_width;

while (1)

{

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

input

input [7:0]

input

output [7:0]

clr_n;

clk;

in;

a;

out;

//信号声明

reg [7:0]

wire

out;

a;

//实现带异步清除的寄存器

always @(posedge clk or negedge clr_n)

begin

if (clr_n==0) // could also be written if (!clr_n)

out<=0;

else

out<=in;

end

//连续赋值

assign a=!out[0];

endmodule

粗略地看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硬件

编写存储器映射硬件模块的首要任务是以软件方式决定寄存器映射图。在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

input [31:0]

input

input

input

input

output [31:0]

output

clk;

write_data;

cs;

write_n;

addr;

clr_n;

read_data;

pwm_out;

reg [31:0]

reg [31:0]

reg [31:0]

reg

reg [31:0]

wire

period;

pulse_width;

counter;

off;

read_data;

period_en, pulse_width_en; //写使能

// 定义period和pulse_width寄存器的内容

always @(posedge clk or negedge clr_n)

begin

if (clr_n==0)

begin

period<=32"h 00000000;

pulse_width<=32"h 00000000;

end

else

begin

if (period_en)

period<=write_data[31:0];

else

period<=period;

if (pulse_width_en)

pulse_width<=write_data[31:0];

else

pulse_width<=pulse_width;

end

end

// period和pulse_width寄存器的读访问

always @(addr or period or pulse_width)

if (addr == 0)

read_data=period;

else

read_data=pulse_width;

always @(posedge clk or negedge clr_n)

begin

if (clr_n==0)

counter<=0;

else

if (counter>=period-1)

counter<=0;

else

counter<=counter+1;

end

always @(posedge clk or negedge clr_n)

begin

if (clr_n==0)

off<=0;

else

if (counter>=pulse_width)

off <= 1;

else

if (counter==0)

off<=0;

else

off<=off;

end

assign period_en = cs & !write_n & !addr;

assign pulse_width_en = cs & !write_n & addr;

//PWM输出

assign pwm_out=!off;

endmodule

首先是端口说明,接着是内部信号说明。构成PWM软件控制接口的存储器映射型寄存器被声明为reg。该代码行只允许以32位的方式访问这些存储器映射型寄存器。如果需要8位或16位访问,就必须将寄存器分割成4个8位寄存器,并增加字节使能信号逻辑。用Verilog代码实现这一功能是非常简单的。always块中已赋过值的所有信号都被声明为reg类型。声明为wire类型的信号是period和pulse_width寄存器写入使能信号。这些信号使用连续赋值语句进行赋值。

ardim

楼上会不会搜索啊?搜了这么个

相关推荐

高电平、下降沿的定义分别是什么?

1、数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。硬件描述语言在Verilog等硬件描述语言中,用“posedge”表示“上升沿”。2、数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。硬件描述语言在Verilog等硬件描述语言中,用“negedge”表示“下降沿”。扩展资料控制器高电平与低电平区别1、控制器上标识的高低电平为刹车,高电平一般规定为5V以上,低电平为0V左右。2、在不同电路上的电压值不相同,如果是5V供电的数字电路,高电平就是5V,或接近5V。低电平就是‘无",就是0V或接近0V。3、控制器的高电平是通,低电平是控。参考资料来源:百度百科——高电平参考资料来源:百度百科——上升沿参考资料来源:百度百科——下降沿
2023-08-01 13:26:011

谁知道Verilog 中的posedge用法是什么?为什么有这两个错误?

你那样写有语法错误很正常啊,posedge一般都用于always @()的括号内,表示THR的上升沿到来时,运行always快内的程序,你如果需要用到THR的上升沿来作为判断条件,建议你这样写代码:reg THR1;reg THR2;always @ ( posedge clk_1M or negedge reset_n ) if( !reset_n ) begin THR1 <= 1"b0; THR2 <= 1"b0; end else begin THR1 <= THR; THR2 <= THR1; endalways @( posedge clk_1M ) if( count1>=20000 || ( THR1 && !THR2 ) ) count1 <= 0;else count1 <= count1 + 1;
2023-08-01 13:26:141

always@(posdge clk) 什么意思

就是时钟沿上升时触发always后面的语句。always后面是敏感值列表。posedge是正沿的意思,你拼错了。clk应该是时钟的周期信号吧。表示时钟的上升沿到来时下面的语句就触发了。
2023-08-01 13:26:231

为什么再用verilog编写程序时,always@(posedge clock or reset)语句是非法的?

posedge是时序逻辑,单单一个reset是组合逻辑两者必须分开书写。
2023-08-01 13:26:334

使用Verilog如何设计一个上升沿检测器?

Posedge用来作为时钟使用的。相当于触发器的时钟输入端。要检测信号上升沿的话,可以采用以下方法:always@(posedge clk or negedge rst)if(!rst)begin sign_1b <= 1"b0; sign_2b <= 1"b0; endelsebegin sign_1b <= sign; sign_2b <= sign_1b; endalways@(posedge clk or negedge rst)if(!rst)sign_pos <= 1"b0;else if (sign_2b && !sign_1b)sign_pos <= 1"b1;elsesign_pos <= 1"b0;
2023-08-01 13:26:432

verilog if条件中能用posedge作为判断条件吗

不可以的。。。。。
2023-08-01 13:26:513

可综合verilog posedge和negedge可以出现在一个always中吗

对于不同的信号可以,但不可以同时采集同一个信号的posedge和negedge.
2023-08-01 13:27:004

verilog always@(posedge clk or posedge clrb)表示 清零端是高电平有效吗

always@(posedge clk or posedge clrb)表示 清零端是高电平有效,posedge代表上升沿;negedge代表下降沿;代表clrb异步复位信号,如果没用posedge clrb,为同步复位信号,就是需要时钟跳变时,输出才发生变化。触发器复位有高电平有效,也有低电平有效。
2023-08-01 13:27:081

verilog hdl中有了posedge和negedge为什么还要用脉冲边沿检测?。

谁说不能呢?只要PS2协议允许,完全可以使用啊
2023-08-01 13:27:272

verilog中没有always的@如何理解?

我想问一下多个@(posedge clk)语句一起是并行执行还是串行执行的呢?
2023-08-01 13:27:352

verilog中reg变量赋初始值问题

不能,可不可以把完整的程序,发给我看下!!
2023-08-01 13:27:445

verilog语言中,如何给变量赋初值,并能保证赋初值的语句与后面的always是顺序执行的。

initial是初始化时使用的吧?你可以这样,先定义变量的位宽,再做别的always@(触发条件)begin 具体语句end
2023-08-01 13:28:024

verilog 原语门级原语有哪些

(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。建立可综合模型的原则要保证VerilogHDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。(2)不使用10。(3)不使用循环次数不确定的循环语句,如forever、while等。(4)不使用用户自定义原语(UDP元件)。(5)尽量使用同步方式设计电路。(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。(12)避免混合使用上升沿和下降沿触发的触发器。(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。(14)避免在case语句的分支项中使用x值或z值。不能综合的语句:1、initial只能在testbench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)2、eventsevent在同步testbench时更有用,不能综合。3、real不支持real数据类型的综合。4、time不支持time数据类型的综合。5、force和release不支持force和release的综合。6、assign和deassign不支持对reg数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。7、forkjoin不可综合,可以使用非块语句达到同样的效果。8、primitives支持门级原语的综合,不支持非门级原语的综合。9、table不支持UDP和table的综合。10、敏感列表里同时带有posedge和negedge如:always@(posedgeclkornegedgeclk)beginend这个always块不可综合。11、同一个reg变量被多个always块驱动12、延时以开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。如:a=10b;这里的10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;13、与X、Z的比较可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。
2023-08-01 13:28:101

verilog中posedge后面都是时钟clk,能不能跟其他信号呢?

是的,在a的上升沿,c就会变为1
2023-08-01 13:28:191

Verilog negedge与posedge的区别

一个下降沿 一个表示上升沿
2023-08-01 13:28:271

verilog中if的判断语句可以写(posedge 某信号)吗?

不能那么写。send_start比较长打一拍就行了reg send_start_d;always@(posedge CLK_SP) send_start_d <= send_start;这样上升沿可以写成if(send_start_d == 1"d0 && send_start == 1"d1)就是上一拍还是0这一拍是1我们就认为他是上升沿了
2023-08-01 13:28:341

用Verilog编写时,always@(a,b,posedge cp) 为什么不对啊?正确的应该怎么写?

你好!综合丹甫草晃禺浩碴彤厂廓器无法给你综合成对应的器件,@posedgecp综合成上升沿触发的寄存器,不能和电平信号写在同一敏感列表中正确的应该是always@(*)或者always@(posedgecpornegedgerst_n)前者对应组合逻辑,后者对应时序逻辑打字不易,采纳哦!
2023-08-01 13:28:411

verilog 中为何要用基础时钟侦查其他时钟信号的上升沿,而不用posedge直接测

最好不要用运算之后的信号来做一个模块的输入时钟,因为信号的时钟要求非常高的质量,对于duty-cycle, jitter, skew(占空比、抖动、偏移)都有非常高的要求。但是组合逻辑生成的时钟可能会有毛刺等等对于时钟是非常致命的东西。除非你非常有把握,否则不建议这样的设计方法。说明:在时序电路设计中,尽量使用全局时钟,而不要用由全局时钟衍生出来的信号。希望可以帮到你
2023-08-01 13:28:511

verilog如何实现:每按一次按键,将输入的值存储进缓存器中?用posedge被当成时钟

肯定不是这样用的,我建议你首先学习按键防抖是怎么做的。百度一大把一大把的源码,看懂了按键是怎么处理的再做进一步的设计,你这样的代码属于未入门级别的。
2023-08-01 13:29:091

设计一个可控的100进制可逆计数器

always@(posedgeclkorposedgeplusorposedgeminusorposedgepause)晕..楼上的瞎写..楼主可参看我的空间,里面对关于一些HDL方面的知识点的列举.谢谢modulecnt100(clk,clr,plus,minus,high_b,//10位数low_b//个位数);inputclk;inputclr;inputplus;inputminus;output[3:0]high_b;//10位数output[3:0]low_b;//个位数reg[3:0]high_b;//10位数reg[3:0]low_b;//个位数always(posedgeclk)beginif(clr)low_b<=4"b0;//同步清零elseif(plus)//加beginif(low_b==4"b1001)low_b<=4"b0;elselow_b<=low_b+1;endelseif(minus)//减beginif(low_b==4"b0)low_b<=4"b1001;elselow_b<=low_b-1;endelse//暂停low_b<=low_b;endalways(posedgeclk)beginif(clr)high_b<=4"b0;//同步清零elseif(plus&&(low_b==4"b1001))//进位beginif(high_b==4"b1001)high_b<=4"b0;elsehigh_b<=high_b+1;endelseif(minus&&(low_b==4"b0000))//借位beginif(high_b==4"b0)high_b<=4"b1001;elsehigh_b<=high_b-1;endelse//暂停high_b<=high_b;endendmodule
2023-08-01 13:29:183

verilog中d触发器的异步高电平复位是什么意思

异步高电平复位就是复位信号只要变高电平就执行复位操作,如果是同步的话就要看复位信号是否在时钟有效沿为高电平。
2023-08-01 13:29:262

根据下面原理图写出Verilog HDL程序

module not_1(clk,din,clr,qout); input clk,din,clr; output qout; reg qout; always@(posedge clk or posedge clr) begin if(clr) qout <= 1"b0; else qout <= ~din; end endmodule
2023-08-01 13:29:362

modelsim仿真出现错误 $hold( posedge WENeg:10 ns, CENeg:10 ns, 1 ns ) 什么意思?

应该是hold违例,修改修改input的输入延时,修改修改clk周期,试试也行
2023-08-01 13:29:442

用Verilog HDL设计十进制减法计数器

modulecount#(parametersize=4)(inputclock,load_n,clear_n,updown,input[size-1:0]load_data,outputreg[size-1:0]q);always@(negedgeload_n,negedgeclear_n,posedgeclock)if(!load_n)q<=load_data;elseif(!clear_n)q<=0;elseif(updown)q<=(q+1)%10;elsebeginif(q==0)q<=9;elseq<=q-1;endendmodule
2023-08-01 13:29:533

verilog 变量怎么赋初值

不知道你是要做验证还是设计,如果是验证的话,不要求可综合,可以简单写成:always@ (posedge a)begin @ (negedge b) c<=...;end如果要想可综合的话,需要用状态机类似的概念,即设一个标志位,当a上升沿来是,把它赋值为1,当它为1且b下降沿来时,给c赋值,并将它赋值回0:并且,如果a,b不是时钟的话,不推荐使用posedge的写法采用下面的方法比较好:reg a_dly,b_dly; //a,b的1始终delay信号wire a_pos,b_pos; //a,b的上升沿抓取信号assign a_pos = a & !a_dly;assign b_pos = b & !b_dly;reg flag;//标志位always@(posedge clk or posedge rst)begin if(rst) begin a_pos <= 1"b0; b_pos <= 1"b0; end else begin a_pos <= a; b_pos <= b; endendalways@(posedge clk or posedge rst)begin if(rst) flag <= 1"b0; else if(a_pos) flag <= 1"b1; else if(b_pos) flag <= 1"b0;endalways@(posedge clk)begin if(flag & b_pos) c<=....end把flag赋值回为0很重要,不然逻辑有问题。用3段状态机写就是parameter IDLE = 2"h0;parameter WAIT_B_POS = 2"h1;parameter GET_C = 2"h2;reg [1:0] cs; //current statereg [1:0] ns; //next state//1段 状态转换always@(posedge clk or posedge rst)begin if(rst) cs <= IDLE; else cs <= ns;end//2段 状态迁移always@(a_pos or b_pos or cs or ns)begin ns = XX; //设置ns为xx case(cs) IDLE: begin if(a_pos) ns = WAIT_B_POS;//用阻塞赋值 else ns = IDLE; end WAIT_B_POS:begin if(b_pos) ns = GET_C; else ns = WAIT_B_POS; end GET_C:begin ns = IDLE; end default:; endcaseend//3段 赋值always@(posedge clk or posedge rst)begin if(rst) c<=1"b0; else begin if(ns == GET_C) c <= .....; endend用状态机写的好处就是不用加标志位了,但是个人觉得没有必要这样写。能力有限,错误请指正
2023-08-01 13:30:131

verilog编程中当多个always出现时 先运行那个?例如下面的例子是一个半周期的方波信号

是并行运行的,ALWAYS 语句 里面的内容是串行运行的!
2023-08-01 13:30:233

quartus ii 中问题,always @(posedge CLK) begin : CNT11B_LOAD// 11位可预置计数器 怎么解释啊。

TN就是预置数,每次从预置数开始计数,到11"h7FF时重新置数,并输出1,否则输出0。这样下来,计数的周期就是(11"h7FF-TN)次,而不是固定的11"h7FF次或者其他值。预置数就是起到计数器周期可控的目的。而输出SPKS是只在每次计数结束时才置一,也就是使输出信号周期可控。
2023-08-01 13:30:351

求大神帮忙解释这个程序verilog

module trafficlight(clk,clr,out1,out2,Q_R1,Q_R2,Q_G1,Q_G2,Q_Y1,Q_Y2); //定义模块以及端口input clk,clr;output Q_R1,Q_R2,Q_G1,Q_G2,Q_Y1,Q_Y2;output [3:0]out1,out2;reg [4:0]State,NextState; //定义状态机 按你下面的话这应该要定义成【5:0】reg [4:0]cnt; //计数器reg [4:0]count,cout; 计数器reg Q_R1,Q_R2,Q_G1,Q_G2,Q_Y1,Q_Y2; 应该是洪绿黄灯了reg flag=0,fout=0; 标志位和输出parameter IDLE=6"B000001,State_A=6"b000010,State_B=6"b000100,State_C=6"b001000,State_D=6"b010000;always@(posedge clk)beginif(cnt==5"b00000)begincnt<=5"b11110;flag<=~flag;endelsecnt<=cnt-1;endalways@(posedge clr or posedge clk) 定义状态机起始状态beginif(clr)State<=State_A;else State<=NextState;endalways@(State or cnt or flag)begincase(State) 状态机转移程序IDLE: begin NextState<=State_A; 这里初始状态应该是idle吧end State_A:beginif((cnt==5"b00101)&&(flag==0))NextState<=State_B;else NextState<=State_A;endState_B:beginif((cnt==5"b00000)&&(flag==0))NextState<=State_C;else NextState<=State_B; end State_C:beginif((cnt==5"b00101)&&(flag==1))NextState<=State_D;else NextState<=State_C;endState_D:beginif((cnt==5"b00000)&&(flag==1))NextState<=State_A;else NextState<=State_D;end default:NextState<=IDLE;endcaseendalways@(State)begincase(State) 根据各状态得到交通灯的输出状态值IDLE:beginQ_R1<=0;Q_R2<=0;Q_G1<=0;Q_G2<=0;Q_Y1<=0;Q_Y2<=0;endState_A:beginQ_R1<=0;Q_R2<=1;Q_G1<=1;Q_G2<=0;Q_Y1<=0;Q_Y2<=0;endState_B:beginQ_R1<=0;Q_R2<=1;Q_G1<=0;Q_G2<=0;Q_Y1<=clk;Q_Y2<=0;endState_C:beginQ_R1<=1;Q_R2<=0;Q_G1<=0;Q_G2<=1;Q_Y1<=0;Q_Y2<=0;endState_D:beginQ_R1<=1;Q_R2<=0;Q_G1<=0;Q_G2<=0;Q_Y1<=0;Q_Y2<=clk;endendcaseendassign out1=cnt/10;assign out2=cnt%10; 如果是assign赋值 out1和out2需要定义成wire类型endmodule交通灯程序应该还是蛮多的时间有限 以上注释仅供参考吧!!
2023-08-01 13:31:051

verilog语言程序问题,求大神来解答,奖励丰厚!8*8点阵问题

module a21(row,line,clk);input clk;output[0:7] row,line;reg[0:7] row,line;integer a,j,j1,i,i1;always @(posedge clk)beginif(i>9999999)beginj<=~j;i<=0;endelsei<=i+1; ---计数器endalways @(posedge clk)beginif(i1>9999)beginj1<=~j1; --生成时钟,一般不建议这样写i1<=0;endelsei1<=i1+1; ---计数器10000endalways@(posedge j) ---可以理解为状态机beginif(a>=3)a<=0;elsea<=a+1;endalways@(posedge j1)begincase(a)0:beginrow=8"b11100111;line=8"b00011000;end ----case里面这些就是根据不同的a值输出灯的高低电平 1:beginrow=8"b11000011;line=8"b00111100;end 2:beginrow=8"b10000001;line=8"b01111110;end 3:beginrow=8"b00000000;line=8"b11111111;endendcaseendendmodule
2023-08-01 13:31:122

用verilog程序设计一个具有异步清零功能的24进制计数器

module counter_24 ( input clk, input rst, input cnt_in ,output reg cnt_out );reg [4:0] cnt;always @ (posedge clk or posedge rst_n) beginif (rst) cnt <= 5"b0;else if (~cnt_in) cnt <= cnt;else if (cnt == 5"b10110) cnt <= 5"b0;else cnt <= cnt + 1"b1;endalways @ (posedge clk or posedge rst) beginif (rst) cnt_out <= 1"b0;else if (cnt_in && cnt == 5"b10110) cnt_out <= 1"b1;else cnt_out <= 1"b0;endendmoduleinput add; //为1时加操作input dec; //为1时减操作output [5:0] counter;reg [5:0] counter;always @(add and dec) beginif(add && !dec) beginif(counter == 6"d38) begincounter <= 6"d0;扩展资料:有一种记数系统便是24进制的,其中1~24有专门的符号来表示,大于24的数便可以像24进制那样写成多位数,如tokaputokapuu014bgayepoko代表24进制中的P0(552)。malapu talusupuu014bga talu代表24进制中的H2G(9856)。为了避免混淆1和I,0和O,故跳过字母I、O,18~~23分别计作J、K、L、M、N、P。比如:16计作G、22计作N。等于或大于24的数字计作:24→10、25→11、26→12??25→11中标粗体的1代表24。同一个数字在不同的位置代表的值是不一样的。参考资料来源:百度百科-二十四进制
2023-08-01 13:31:291

Verilog 中的posedge用法是什么?为什么有这两个错误?

posedge一般都用于always@()的括号内,表示THR的上升沿到来时,运行always快内的程序。如果需要用到THR的上升沿来作为判断条件,建议你仔细点写代码。
2023-08-01 13:32:011

什么是高电平?

1、数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。硬件描述语言在Verilog等硬件描述语言中,用“posedge”表示“上升沿”。2、数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。硬件描述语言在Verilog等硬件描述语言中,用“negedge”表示“下降沿”。扩展资料控制器高电平与低电平区别1、控制器上标识的高低电平为刹车,高电平一般规定为5V以上,低电平为0V左右。2、在不同电路上的电压值不相同,如果是5V供电的数字电路,高电平就是5V,或接近5V。低电平就是‘无",就是0V或接近0V。3、控制器的高电平是通,低电平是控。参考资料来源:百度百科——高电平参考资料来源:百度百科——上升沿参考资料来源:百度百科——下降沿
2023-08-01 13:32:081

什么是高电平,什么是下降沿?

1、数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。硬件描述语言在Verilog等硬件描述语言中,用“posedge”表示“上升沿”。2、数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。硬件描述语言在Verilog等硬件描述语言中,用“negedge”表示“下降沿”。扩展资料控制器高电平与低电平区别1、控制器上标识的高低电平为刹车,高电平一般规定为5V以上,低电平为0V左右。2、在不同电路上的电压值不相同,如果是5V供电的数字电路,高电平就是5V,或接近5V。低电平就是‘无",就是0V或接近0V。3、控制器的高电平是通,低电平是控。参考资料来源:百度百科——高电平参考资料来源:百度百科——上升沿参考资料来源:百度百科——下降沿
2023-08-01 13:32:211

语句always@(posedgeCLKornegedgeRST)表示含义为

语句always@(posedgeCLKornegedgeRST)表示含义为 A.在CLK的上升沿或者RST的下降沿执行操作B.在CLK的上升沿或者RST的下降沿执行操作C.在CLK的上升沿或者RST的上升沿执行操作D.在CLK的下降沿或者RST的下降沿执行操作E.在CLK的下降沿或者RST的上升沿执行操作F.在CLK的上升沿、RST的下降沿同时发生时执行操作G.在CLK的下降沿、RST的上升沿同时发生时执行操作H、在CLK的高电平或者RST的低电平执行操作正确答案:在CLK的上升沿或者RST的下降沿执行操作;在CLK的上升沿或者RST的下降沿执行操作
2023-08-01 13:32:351

verilog语法问题

我没见过这样的用法,但是我看到number_of_edges,应该是边沿的数目,repeat(number_of_edges) @( negedge clk)的意思应该是说经过number_of_edges个clk下降沿,同理,neg_clocks(3)的意思应该是经过三个clk下降沿之后,.......... 。 其实就是延迟,等同于#3.
2023-08-01 13:32:453

如何用verilog编写50MHZ分频到1MHZ的代码。急~~

50分频即可
2023-08-01 13:32:553

verilog 问题

我也遇到同样的错误,最后发现是后面的 if 前面忘了加 else !写C语言习惯了。
2023-08-01 13:33:052

关于quartus ii的一段英文帮助的翻译

这有点难度 。。加点分更多人来
2023-08-01 13:33:244

verilog中assign a=data; always @(posedge clk) begin b=data; end 为什么a的值比b的要早一个时钟周期

@(posedge clk)这表示等待一个事件(clk上升沿)的发生因此当data在clk上升沿发生变化(即data的变化是发生在clk上升沿这一事件之后)assign语句使a立即取得data的值而always执行到@(posedge clk)则会挂起 直到事件(下一个clk上升沿)发生 才继续执行后面的语句 因此b的赋值(不管阻塞还是非阻塞赋值都是)比a晚了一个时钟
2023-08-01 13:33:331

Verilog hdl 中always @(negedge clrn or posedge clk) 是什么意思?

negedge clrn 为:当clrn下降沿时触发posedge clk 为:当clk上升沿时触发合起来negedge clrn or posedge clk就是当clrn下降沿时触发或当clk上升沿时触发always @( )是关键词,意思就是当()里的内容发生时执行下面的程序
2023-08-01 13:33:432

verilog语法求助

你是不是错误提示:Error(10200):VerilogHDLConditionalStatementerrorat……:cannotmatchoperand(s)intheconditiontothecorrespondingedgesintheenclosingeventcontrolofthealwaysconstruct这是因为,你的“always@(posedgeclkornegedger_est)”表明在clk上升沿或r_est下降沿这两个敏感事件发生时always语句块得以触发;而always中的if条件语句必须至少有一个条件指向其中一个敏感事件(边界标识符);所以写成“if(r_est)else”就会出错。你可以把“always@(posedgeclkornegedger_est)”改为“always@(posedgeclkorposedger_est)”再编译试试,应该就没问题了。你右键该错误点击“Help”里是这么说的:CAUSE:InaconditionalstatementatthespecifiedlocationinaVerilogDesignFile(.v),youspecifiedaconditionthatQuartusIIIntegratedSynthesiscannotusetoclassifytheedgesintheenclosingalwaysconstruct"seventcontrol.Whenaneventcontrolcontainsmultipleedges,QuartusIIIntegratedSynthesisdistinguishestheasynchronouscontrolsignalsfromtheclockbyanalyzingtheconditionalstatementsinthealwaysconstruct.Forexample,thefollowingcodefragmentcontainsanalwaysconstructwhoseeventcontrolcontainsthreeedges---twoasynchronousresetsandaclock.always@(posedgeclkorposedgerst1orposedgerst2)beginif(rst1||rst2)q<=1"b0;elseq<=d;endQuartusIIIntegratedSynthesisusestheifconditiontoidentifythetwoasynchronousresetsand,byimplication,theclock.Foredgeclassification,QuartusIIIntegratedSynthesisrequiresthataconditionfallintooneoftwocategories.Itcanrefertoasingleedgeidentifier(tomatchposedgeevents)oritscomplement(tomatchnegedgeevents),forexample,rst1,!rst1,rst1==1"b1,rst1==1"b0.ItcanalsoORtwoormoreexpressionsthateachrefertoasingleedgeidentifieroritscomplement,forexample,(rst1||rst2),(!rst1||!rst2).Youcanreceivethiserrorifyourconditiontestsforthewrongpolarity,orifittestsforthevalueofavariablethatisnotanedgeintheeventcontrol.Forexample,tomatchaposedgerstevent,theconditionmustberstorrst=1"b1.Finally,youcanreceivethiserrorifyouareattemptingtouseasingleconditionexpressiontotestforbothanasynchronousreset/setandasynchronousreset/setcondition.Thefollowingcodefragmentcontainsanexampleofanillegalconditionexpression:always@(posedgeclkorposedgerst)beginif(rst||sync_rst)q<=1"b0;elseq<=d;endQuartusIIIntegratedSynthesisgeneratesthiserrormessagewhencompilingthisdesignbecauseitcannotmatchsync_rsttoanedgeonthesensitivitylist.其中关键的语句我摘译一下,不一定译得准确,不过大体意思我想你应该可以了解了:原因:……指定了一个条件,QuartusII综合器不能够将该条件用于在封闭的always结构的事件控制中对边界进行区分。当一个事件控制中包含多重边界,QuartusII综合器通过分析always结构中的条件语句来对时钟和异步控制信号加以区分。……QuartusII综合器采用if条件来鉴别两个异步reset信号,并隐含地鉴别了clock信号。为了分类的需要,QuartusII综合器需要有一个条件落入两个类别之一。它可以指向一个单独的边界标识符(以匹配posedge事件)或它的补语(以匹配negedge事件),例如,rst1,!rst1,rst1==1"b1,rst1==1"b0。它也可以是OR两个或的表达式,其中每一个指向一个单独的边界标识符或它的补语……当你的条件测试发现错误极性,或者它测试变量的值,但该值在事件控制中并不是一个边界时,你会接到这个错误。例如,为了匹配一个posedgerst事件,条件必须是rst或rst=1"b1。编译错误时多看看Help,讲得很详细~
2023-08-01 13:33:511

Error (10170): Verilog HDL syntax error at fdiv.v(2) near text "input"; expecting "

问题在于你的第一句后没有加分号,就是input前面 加分号 。修改后module fdiv(clk_in,out1,out2,out3) ;input clk_in; output reg out1,out2,out3; integer cnt1=0,cnt2=0; always@(posedge clk_in) begin if(cnt1<9) begin out2<=out2; cnt1=cnt1+1; endelse begin out2=~out2; cnt1=0; end end always@(posedge out2) begin if(cnt2<9) begin out3<=out3; cnt2=cnt2+1; end else begin out3=~out3; cnt2=0; end end endmodule
2023-08-01 13:33:581

verilog语言的三态双向驱动

inout [0:7] bidir ; //这个bidir 就是8位的输入.temp=temp+1; //这句语句是在让变量temp自加运算,temp加1,赋给自己; //相当于c语言的temp++
2023-08-01 13:34:063

fpga verilog的按键消抖问题

always@(posedge clk) beginkey_temp<=key_temp0;key_temp0<=key;end=============================这一段因为用的是非阻塞幅值<=,这样在第一个时钟key的最新值只能传到key_temp0,等到下个周期才能传到key_temp那里。这样如果key的值不能持续超过两个时钟,那么就不可能出现key_temp=key的情况出现。这样就能达到消抖的作用。想必下文肯定有相关判定按键有无有效的语句。====================================s1:if((key_temp[0]==0)&(key_temp==key_temp0)&(key_temp0!=key)) 这两段代码是什么意思呀?====================================if后面的这段意思只要条件同时满足:key_temp[0]==0、key_temp==key_temp0、key_temp0!=key才会跳转到状态s2,否则回到s1的状态。
2023-08-01 13:34:152

verilog HDL 当S信号发生变化时,产生一个脉冲。

……reg S_delay;output A;always@(posedge CLK) S_delay <= S;assign A = S ^ S_delay;……
2023-08-01 13:34:233

verilog分频

分出来的占空比不是一比一哦,先写出来1S的,其它几个就都一样了啊
2023-08-01 13:34:312

在用verilog编写三段式状态机的时候,我看网上很多地方都是提到格式如下:always @ (posedge clk or negedg

都用时序逻辑的话,功能上没有什么区别,只是速度会慢一半。第三段假如case里边用CS的话,与第二段要么相矛盾,要么多此一举。
2023-08-01 13:34:382

verilog语言“$hold(posedge clk ,D, &&& ~nrst,2)

一般出现在specify block中,它的意思是检测这个hold是否违例的前提是nrst为负。
2023-08-01 13:34:592

请大神注释一段verilog HDL的分频程序

module gen_divd(reset,clkin,clkout); input reset,clkin; output clkout; parameter divdWIDTH=1; //参数定义 parameter divdFACTOR=1; reg clkout; reg [divdWIDTH:0] cnt; //2位计数器,最大记到3 always @ (posedge reset or posedge clkin) if(reset) // 高电平复位 begin cnt<=0; //计数器清零 clkout<=0; //输出时钟清零 end else begin cnt<=cnt+1"b1; //计数开始,来一个上升沿记一次数 if(cnt==(divdFACTOR-1)) //当cnt等于1 begin cnt<=0; //计数器清零 clkout<=~clkout; //输出时钟翻转一次,就是简单的2分频//假设开始clkout时低电平,当cnt计数到1(clkin刚好一个周期)时,clkout就翻转,变成高电平,clkout一个周期,相当于clkin的2个周期,实现2分频 end endendmodule
2023-08-01 13:35:071

verilog中我写这样的语句报错 always(posedge clk or negedge reset) begin if(reset) ..... end

always后面要加@
2023-08-01 13:35:173