描述
实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,数据传输无气泡,不能由于本模块的设计原因产生额外的性能损失。
电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;ready_a用来指示本模块是否准备好接收上游数据,ready_b表示下游是否准备好接收本模块的输出数据;clk是时钟信号;rst_n是异步复位信号。
接口时序示意图
输入描述:
input clk ,
input rst_n ,
input [7:0] data_in ,
input valid_a ,
input ready_b
输出描述:
output ready_a ,
output reg valid_b ,
output reg [9:0] data_out
代码框架:
module valid_ready(
input clk ,
input rst_n ,
input [7:0] data_in ,
input valid_a ,
input ready_b ,
output ready_a ,
output reg valid_b ,
output reg [9:0] data_out
);
endmodule

【总时序】
本模块在valid_a和ready_a握手(都拉高)后,开始接收上游下行的数据;(ready_a是输出,受制于其他变量)
本模块接受数据时,valid_b始终保持低。(并且ready_a也拉低,不允许输入)
接收完四个数据并累加后,valid_b拉高(表示data_out有效),等待ready_b握手。
ready_b握手(拉高)后,data_out被赋予值。此时ready_a应立刻拉高,进行下一轮读取和累加。
【两次握手】
1.输入握手:valid_a和ready_a。(ready_a等待valid_a)
2.输出握手:valid_b和ready_b。(valid_b等待ready_b)
【握手间的相互制约】
输出握手后,ready_a立刻拉高。
//计数器控制块。计四拍。00 01 10 11 -> 00 01 10 11 -> ......
reg [1:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) cnt <= 2'b00;
else if (valid_a && ready_a) cnt <= cnt + 1'b1; //接受数据
else cnt <= cnt; //不接受数据
end
/*
ready_a 和 valid_b:
1. 他们是 OUTPUT,需要我们手动去拉高拉低。
2. 他们控制时序,互为判断依据。
*/
//ready_a拉高的情况:1.ready_b拉高时,本模块数据下行,此时立刻允许新的data输入,立刻拉高ready_a。(保证无气泡传输)
// 2.valid_b拉低时,本模块还在接受数据,ready_a持续高。
assign ready_a = (ready_b || !valid_b) ? 1 : 0;
//valid_b拉高拉低的情况: 1.本模块接收完数据时:valid_b拉高。(此时即在等待ready_b握手,进行下行输出)
// 2.valid_b和ready_b握手后,打一拍,valid_b再次拉低,准备接受新的数据。
//【valid_b:指示data_out数据是否有效,即指示“输入是否完成”和“输出是否完成”】
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) valid_b <= 1'b0;
else if(valid_a && ready_a && (cnt == 2'b11)) //1.输入结束,等待握手
valid_b <= 1'b1;
else if(valid_b && ready_b) //2.输出握手后
valid_b <= 1'b0;
end
//数据写入和写出
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
data_out <= 0;
else if((cnt == 2'b00) && valid_a && ready_a && ready_b)
//接收完毕,等待ready_b拉高。ready_b一旦拉高,数据写出到data_out。
//同时开始下一周期的写入。
data_out <= data_in;
else if(valid_a && ready_a) //输入握手:正在接收上游数据,累加
data_out <= data_out + data_in;
//注意:这两个else if不能调换位置!!!【md看了半天】
end
【注意:else if从上到下进行顺序判断,如果不进行嵌套,条件多的必须写在上面。否则用else if嵌套。】
`timescale 1ns/1ns
module valid_ready(
input clk ,
input rst_n ,
input [7:0] data_in ,
input valid_a ,
input ready_b ,
output ready_a ,
output reg valid_b ,
output reg [9:0] data_out
);
//计数器控制块。计四拍。00 01 10 11 -> 00 01 10 11 -> ......
reg [1:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) cnt <= 2'b00;
else if (valid_a && ready_a) cnt <= cnt + 1'b1; //接受数据
else cnt <= cnt; //不接受数据
end
/*
【总时序】
本模块在valid_a和ready_a握手(都拉高)后,开始接收上游下行的数据;(ready_a是输出,受制于其他变量)
本模块接受数据时,valid_b始终保持低。(并且ready_a也拉低,不允许输入)
接收完四个数据并累加后,valid_b拉高(表示data_out有效),等待ready_b握手。
ready_b握手(拉高)后,data_out被赋予值。此时ready_a应立刻拉高,进行下一轮读取和累加。
*/
/*
【两次握手】
1.输入握手:valid_a和ready_a。(ready_a等待valid_a)
2.输出握手:valid_b和ready_b。(valid_b等待ready_b)
【握手间的相互制约】
输出握手后,ready_a立刻拉高。
*/
/*
ready_a 和 valid_b:
1. 他们是 OUTPUT,需要我们手动去拉高拉低。
2. 他们控制时序,互为判断依据。
*/
//ready_a拉高的情况:1.ready_b拉高时,本模块数据下行,此时立刻允许新的data输入,立刻拉高ready_a。(保证无气泡传输)
// 2.valid_b拉低时,本模块还在接受数据,ready_a持续高。
assign ready_a = (ready_b || !valid_b) ? 1 : 0;
//valid_b拉高拉低的情况: 1.本模块接收完数据时:valid_b拉高。(此时即在等待ready_b握手,进行下行输出)
// 2.valid_b和ready_b握手后,打一拍,valid_b再次拉低,准备接受新的数据。
//【valid_b:指示data_out数据是否有效,即指示“输入是否完成”和“输出是否完成”】
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) valid_b <= 1'b0;
else if(valid_a && ready_a && (cnt == 2'b11)) //1.输入结束,等待握手
valid_b <= 1'b1;
else if(valid_b && ready_b) //2.输出握手后
valid_b <= 1'b0;
end
//数据写入和写出
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
data_out <= 0;
else if((cnt == 2'b00) && valid_a && ready_a && ready_b)
//接收完毕,等待ready_b拉高。ready_b一旦拉高,数据写出到data_out。
//同时开始下一周期的写入。
data_out <= data_in;
else if(valid_a && ready_a) //输入握手:正在接收上游数据,累加
data_out <= data_out + data_in;
//注意:这两个else if不能调换位置!!!【md看了半天】
end
endmodule
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC
这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new
这个问题在这里已经有了答案:Whatdoes`if__FILE__==$0`meaninRuby(6个答案)关闭6年前。我在审查Ruby代码时偶然发现了这个语法。代码是:if__FILE__==$PROGRAM_NAME#somecode...end我想__FILE__是一个变量,可以让我获取我所在文件的名称?但是$PROGRAM_NAME简化了什么?另外,为什么这个if语句是必需的,因为程序可以使用或不使用它?
我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`
我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的
谁能帮我理解下面的表达方式?printf("%3d-%s\n",counter,name)该行打印类似这样的内容6-安装Adobe软件我查阅了资料并阅读了引用资料,但找不到简单的答案,我有点困惑。如果你能给我一个好的引用,请这样做。%3d好的,根据我的理解,%3d是字符数或空格数。请指出解释它的引用资料。%s\n我不知道这是做什么的。我猜\n是一个换行符或类似的东西,但通过查看输出,它似乎并不像那样工作。为什么counter和name变量用逗号分隔?通过查看输出,似乎%3d被替换为counter而%s\n被替换为名称。我不确定它是如何工作的,但我想了解它。
我是ruby语言的新手,所以当我尝试按值对哈希进行排序时我用这个方法排序:movie_popularity.sort_by{|m,p|p}.reverse但是sort方法返回一个数组,而我需要返回一个散列,所以我使用了这个命令:movie_popularity=Hash[*movie_popularity.sort_by{|m,p|p}.reverse.flatten]我的问题是上面一行中的*和flatten是什么意思?谢谢=) 最佳答案 *被称为“splat运算符”;我不确定我能否给你技术上的定义(虽然我相信你会在谷歌的帮助下
我正在尝试实现state_machinegem,在我的rails项目中,我安装了gem,然后我将“state”列添加到我的account_entries模型中:defchangeadd_column:account_entries,:state,:stringend然后在我的account_entries模型中,我添加了状态机初始方法,如下所示:state_machine:state,:initial=>:submitteddoend然后在我看来我显示时间进入状态:account_entry.state但是当我尝试从我的应用程序创建一个account_entry时,我得到了这个错误:p
这个问题在这里已经有了答案:Ruby|=assignmentoperator(4个答案)关闭9年前。在ruby中,|=操作符是做什么的?示例:a=23a|=3333#=>3351