打印
[verilog]

对一个有32位的reg变量赋值,每次只赋一位怎么实现?

[复制链接]
4823|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
吟游|  楼主 | 2014-3-6 17:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
module IR_OF_MINE(clk,rstn,ir_in,data_out);
input clk;
input rstn;
input ir_in;
output [0:31]data_out;
/****1ms,2ms,3ms分别为接收端0.565ms,1.685,2.25,4.5之间的分界********/
parameter boundary1=18'd5_000;        //1ms
parameter boundary2=18'd10_000;        //2ms
parameter boundary3=18'd15_000;        //3ms
parameter boundary4=18'd25_000;        //4ms
/***********/
reg [0:31]data;
reg [17:0]cnt;
reg [5:0]i;
reg en;
wire en_record;
wire bit_record;
reg bit_read;
/******以下用来产生ir的上升(clr)和下降(record)信号*******/
wire clr;
wire record;
reg ir_f1;
reg ir_f2;
reg ir_f3;
reg ir_f4;
always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        begin
                                ir_f1<=1'b0;
                                ir_f2<=1'b0;
                                ir_f3<=1'b0;
                                ir_f4<=1'b0;
                        end
                else
                        begin
                                ir_f1<=ir_in;
                                ir_f2<=ir_f1;
                                ir_f3<=ir_f2;
                                ir_f4<=ir_f3;
                        end
        end
assign clr=!ir_f2&ir_f1;
assign en_record=!ir_f1&ir_f2;
assign bit_record=!ir_f2&ir_f3;
assign record=!ir_f3&ir_f4;
/*****以下是cnt的计数功能******/
always @(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        cnt<=18'd0;
                else if(cnt==18'd250_000)
                        cnt<=18'd0;
                else if(clr)
                        cnt<=18'd0;
                else if(ir_in)
                        cnt<=cnt+1'b1;
end
always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        en<=0;
                else if(en_record & cnt>boundary3)
                        begin
                                en<=1;
                                data<=32'd0;
                        end
                else if(en_record & cnt>boundary2 & cnt<boundary3)
                        en<=0;
        end
always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        i<=6'd0;
                else if(en & bit_record)
                        begin
                                if(cnt<boundary1)
                                        bit_read<=0;
                                else if(cnt>boundary1 & cnt<boundary2)
                                        bit_read<=1;
                        end
        end
always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        i<=0;
                else
                        begin
                                case(i)
                                        6'd0,6'd1,6'd2,6'd3:
                                        if(record)
                                                begin
                                                        data[i]<=bit_read;
                                                        i<=i+1;
                                                end
                                endcase
                        end
        end
assign data_out=data;
endmodule

相关帖子

沙发
吟游|  楼主 | 2014-3-6 17:10 | 只看该作者
目前问题就出在最后一个always里面:
1、这32个位(实际上是红外遥控接收到的),然后我想将32个位依次写入data里面,可是这样就不行了;错误提示是不能在多个always语句里对同一个reg赋值的;
2、我尝试用数组来搞,可是又提示不能在输出端口用数组,于是放弃了;
3、然后我看《verilog那些事》里的关于串口的模块,就把最后一个always改成了下面的语句
always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                        i<=0;
                else
                        begin
                                case(i)
                                        6'd0,6'd1,6'd2,6'd3:
                                        if(record)
                                                begin
                                                        data[i]<=bit_read;
                                                        i<=i+1;
                                                end
                                endcase
                        end
        end

结果还是不行

使用特权

评论回复
板凳
吟游|  楼主 | 2014-3-6 17:13 | 只看该作者
C:\Users\zhukuai\Desktop\捕获.JPG
这是《verilog那些事》里面的写法,为什么我模仿就不对了?
最后我这个问题该怎么解决?
谢谢各位大神指教!

使用特权

评论回复
地板
吟游|  楼主 | 2014-3-6 17:17 | 只看该作者
这是《verilog那些事》里的代码。

使用特权

评论回复
5
吟游|  楼主 | 2014-3-6 17:18 | 只看该作者
没人自己顶!!

使用特权

评论回复
6
littlebadbay| | 2014-3-6 21:07 | 只看该作者
问题是在data的清零,你把上面always块里面data<=0;
弄到这个always块中。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
吟游 + 1 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝