OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6266|回复: 4

[ALTERA] 数字识别demo里的边界读取

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-10-30
在线时间
14 小时
发表于 2020-7-20 14:08:38 | 显示全部楼层 |阅读模式
1金钱
请大家指点一下,先上代码

//确定row_cnt                                                //row_cnt
always @(posedge clk) begin
    if(project_done_flag) begin
        if(ypos == row_border_hgh + 1'b1)
            row_cnt <= row_cnt == num_row - 1'b1 ? 'd0 : row_cnt + 1'b1;
    end
    else
        row_cnt <= 12'd0;
end


//行区域
always @(*) begin
    row_area[row_cnt] = ypos >= row_border_low && ypos <= row_border_hgh;
end

//检测行变化
always @(posedge clk) begin
    if(project_done_flag) begin
        row_cnt_t <= row_cnt;                        //row_cnt=0,第1时钟先 进入 if(row_cnt_t != row_cnt),
        row_d1    <= row_d0 ;                        //第2时钟row_d0取反;row_d1 <= row_d0 ;row_cnt_t <= row_cnt;
        if(row_cnt_t != row_cnt)                //
            row_d0 <= ~row_d0;
    end
    else begin
        row_d0 <= 1'b1;
        row_d1 <= 1'b1;
        row_cnt_t <= 4'hf;
    end
end

assign row_chg = row_d0 ^ row_d1;

//获取数字的行边界
always @(posedge clk) begin
    if(row_chg)                                                                                                                       
        row_border_addr <= (row_cnt << 1'b1) + 1'b1;        //根据row_chg来改变row_border_addr[0]值
    else
        row_border_addr <= row_cnt << 1'b1;
end

always @(posedge clk) begin
    if(row_border_addr[0])                                                                                                               
        row_border_hgh <= row_border_data;                        //上边界
    else
        row_border_low <= row_border_data;                        //下边界        //row_border_data对应相应的row_border_addr
end

always @(posedge clk) begin                                        //信号的多拍处理?
    row_chg_d0 <= row_chg;
    row_chg_d1 <= row_chg_d0;
    row_chg_d2 <= row_chg_d1;
    row_chg_d3 <= row_chg_d2;
end

//检测列变化
always @(posedge clk) begin
    if(project_done_flag) begin                        //根据col_cnt使col_d0产生变化,即导致col_chg变化
        col_cnt_t <= col_cnt;
        col_d1    <= col_d0;
        if(col_cnt_t != col_cnt)
            col_d0 <= ~col_d0;
    end
    else begin
        col_d0 <= 1'b1;
        col_d1 <= 1'b1;
        col_cnt_t <= 4'hf;
    end
end


我理解的行边界获取过程如下:row_cnt由(ypos == row_border_hgh + 1'b1)改变,导致进入检测行变化模块,使row_chg置1,进入获取行边界模块,得到 row_border_hgh。
可是一开始的row_cnt不就是由(ypos == row_border_hgh + 1'b1)得到的么,所以应该是由row_cnt得到 row_border_high,还是反过来呢

最佳答案

查看完整内容[请看2#楼]

行地址为0的时候是下边界,为1是上边界,当记到下边界时,行计数器开始增加以便读取下一排待测数字的行边界
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

132

帖子

0

精华

高级会员

Rank: 4

积分
648
金钱
648
注册时间
2020-4-21
在线时间
83 小时
发表于 2020-7-20 14:08:39 | 显示全部楼层
行地址为0的时候是下边界,为1是上边界,当记到下边界时,行计数器开始增加以便读取下一排待测数字的行边界
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2020-7-21 02:08:51 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-10-30
在线时间
14 小时
 楼主| 发表于 2020-7-21 14:44:36 | 显示全部楼层
932904676xy 发表于 2020-7-21 09:30
行地址为0的时候是下边界,为1是上边界,当记到下边界时,行计数器开始增加以便读取下一排待测数字的行边界

谢谢你,我有一些理解了,不过demo里注释说row_border_addr[0] = 1 时是上边界,我没看懂的是一开始的时候,row_border_high是怎么确定下来的,因为开始的时候
row_border_addr是根据row_chg改变,row_chg 由 row_cnt 改变,row_cnt又是由ypos == row_border_high改变,感觉是个怪圈里呢,哎,阅读能力太差了
回复

使用道具 举报

2

主题

132

帖子

0

精华

高级会员

Rank: 4

积分
648
金钱
648
注册时间
2020-4-21
在线时间
83 小时
发表于 2020-7-22 09:30:40 | 显示全部楼层
理解了就行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表