打印
[verilog]

统计数据中1的个数的问题

[复制链接]
5113|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
verilog程序
module ones(clk,rst,count_1);
input clk;
input rst;
inout reg [3:0]  count_1;
reg [3:0] j;
reg [3:0] i;
reg [3:0] k;




endmodule
test bench程序
`timescale 1 ns/ 1 ps
module ones_vlg_tst();
// constants                                          
// general purpose registers
//reg eachvec;
// test vector input registers
reg clk;
reg [3:0] treg_count_1;
reg rst;
// wires                                               
wire [3:0]  count_1;
reg [3:0] j;
reg [3:0] i;
reg [3:0] k;
reg [3:0] count;
// assign statements (if any)                          
assign count_1 = treg_count_1;
ones i1 (
// port map - connection between master ports and signals/registers   
        .clk(clk),
        .count_1(count_1),
        .rst(rst)
);
initial                                                
begin                                                  
// code that executes only once                        
// insert code here --> begin                          
                                                      
// --> end                                             
$display("Running testbench");                       
end                                                   
initial                                               
// optional sensitivity list                           
// @(event1 or event2 or .... eventn)                  
begin                                                  
// code executes for every event on sensitivity list   
// insert code here --> begin                          
clk=0;
forever
#10 clk=~clk;                                                      
                                          
// --> end                                             
end   
initial                                               
// optional sensitivity list                           
// @(event1 or event2 or .... eventn)                  
begin                                                  
// code executes for every event on sensitivity list   
// insert code here --> begin                          
rst=1;
#15 rst=0;
#15 rst=1;
#1000 $stop;                             
// --> end                                             
end  
always @(posedge clk or negedge rst)   
begin
if(!rst)
        begin
                i<=4'd0;
                count<=4'd0;
                treg_count_1<=4'd0;
       
        end
else
        begin
                treg_count_1<=4'd0;
                for(j=0;j<=3;j=j+1)
                        begin
                                k<=i;
                                if((k&4'b0001)==4'b0001)
                                        begin
                                                treg_count_1<=treg_count_1+1;
                                               
                                       
                                        end
                                if((k&4'b0010)==4'b0010)
                                        begin
                                                treg_count_1<=treg_count_1+1;
                                               
                                       
                                        end
                                if((k&4'b0100)==4'b0100)
                                        begin
                                                treg_count_1<=treg_count_1+1;
                                               
                                       
                                        end
                                if((k&4'b1000)==4'b1000)
                                        begin
                                                treg_count_1<=treg_count_1+1;
                                               
                                       
                                        end
                                end
                count<=treg_count_1;
                i<=(i+1);
                $display("%d,%d\n",treg_count_1,count);
                //treg_count_1<=4'd0;
                //count<=4'd0;
        end
end                                               
endmodule

运行结果:

明显不对。请问高手,哪里出错了?谢谢

使用特权

评论回复
沙发
LcwSwust| | 2023-7-29 11:23 | 只看该作者
你把FPGA当单片机了?
按我的理解,整个always, treg_count_1<=其实只会执行一次,或者最后的一次才有效.
for循环应该是将内部的语句(或电路)进行复制,不是C语言程序的循环.
每个语句,你得想一下它会生成怎样的电路.

使用特权

评论回复
板凳
地瓜patch| | 2023-7-29 18:13 | 只看该作者
单片机思维

使用特权

评论回复
地板
比神乐|  楼主 | 2023-7-29 18:58 | 只看该作者
LcwSwust 发表于 2023-7-29 11:23
你把FPGA当单片机了?
按我的理解,整个always, treg_count_1

谢谢!其实我看苏阳的《那些年,我们拿下了FPGA》。第十一章有一个例子,
对输入的数据中1的个数进行统计。
代码块如下:
always @(posedge clk)
begin
        if(!rst)
                begin
                        count_1=4'd0;
                end
        else
                begin
                        count_14'd0;
                        for(j=0;j<=3;j=j+1)
                                begin
                                        if(data[j])
                                                count_1=count_1+1;
                                        else;
                                end

                end
end
iuziji
我觉得不对,就自己改了一下,谁知没改对。

使用特权

评论回复
5
水管工S| | 2023-8-14 15:19 | 只看该作者
这是什么软件,怎么一直clk=0也能运行

使用特权

评论回复
6
ta1ent| | 2023-8-28 17:14 | 只看该作者
你可以看下综合后生成的电路是什么。现在eda工具都比较智能,其实是会生成for循环展开后的电路的。

使用特权

评论回复
7
比神乐|  楼主 | 2023-10-28 09:49 | 只看该作者
水管工S 发表于 2023-8-14 15:19
这是什么软件,怎么一直clk=0也能运行

有clk上升沿啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

438

主题

3444

帖子

7

粉丝